Utilisation de wp_trim_excerpt pour sortir the_excerpt () hors de la boucle

20

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 messages, il $post->post_excerptest donc vide pour de nombreux messages. Dans le cas où il n'y a pas d'extrait manuel, je voudrais utiliser la fonction intégrée get_the_excerpt (), mais elle n'est pas disponible en dehors de la boucle.

En recherchant la fonction, il semble qu'elle utilise wp_trim_excerpt de wp-includes / formating.php pour créer des extraits à la volée. Je l'appelle comme dans mon code 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 des fonctions intégrées dans la mesure du possible, en gardant 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

Derek Perkins
la source
Vous pouvez essayer d'appeler les filtres d'extrait ...$myvar = apply_filters( 'the_excerpt', $myvar );
t31os

Réponses:

8

wp_trim_excerpt() a un peu de mécanique 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 l'extrait manuel;
  • wp_trim_excerpt() car il n'y a pas d'extrait manuel et en fait un à partir du contenu ou du teaser.

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

En dehors de la boucle, il vaut mieux retirer le code wp_trim_excerpt()et écrire votre propre fonction de découpage.

Rarst
la source
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);
}
Ardee Aram
la source
Vous n'êtes pas obligé de poster une nouvelle réponse, vous pouvez toujours modifier votre ancienne pour inclure de nouvelles informations. Vous pouvez, par exemple, copier le lien vers le code WP de votre première réponse dans celle-ci, puis supprimer votre première réponse.
Jan Fabry
Pour copier / coller là-bas: ajoutez $ raw_excerpt = $ text;
Svetoslav Marinov
1

Voici mon point de vue sur un "trim_excerpt" qui prend l'objet de publication ou un ID de publication comme paramètre.

Évidemment basé sur ce qui est au cœur. Je ne sais pas pourquoi cela (et get_the_author ()) n'ont pas d'équivalents 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);
    }
Tom Auger
la source
0

+1 à Rast. Il est très étrange qu'il n'y ait rien de tel que get_the_excerpt ($ post-> ID), alors que cela devrait être assez évident. 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(']]>', ']]>', $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 sur 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 qu'ils pensaient. Mais à partir d'ici, remplacez get_the_content par $ text dans votre propre my_excerpt, et il devrait se comporter de la même manière.

Ardee Aram
la source
azure_ardee : envisagez d'utiliser wp_trim_words ()
0

La fonction get_the_content () retournerait 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);
}

la source
0

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

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
dpruth
la source
Et le contenu HTML? Comment cela traitera-t-il des tags? l'extrait supprime également les balises html et les shortcodes. que faire si les premiers mots de l'extrait contiennent une image? Cela cassera probablement votre mise en page.
brett