apply_filters () et the_excerpt donnent des résultats inattendus

10

J'ai l'impression que je dois manquer quelque chose d'assez évident, ici, mais je n'arrive pas à faire coopérer WordPress.

Je génère des balises Facebook OG avec une fonction. Tout fonctionne bien, sauf l'extrait.

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

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

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

Cela me donne le message complet, avec un contenu au format HTML. D'accord, ça doit être faux. J'ai donc essayé la prochaine idée logique:

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

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

OK pas de problème. Sautons toutes les choses fantaisistes et allons simplement pour l'entrée coupée:

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

Pas de changement.

Donc, 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 WP pour trouver comment cela 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 basées sur 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 de la boucle sans créer de nouvelle boucle?
  3. Suis-je fou?

Merci d'avance pour avoir regardé. Je suis assez perplexe, ici.

jlengstorf
la source
get_the_excerpt()n'est plus obsolète, seul le paramètre supplémentaire qui lui était transmis n'est plus utilisé.
Milo
Désolé, c'est ce que je voulais dire. Merci de clarifier.
jlengstorf
Tu es fou! . . . comme je suis lol
pythonian29033

Réponses:

16

Il s'avère que la réponse était 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 n'est 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.

jlengstorf
la source
1
Ah, il n'était pas clair pour moi que vous recherchiez uniquement l'opération de texte (pas la récupération depuis DB).
hakre
Pas de soucis. J'ai toujours peur de ne pas avoir de sens lorsque je pose des questions. Je me tirais de la base de données, mais je ne voulais pas ouvrir ensemble « utre boucle depuis que j'ai des choses comme get_the_title($post->ID)disponibles. La dernière ligne de code était$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf
Je me sens vraiment stupide de demander cela, mais comment appelez-vous ce nouveau filtre? Je l'ai essayé au fur $content = apply_filters( 'rw_trim_excerpt', $content );et à mesure $content = rw_trim_excerpt($content);, mais aucun de ceux-ci n'a fonctionné (l'ancien n'a pas coupé la sortie et le dernier a produit une erreur).
Eric K
2
@QuantumDynamix Ceci est conçu pour modifier la get_the_excerptmanipulation à mimer the_excerpt, de sorte que vous pouvez appeler: apply_filters('get_the_excerpt', $content);.
jlengstorf
phew! gentil du point de vue d'un wpress noob, merci
pythonian29033
1

Essayer:

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

Voir: get_postCodex pour tous les membres de retour disponibles.

hakre
la source
4
Cela revient vide si aucun extrait n'a été entré pour le message. J'ai besoin d'imiter les actions de get_the_excerpt () (en créant un extrait s'il n'en existe pas).
jlengstorf
L'application du filtre ne fera pas cela, donc vous posez la mauvaise question. Je ne sais pas pourquoi vous cherchez un extrait s'il n'y en a pas. get_the_excerpt()ne mime pas que, vérifiez la source, il accède uniquement à la variable membre $postdont est post_excerpt. Voir aussi le lien codex dans la réponse.
hakre
3
À partir de l'entrée du Codex the_excerpt: "il affichera un extrait automatique qui fait référence aux 55 premiers mots du contenu de l'article." Je cherche à imiter ce comportement en dehors de la boucle.
jlengstorf
Eh bien, créez une deuxième boucle temporairement et interrogez ce fichier par son identifiant, puis probablement pour une solution rapide. Voir Boucles secondaires - codex.wordpress.org/Function_Reference/…
hakre
1
Merci pour le lien. Je savais que je pouvais mettre en place une boucle supplémentaire, mais cela semble exagéré. Ma solution consistait à ajouter un filtre. Je le vois comme un peu d'huile de coude maintenant pour beaucoup moins de code plus tard.
jlengstorf
0

Vous pouvez utiliser ma fonction personnalisée pour filtrer le contenu (il s'agit de NARGA Framework )

  • Si le message contient un extrait personnalisé, affichez-le à la place du contenu
  • Générer automatiquement un extrait du contenu si le post n'a pas de cerpt personnalisé
  • Découpage automatique de shortcode, code HTML, suppression [...], ajout de texte "Lire la suite" (traduisible)

        /**
        * 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');
Narga
la source