做过wordpress主题朋友也许会碰到过这样的问题,那就是使用wordpress默认的the_excerpt()函数的时候,无法对长度进行截取,输出的是过滤了html代码的全文内容。并不达能到我们想要的效果,而在英文下,却能正常地截取得到55个单词长度!
在看过了wordpress的源代码中the_excerpt函数的代码后,终于明白了其中的原因了! 先看一下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);
$text = strip_tags($text);
$excerpt_length = apply_filters(‘excerpt_length’, 55);
$excerpt_more = apply_filters(‘excerpt_more’, ‘ ‘ . ‘[…]’);
$words = preg_split(“/[\n\r\t ]+/”, $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(‘ ‘, $words);
$text = $text . $excerpt_more;
} else {
$text = implode(‘ ‘, $words);
}
}
return apply_filters(‘wp_trim_excerpt’, $text, $raw_excerpt);
注意到问题所在了吗?代码中的$test = implode(‘ ‘, $words);可以知道系统是使用空隔去对对数字进行控制的,英文上每一个单词之间都会有一个空隔,而我们的中文却是没有的,这就是问题所在!
知道了问题的所在,那解决起来就容易很多了,既然中文的字与字之间是没有空隔可以使用于分隔,那就改变一下,改用使用字符来统计长度了,一个中文点两个字符长度!
很幸运,wordpress有一个filter可以很方便地实现中文长度的处理,把下面的代码放到主题下的functions.php文件中:

把代码中的200这个数字改为你想要的长度即可,数值越大,长度越长!

本文转自:https://site.douban.com/133302/widget/forum/10135832/discussion/48332285/

对于本文的补充

我测试之后发现,文中提到的截取指定字符长度的方法, 对于英文post的时候,有时候会把一个英文单词截断。 不过,在不做任何代码改动的情况下, 写中文post记得加上摘要就好了。首页中文就能只显示摘要了。暂时的权宜之策吧。再补充: 如果视wordpress安装的中文,好像the_excerpt()函数修改了对与中文处理木有问题,完美截取, 不知中文版处理处理英文文章的时候是否有问题,有待检验。 但是不好的就是首页只显示摘要,没有read more 之类的超链接,让人第一感觉文章就结束了。有待研究提高。

还有一点,默认的trim_excerpt 函数只是简单的代换成[…], 这里需要改成read more……超链接的形式。 需要修改一下wp_include文件夹下formating.php

找到$excerpt_more = apply_filters( ‘excerpt_more’, ‘***’); 这里***就是要修改的部分,

替换为:<a href=”‘. get_permalink($post->ID) . ‘”> Read More…</a>  

或者添加函数在模板文件夹下的functions.php

// Replaces the excerpt “Read More” text by a link
function new_excerpt_more($more) {
       global $post;
    return ‘<a class=”moretag” href=”‘. get_permalink($post->ID) . ‘”> Read more…</a>’;
}
add_filter(‘excerpt_more’, ‘new_excerpt_more’);

 

News Reporter
Dr. Lu

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Skip to toolbar