在 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文件中
*/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 主题中的应用实例
站长帮使用的是 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
‘, mb_substr( $output, 0, 50 ) . ‘…’, get_permalink(), __( ‘Read more’, ‘generatepress’ ) ); } return $output; } add_filter( ‘get_the_excerpt’, ‘zhanzhangb_filter_chinese_excerpt’ );
扩展资料:PHP mb_substr 函数
本站提供免费SSL证书申请和外贸网站模板服务,有需要请联系:Renqigroup