web-dev-qa-db-fra.com

Utilisation de wp_trim_excerpt pour obtenir the_excerpt () en dehors de la boucle

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

En traquant la fonction, on dirait qu’elle utilise wp_trim_excerpt 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.

http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt?version=3.0&file=wp-includes/formatting.php

20
Derek Perkins

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 vous éviterez de créer votre propre fonction de comptage de mots.

http://codex.wordpress.org/Function_Reference/wp_trim_words

21
jamesc

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() recherche 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 rognage.

8
Rarst

Mettre à 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);
}
6
Ardee Aram

Voici mon point de vue sur un "trim_excerpt" qui prend l'objet de publication 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);
    }
1
Tom Auger

En utilisant les réponses d’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 pour définir des descriptions OpenGraph. Alors j'ajoute juste:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
0
dpruth

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 bien 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(']]>', ']]&gt;', $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);
}
0
user4742

+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:

http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php

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(']]>', ']]&gt;', $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 manière similaire.

0
Ardee Aram