在 WordPress 中,一些主题或插件会提供自定义显示摘录字数的选项,但对于中文网站而言,这些选项有时候形同虚设。设置的限制字数是不准确的,这是为什么呢?如何解决这个问题,本文将给出完整解决方案。
get_the_excerpt() 函数
该函数会生成完整帖子内容的精简版本,一般的用来过滤摘录。如果此函数在 The Loop 之外使用并且帖子没有自定义摘录,则此函数将使用wp_trim_excerpt()生成摘录。
任何主题和插件,如果符合 WordPress 编码规范的话,都会用 get_the_excerpt() 函数来过滤文章摘要。
在执行 get_the_excerpt() 函数时,还会应用excerpt_length过滤器来限制摘录的长度(默认55个字)。
如果主题或插件修改了默认值,则输出的摘录长度也会改变。不过中文和英语不同,一个是字符语言,一个是字母语言,所以excerpt_length过滤器默认限制摘录的长度对中文而言会不准确。
本文提供的解决方案会用到 WordPress 提供的 apply_filters ( \'get_the_excerpt\', string $post_excerpt , WP_Post $post ) 钩子来解决问题,如果使用的主题或插件的摘录功能不是调用该函数的话,那么下面的解决方案将无法生效,只能联系开发者解决问题。
解决方案
/**
* 过滤摘录,限制中文字符串。
*
* 代码添加到当前主题的functions.php文件中,代码出自813站长大咖
*/
function filter_chinese_excerpt($excerpt){
// 中文摘录限制长度。 在这里设置你的限制字数!
$limit = 130;
// 末尾装饰 ([...])
$decoration = \'[…]\';
// 如果是中文
if(preg_match(\"/\\p{Han}+/u\", $excerpt)){
// 如果更长,则限制在字符串末尾添加装饰。
// 同时返回字符串
if(mb_strlen($excerpt, \'UTF-8\') >= $limit){
return mb_substr($excerpt, 0, $limit, \'UTF-8\') . $decoration;
}else{
return mb_substr($excerpt, 0, $limit, \'UTF-8\');
}
}
return $excerpt;
}
add_filter(\'get_the_excerpt\', \'filter_chinese_excerpt\');
以上代码会检测帖子摘录是不是中文内容,如果是的话,使用 PHP 提供的几个多字节字符串函数。如果不是中文内容,则不影响 WordPress 默认设置。
在 GeneratePress 主题中的应用实例
813站长大咖使用的是 GeneratePress 主题,在主题选项中也有摘录长度的选项,对中文的支持也不友好。所以修改其过滤器后解决问题(以下代码中包含了 GeneratePress 主题的样式)。
function zhanzhangb_filter_chinese_excerpt( $output ) {
global $post;
//检查其是否为汉字
$chinese_output = preg_match_all(\"/\\p{Han}+/u\", $post->post_content, $matches);
if($chinese_output) {
$output = sprintf( \'%1$s <p class=\"read-more-button-container\"><a class=\"button\" href=\"%2$s\">%3$s</a></p>\',
mb_substr( $output, 0, 50 ) . \'...\',
get_permalink(),
__( \'Read more\', \'generatepress\' )
);
}
return $output;
}
add_filter( \'get_the_excerpt\', \'zhanzhangb_filter_chinese_excerpt\' );
扩展资料:PHP mb_substr 函数



