Utiliser wp_trim_excerpt pour obtenir le_excerpt () en dehors de la boucle

19

Je construis un thème qui affichera des extraits sur la page d'accueil pour potentiellement des dizaines de messages. Je n'ai pas d'extraits manuels sur toutes mes publications, donc $post->post_excerpt est vide pour de nombreuses publications. Au cas où il n'y aurait pas d'extrait manuel, j'aimerais utiliser la fonction get_the_excerpt () intégrée, mais elle n'est pas disponible en dehors de la boucle.

En traquant la fonction, on dirait qu’elle utilise wp_trim_excerpt à partir de wp-includes / formatting.php pour créer des extraits à la volée. Je l'appelle dans mon code comme wp_trim_excerpt( $item->post_content ) , mais il renvoie simplement le contenu complet. Est-ce que je fais quelque chose de mal?

Je sais que je peux créer ma propre fonction pour créer un extrait, mais j'aime utiliser les fonctions intégrées autant que possible, tout en maintenant mon code compatible avec d'autres plugins / filtres potentiels.

enlace

    
posée Derek Perkins 14.01.2011 - 11:34

7 réponses

21

Depuis WP 3.3.0, wp_trim_words() est utile si vous pouvez obtenir le contenu pour lequel vous souhaitez générer un extrait. J'espère que cela vous sera utile et que cela vous évitera de créer votre propre fonction de comptage de mots.

enlace

    
réponse donnée jamesc 22.03.2012 - 22:28
8

wp_trim_excerpt() a une mécanique un peu curieuse - si quelque chose lui est transmis, alors il ne fait rien.

Voici la logique de base derrière cela:

  • get_the_excerpt() vérifie la présence d'un extrait manuel;
  • wp_trim_excerpt() intervient s'il n'y a pas d'extrait manuel et en crée un à partir du contenu ou du teaser.

Les deux sont étroitement liés aux variables globales et ainsi à Loop.

En dehors de la boucle, il vaut mieux extraire le code de wp_trim_excerpt() et écrire votre propre fonction de réglage.

    
réponse donnée Rarst 14.01.2011 - 13:01
6

Mise à jour:

Voici un dérivé de wp_trim_excerpt () que j'ai utilisé. Marche parfaitement. Dérivé de Wordpress version 3.0.4

function my_excerpt($text, $excerpt)
{
    if ($excerpt) return $excerpt;

    $text = strip_shortcodes( $text );

    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $text = strip_tags($text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
    if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
    } else {
            $text = implode(' ', $words);
    }

    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
    
réponse donnée Ardee Aram 21.01.2011 - 04:09
1

Voici ma version d'un "trim_excerpt" qui prend l'objet ou un ID de publication en tant que paramètre.

Évidemment basé sur ce qui est dans le noyau. Je ne sais pas pourquoi cela (et get_the_author ()) n’a pas d’équivalent non-boucle.

/**
     * Generates an excerpt from the content, if needed.
     *
     * @param int|object $post_or_id can be the post ID, or the actual $post object itself
     * @param string $excerpt_more the text that is applied to the end of the excerpt if we algorithically snip it
     * @return string the snipped excerpt or the manual excerpt if it exists         
     */
    function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') {
        if ( is_object( $post_or_id ) ) $postObj = $post_or_id;
        else $postObj = get_post($post_or_id);

        $raw_excerpt = $text = $postObj->post_excerpt;
        if ( '' == $text ) {
            $text = $postObj->post_content;

            $text = strip_shortcodes( $text );

            $text = apply_filters('the_content', $text);
            $text = str_replace(']]>', ']]>', $text);
            $text = strip_tags($text);
            $excerpt_length = apply_filters('excerpt_length', 55);

            // don't automatically assume we will be using the global "read more" link provided by the theme
            // $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
            $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
            if ( count($words) > $excerpt_length ) {
                array_pop($words);
                $text = implode(' ', $words);
                $text = $text . $excerpt_more;
            } else {
                $text = implode(' ', $words);
            }
        }
        return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
    }
    
réponse donnée Tom Auger 26.08.2011 - 19:23
0

+1 à Rast. Il est très étrange que get_the_excerpt ($ post- > ID) n'existe pas, alors qu'il devrait être tout à fait évident que ce soit le cas. Quoi qu'il en soit, voici wp_trim_excerpt () dans Wordpress version 3.0.4:

enlace

function wp_trim_excerpt($text) {
1824            $raw_excerpt = $text;
1825            if ( '' == $text ) {
1826                    $text = get_the_content('');
1827    
1828                    $text = strip_shortcodes( $text );
1829    
1830                    $text = apply_filters('the_content', $text);
1831                    $text = str_replace(']]>', ']]>', $text);
1832                    $text = strip_tags($text);
1833                    $excerpt_length = apply_filters('excerpt_length', 55);
1834                    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
1835                    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
1836                    if ( count($words) > $excerpt_length ) {
1837                            array_pop($words);
1838                            $text = implode(' ', $words);
1839                            $text = $text . $excerpt_more;
1840                    } else {
1841                            $text = implode(' ', $words);
1842                    }
1843            }
1844            return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
1845    }

Vous pouvez voir à la ligne 1826 qu’elle est liée à la variable globale $ post via get_the_contents. Et oui, je n'ai aucune idée de ce à quoi ils pensaient. Mais à partir de là, remplacez le contenu de get_the_content par $ text dans votre propre fichier my_excerpt. Il devrait se comporter de la même manière.

    
réponse donnée Ardee Aram 21.01.2011 - 04:01
0

La fonction get_the_content () renvoie le contenu complet si $ more! = 0. Vous devez définir la variable globale $ more sur 0 pour vous assurer que la fonction get_the_content () renvoie un extrait.

Fonction wp_trim_excerpt () modifiée:

function wp_trim_excerpt($text) {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        global $more;
        $tmp = $more;
        $more = 0;
        $text = get_the_content('');
        $more = $tmp;

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $text = strip_tags($text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
        if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
        } else {
            $text = implode(' ', $words);
        }
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
    
réponse donnée user4742 17.04.2011 - 19:36
0

En utilisant les réponses des autres personnes ci-dessus, voici une réponse plus simple qui semble bien fonctionner:

global $post;

$excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID));

if ( $excerpt == '' ) {
    $excerpt = wp_trim_words( $post->post_content, 55 );
}

Je l'utilise dans les balises <meta> d'une fonction permettant de définir des descriptions OpenGraph. Alors je viens d'ajouter:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
    
réponse donnée dpruth 15.09.2016 - 18:42

Lire d'autres questions sur les étiquettes