WordPress : Get_the_excerpt() personnalisé ne fonctionne que sur le premier message

Publié par Jean-Michel le

J’utilise une fonction personnalisée get_the_excerpt dans mon thème. Cela fonctionne parfaitement pour le premier article de la boucle, mais les autres articles utilisent la fonction d’extrait standard. Je ne comprends pas pourquoi?

La fonction personnalisée get_the_excerpt :

function wpse_allowedtags() {
    // Add custom tags to this string
    return '<br>,<b>,<strong>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<h2>,<h3>,<h4>,<h5>';
}

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', function($wpse_excerpt) {
    $raw_excerpt = $wpse_excerpt;

    if ( '' == $wpse_excerpt ) {
        $wpse_excerpt = get_the_content('');
        $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
        $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
        $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt);
        $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());

        $excerpt_word_count = 150;
        $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count);
        $tokens = array();
        $excerptOutput = '';
        $count = 0;

        // Divide the string into tokens; HTML tags, or words, followed by any whitespace
        preg_match_all('/(<[^>]+>|[^<>s]+)s*/u', $wpse_excerpt, $tokens);

        foreach ($tokens[0] as $token) {
            if ($count >= $excerpt_length && preg_match('/[,;?.!]s*$/uS', $token)) {
                // Limit reached, continue until , ; ? . or ! occur at the end
                $excerptOutput .= trim($token);
                break;
            }

            // Add words to complete sentence
            $count++;

            // Append what's left of the token
            $excerptOutput .= $token;
        }

        $wpse_excerpt = trim(force_balance_tags($excerptOutput));

        $excerpt_end = '&nbsp;…&nbsp;<a href="'. esc_url( get_permalink() ) . '">'
                . __('[ weiterlesen ]', 'jankosyk') . '</a>';
        $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);

        $pos = strrpos($wpse_excerpt, '</');
        if ($pos !== false) {
            // Inside last HTML tag
            $wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); // Add read more next to last word
        } else {
            // After the content
            $wpse_excerpt .= $excerpt_more; // Add read more in new paragraph
        }

        return $wpse_excerpt;

    }
    return apply_filters('wpse_custom_wp_trim_excerpt', $wpse_excerpt, $raw_excerpt);
});

La boucle:

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <div class="entry"><?php
        if(is_single() || is_page()) {
            ?><h2><?php the_title(); ?></h2><?php
            the_content();
        } else { ?>
            <h2><a href="<?php the_permalink() ?>"><?php
                the_title();
            ?></a></h2><?php
            print get_the_excerpt();
        }
    ?></div><?php
endwhile; ?>

Le site Web peut être trouvé ici: https://jankosyk.de/

Aucune suggestion?

Merci!


Mise à jour:

Comme je n’utilise pas l’extrait de l’écran d’édition de message et que je veux juste raccourcir le texte du message, je me suis retrouvé avec la fonction suivante ignorant complètement chaque extrait généré automatiquement :

function wpse_allowedtags() {
    // Add custom tags to this string
    return '<br>,<b>,<strong>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<h2>,<h3>,<h4>,<h5>';
}
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', function() {
    $wpse_excerpt = get_the_content('');
    $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
    $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
    $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt);
    $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());

    $excerpt_word_count = 150;
    $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count);
    $tokens = array();
    $excerptOutput = '';
    $count = 0;

    // Divide the string into tokens; HTML tags, or words, followed by any whitespace
    preg_match_all('/(<[^>]+>|[^<>s]+)s*/u', $wpse_excerpt, $tokens);

    foreach ($tokens[0] as $token) {
        if ($count >= $excerpt_length && preg_match('/[,;?.!]s*$/uS', $token)) {
            // Limit reached, continue until , ; ? . or ! occur at the end
            $excerptOutput .= trim($token);
            break;
        }

        // Add words to complete sentence
        $count++;

        // Append what's left of the token
        $excerptOutput .= $token;
    }

    $wpse_excerpt = trim(force_balance_tags($excerptOutput));

    $excerpt_end = '&nbsp;…&nbsp;<a href="'. esc_url( get_permalink() ) . '">'
            . __('[ weiterlesen ]', 'jankosyk') . '</a>';
    $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);

    $pos = strrpos($wpse_excerpt, '</');
    if ($pos !== false) {
        // Inside last HTML tag
        $wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); // Add read more next to last word
    } else {
        // After the content
        $wpse_excerpt .= $excerpt_more; // Add read more in new paragraph
    }

    return $wpse_excerpt;
});

Solution n°1 trouvée

Une possibilité serait d’écrire simplement votre filtre personnalisé pour qu’il s’exécute plus tard que la priorité par défaut de « 10 » (qui correspond à la fonction « wp_trim_excerpt »).

Le filtre get_the_excerpt transmet l’extrait ET l’objet post. Vous devriez donc pouvoir exécuter votre filtre à une priorité ultérieure et utiliser la valeur d’extrait de l’objet post au lieu de l’extrait passé, car cela a déjà traversé un autre filtre.

J’ai changé votre original de la fonction anonyme comme vous l’aviez juste pour plus de clarté sur les valeurs de priorité et d’argument.

// Running this filter at priority 20 so it comes later than wp_trim_excerpt()
add_filter( 'get_the_excerpt', 'my_later_excerpt', 20, 2 );
function my_later_excerpt( $possibly_filtered_excerpt , $post_obj ) {

    /*
     * Rather than change every instance of $wpse_excerpt in your
     * function, I changed the argument to $possibly_filtered_excerpt
     * and ignored it. Then set the $wpse_excerpt value to the
     * excerpt contained in the post object ($post_obj->post_excerpt)
     */
    $wpse_excerpt = $post_obj->post_excerpt;

    $raw_excerpt = $wpse_excerpt;

    if ( '' == $wpse_excerpt ) {
        $wpse_excerpt = get_the_content('');
        $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
        $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
        $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt);
        $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());

        $excerpt_word_count = 150;
        $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count);
        $tokens = array();
        $excerptOutput = '';
        $count = 0;

        // Divide the string into tokens; HTML tags, or words, followed by any whitespace
        preg_match_all('/(<[^>]+>|[^<>s]+)s*/u', $wpse_excerpt, $tokens);

        foreach ($tokens[0] as $token) {
            if ($count >= $excerpt_length && preg_match('/[,;?.!]s*$/uS', $token)) {
                // Limit reached, continue until , ; ? . or ! occur at the end
                $excerptOutput .= trim($token);
                break;
            }

            // Add words to complete sentence
            $count++;

            // Append what's left of the token
            $excerptOutput .= $token;
        }

        $wpse_excerpt = trim(force_balance_tags($excerptOutput));

        $excerpt_end = '&nbsp;…&nbsp;<a href="'. esc_url( get_permalink() ) . '">'
                . __('[ weiterlesen ]', 'jankosyk') . '</a>';
        $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);

        $pos = strrpos($wpse_excerpt, '</');
        if ($pos !== false) {
            // Inside last HTML tag
            $wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); // Add read more next to last word
        } else {
            // After the content
            $wpse_excerpt .= $excerpt_more; // Add read more in new paragraph
        }

        return $wpse_excerpt;

    }
    return apply_filters('wpse_custom_wp_trim_excerpt', $wpse_excerpt, $raw_excerpt);
}

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *