WordPress : Get_the_excerpt() personnalisé 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(']]>', ']]>', $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 = '
<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(']]>', ']]>', $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 = '
<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(']]>', ']]>', $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 = '
<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 commentaire