apply_filters () et the_excerpt donnent des résultats inattendus

10

J'ai l'impression qu'il me manque quelque chose d'évident, mais je n'arrive pas à faire en sorte que WordPress coopère.

Je génère des tags Facebook OG avec une fonction. Tout fonctionne bien, à l'exception de l'extrait.

Depuis la dépréciation de get_the_excerpt($post->ID) , existe-t-il un autre moyen de créer un extrait sans avoir à créer une toute nouvelle boucle? Cela me semble excessif.

Mon premier instinct a été d'utiliser apply_filters() :

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

Cela me donne l'intégralité du message, avec un contenu au format HTML. Ok, doit avoir tort. J'ai donc essayé la prochaine idée logique:

$description = apply_filters('get_the_excerpt', get_post($post->ID)->post_content);

Pas de dés. Maintenant, il n'y a pas de HTML, mais c'est toujours le post complet (ce qui est vraiment déroutant).

D'accord, pas de problème. Sautons tous les trucs fantaisistes et passons à l’entrée réduite:

$description = wp_trim_excerpt(get_post($post->ID)->post_content);

Pas de changement.

Alors, ma question est la suivante: que diable se passe-t-il? Y a-t-il quelque chose qui me manque, ici?

Je suis entré dans le noyau de WP pour trouver comment the_excerpt() fonctionne et il semble être identique à mon appel:

/**
 * Display the post excerpt.
 *
 * @since 0.71
 * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

J'ai quelques questions à propos de mes conclusions:

  1. Pourquoi le filtre ne s'applique-t-il pas comme prévu?
  2. Existe-t-il un moyen d'extraire l'extrait en dehors de la boucle sans créer de nouvelle boucle?
  3. Suis-je fou?

Merci d'avance de votre visite. Je suis assez perplexe, ici.

    
posée jlengstorf 31.12.2011 - 18:23

3 réponses

15

La réponse était en wp_trim_excerpt() .

Il est défini dans wp-includes/functions.php:1879 :

/**
 * Generates an excerpt from the content, if needed.
 *
 * The excerpt word amount will be 55 words and if the amount is greater than
 * that, then the string ' [...]' will be appended to the excerpt. If the string
 * is less than 55 words, then the content will be returned as is.
 *
 * The 55 word limit can be modified by plugins/themes using the excerpt_length filter
 * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter
 *
 * @since 1.5.0
 *
 * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
 * @return string The excerpt.
 */
function wp_trim_excerpt($text = '') {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        $text = get_the_content('');

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Ainsi, tout texte transmis ne sera pas traité; cela ne fonctionne que s'il est appelé avec un paramètre vide.

Pour résoudre ce problème, j'ai ajouté un filtre rapide à mon thème qui résout le problème:

/**
 * Allows for excerpt generation outside the loop.
 * 
 * @param string $text  The text to be trimmed
 * @return string       The trimmed text
 */
function rw_trim_excerpt( $text='' )
{
    $text = strip_shortcodes( $text );
    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    return wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
add_filter('wp_trim_excerpt', 'rw_trim_excerpt');

C'est un peu redondant, mais je l'aime mieux que d'ouvrir de nouvelles boucles chaque fois que je veux générer un extrait.

    
réponse donnée jlengstorf 01.01.2012 - 19:12
1

Essayez:

   get_post($post->ID)->post_excerpt
                        ^^^^^^^^^^^^

Voir: get_post Codex pour tous les éléments disponibles. membres de retour.

    
réponse donnée hakre 31.12.2011 - 19:09
0

Vous pouvez utiliser ma fonction personnalisée pour filtrer le contenu (à partir de NARGA Framework )

.
  • Si le message a un extrait personnalisé, affichez-le plutôt le contenu
  • Générer automatiquement un extrait du contenu si la publication n'a pas de message personnalisé
  • Découper automatiquement le shortcode, le code HTML, supprimer [...], ajouter le texte "Lire la suite" (à traduire)

        /**
        * Auto generate excerpt from content if the post hasn't custom excerpt
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  The maximium words of excerpt generating from content
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # If is the home page, an archive, or search results
        if(is_front_page() || is_archive() || is_search()) :
            global $post;
        $content = $post->post_excerpt;
        $content = strip_shortcodes($content);
        $content = str_replace(']]>', ']]>', $content);
        $content = strip_tags($content);
        # If an excerpt is set in the Optional Excerpt box
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # If no excerpt is set
        else :
            $content = $post->post_content;
            $excerpt_length = 50;
            $words = explode(' ', $content, $excerpt_length + 1);
        if(count($words) > $excerpt_length) :
            array_pop($words);
            array_push($words, '...<p><a class="more-link" href="' . get_permalink() . '" title="' . the_title_attribute('echo=0') . '">  ' . __( 'Read more &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Make sure to return the content
        return $content;
        }
        // Add filter to the_content
        add_filter('the_content', 'narga_excerpts');
    
réponse donnée Narga 15.05.2013 - 15:49

Lire d'autres questions sur les étiquettes