WordPress 中文网站的摘录字数统计不准确怎么解决?

在 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

%3$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