虽然使用mb_substr
截断文字来获得wordpress很方便,但看起来实在太呆板了,显得很傻。如果使用wordpress自带的excerpt()
配合excerpt_length
来自动显示摘要,当里面有英文的时候,好像字数上的控制很难把握,而且遇到短代码貌似就不输出摘要了。
可是我很不喜欢用more标签啊。小骆驼商队的Betty童鞋给我们整了一个 适合中文的 WordPress 摘要插件 东西很好用,可以像more标签那样输出摘要,可是不适合我的主题——她将single页面使用的excerpt也给摘要了。于是我给改了改,改的更简单了。
if ( !function_exists('mb_strlen') ) { function mb_strlen ($text, $encode) { if ($encode=='UTF-8') { return preg_match_all('%(?: [\x09\x0A\x0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )%xs',$text,$out); }else{ return strlen($text); } } } if (!function_exists('mb_substr')) { function mb_substr($str, $start, $len = '', $encoding="UTF-8"){ $limit = strlen($str); for ($s = 0; $start > 0;--$start) {// found the real start if ($s >= $limit) break; if ($str[$s] <= "\x7F") ++$s; else { ++$s; // skip length while ($str[$s] >= "\x80" && $str[$s] <= "\xBF") ++$s; } } if ($len == '') return substr($str, $s); else for ($e = $s; $len > 0; --$len) {//found the real end if ($e >= $limit) break; if ($str[$e] <= "\x7F") ++$e; else { ++$e;//skip length while ($str[$e] >= "\x80" && $str[$e] <= "\xBF" && $e < $limit) ++$e; } } return substr($str, $s, $e - $s); } } function wp_new_excerpt($text){ global $post; $text = $post->post_excerpt;//如果摘要有内容直接用摘要 if ($text == ''){ $text = $post->post_content; $text = strip_shortcodes($text); $text = str_replace(']]>', ']]>', $text); $text = trim($text); $more_position = stripos ($text, "<!--more-->");//兼容more截断 if ($more_position !== false) { $text = substr ($text, 0, $more_position); return $text; } $length = '160';//摘要输出的长度 $allowd_tag = '<p><h1><h2><h3><h4><h5><h6><blockquote><a>';//忽略的html标签 $strip_short_post = true; if(($length > mb_strlen(strip_tags($text), 'utf-8')) && ($strip_short_post === true) ) { $text = strip_tags($text, $allowd_tag); $text = trim($text); return $text; } $text = strip_tags($text, $allowd_tag); $text = trim($text); $num = 0; $in_tag = false; for ($i=0; $num<$length || $in_tag; $i++) { if(mb_substr($text, $i, 1) == '<') $in_tag = true; elseif(mb_substr($text, $i, 1) == '>') $in_tag = false; elseif(!$in_tag) $num++; } $text = mb_substr ($text,0,$i, 'utf-8'); $text = trim($text); return $text; } return $text; } remove_filter('get_the_excerpt', 'wp_trim_excerpt'); add_filter('get_the_excerpt', 'wp_new_excerpt');
前面两个是重新定义 mb_strlen
和 mb_substr
函数,可以忽略,摘要输出函数是 wp_new_excerpt
。
这个函数的使用和betty同学的有些区别,修改过的函数只对主题模板中的 the_excerpt()
起作用,对 the_content()
不起作用,所以要输出摘要的地方都得换成 the_excerpt()
。
修改后的代码不是插件形式,使用时丢在functions.php文件里就行。
THE END
看起来很霸道啊
从别人插件改过来的,有许多不如意,自己又搞不定。