У меня есть эта настраиваемая wp_trim_words()
которая дает мне отрывки из 20 слов, и по большей части работает отлично. За исключением некоторых причин, на должностях, содержащих списки, он выводит более 20 слов. ( См. Сообщения внизу этой страницы. ) Как я могу это исправить? Я попытался удалить <ul>,<ol>,<li>,
из function insight_allowedtags()
но ничего не сделал.
В идеале я хотел бы сделать вывод пользовательского выдержки не менее 20 слов и заканчиваться в конце предложения независимо от того, содержит ли сообщение список.
Это пользовательская функция, которую я использую ( как предложено в этом сообщении ):
// Custom Excerpt for Insights Posts on Insights Page & Category Pages function insight_allowedtags() { // Add custom tags to this string return '<script>,<style>,<span>,<ul>,<ol>,<li>,<a>,<p>'; } if ( ! function_exists( 'insight_custom_wp_trim_excerpt' ) ) : function insight_custom_wp_trim_excerpt($insight_excerpt) { global $post; $raw_excerpt = $insight_excerpt; if ( '' == $insight_excerpt ) { $insight_excerpt = get_the_content(''); $insight_excerpt = strip_shortcodes( $insight_excerpt ); $insight_excerpt = apply_filters('the_content', $insight_excerpt); $insight_excerpt = str_replace(']]>', ']]>', $insight_excerpt); $insight_excerpt = strip_tags($insight_excerpt, insight_allowedtags()); /*IF you need to allow just certain tags. Delete if all tags are allowed */ //Set the excerpt word count and only break after sentence is complete. $excerpt_word_count = 20; $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', $insight_excerpt, $tokens); foreach ($tokens[0] as $token) { if ($count >= $excerpt_word_count && 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; } $insight_excerpt = trim(force_balance_tags($excerptOutput)); // $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . sprintf(__( 'Read more about %s »', 'wpse' ), get_the_title()) . '</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 $insight_excerpt .= $excerpt_end; /*Add read more in new paragraph */ return $insight_excerpt; } return apply_filters('insight_custom_wp_trim_excerpt', $insight_excerpt, $raw_excerpt); } endif; remove_filter('get_the_excerpt', 'wp_trim_excerpt'); add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt', 'blog_custom_wp_trim_excerpt', 'event_custom_wp_trim_excerpt', 'insight_custom_wp_trim_excerpt');
Как насчет использования этой функции в functions.php:
function new_excerpt_length($length) { return 20; } add_filter('excerpt_length', 'new_excerpt_length');
А затем получить его, добавив <?php the_excerpt()?>
шаблон php?
ИЛИ:
<?php $string = get_the_excerpt(); if (strlen($string) <=20) {echo '' . $string . '';} else {echo '' . substr($string, 0, 20) . '...';}?>
В этом случае 20 – это символы