web-dev-qa-db-fra.com

Personnalisé get_the_excerpt () ne fonctionne que sur le premier message

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 et que je veux juste raccourcir le texte de l'article, je me suis retrouvé avec la fonction suivante en ignorant complètement tous les extraits générés 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;   
});
1
op_garfield

Une possibilité serait simplement d'écrire votre filtre personnalisé pour qu'il soit exécuté plus tard que la priorité par défaut de "10" (c'est ce à quoi la fonction "wp_trim_excerpt" est exécutée).

Le filtre get_the_excerpt transmet l'extrait ET l'objet post. Vous devriez donc pouvoir exécuter votre filtre avec une priorité ultérieure et utiliser la valeur d'extrait de l'objet post au lieu de l'extrait transmis, car celui-ci est déjà passé par un autre filtre.

J'ai changé votre fonction originale de la fonction anonyme, comme vous l'aviez juste pour clarifier 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);
}
0
butlerblog