wordpress首页显示文章摘要的方法

WordPress有一个不好的地方,首页、分类和其它归档页,文章默认都是全文输出排列的。遇到文章长一些且夹带着大量图片的,不仅页面速度打开慢,也不容易快速找到自己感兴趣的内容。
下面介绍四种WordPress显示文章摘要的方法:

1 使用WordPress自带摘要功能
这种方法显示效果不错,不足就是写文章时需单独设置摘要。虽然是麻烦了点,但灵活性好。
点击文章编辑页面右上角的“显示选项”,勾选里面的“摘要”选项,以后在写文章时单独写上摘要内容即可。
文章发布后你可能会看到在首页还是全文输出,而在分类、标签等归档页则是摘要显示,我们可以使用以下方法解决。
在WordPress后台“外观”——“编辑”里,点击修改loop.php文件,大约在137行左右,找到并修改下面这句,添加一个首页适用判断,红色字体为添加部分。
if ( is_archive() || is_search() || is_home() ) : // Only display excerpts for archives and search.
设置后首页就和其它归档页一样摘要显示了。

2 插入“更多”分隔标签
这也算是WordPress自带的设置摘要方法之一了,只需在文章编辑时在截取摘要文字后面,插入“更多”分隔标签,点击上面编辑器“更多”分隔图标,或者也可以直接写入标签语句“<!–more–>”。
设置后在首页及其它归档页面就类似摘要显示了,在摘要后面会自动加上一个“继续阅读 →”链接。不过这个链接细看你可能会发现,后面加上了#more-id,它是一个内容跳转锚点链接,点击会转到该段摘要内容后面继续阅读。
要不要去掉这个锚点跳转看个人喜好。如果要去掉,在WordPress后台“外观”——“编辑”里,点击修改functions.php文件,复制添加以下代码即可。代码意思是利用WordPress the_content_more_link的filter过滤,通过它再加上正则表达式,把链接中#more-id形式的字符串替换为空。
function remove_more_jump_link($link) {
return preg_replace(‘/#more-\d+/i’,”,$link);
}
add_filter(‘the_content_more_link’, ‘remove_more_jump_link’);

3 使用摘要插件
WordPress虽然有些地方不符合我们的使用,但好在插件丰富,自动设置文章摘要的插件也不少,下面介绍几款比较好用的。
1、WP-UTF8-Excerpt:支持多字节语言(如中文),不会产生乱码并保留格式。
2、WP-Posts Auto Cutter:采用UTF-8方式截取,不会中文乱码并保留摘要格式。这个插件作者没有提交到WordPress,下载只能去作者主页:http://blog.netdll.com/?p=1276(网址被墙)。
3、Limit Posts Automatically:主要是用于英文站,中文使用会产生错误。

4 修改主题index.php文件
这是我使用的方法。
4.1 打开你正在使用主题的文件夹,找到相关文件:
WP4.x的2017模板是index.php文件或者template-parts/post/content.php文件;
WP5.0的2019模板是 template-parts/content/content.php 文件。
找到以下代码:
the_content(__(’(more…)’)); 或者 the_content();
将它修改为:
if ( !is_single() ) {
the_excerpt();
} else {
the_content(__(’(more…)’));//或者 the_content();
}

保存后文章即可自动截取摘要,不过缺点是摘要里的格式会消失,如文字加粗,字体颜色等。

4.2 控制摘要显示的字数
4.2.1 使用 php 自带的 mb_strimwidth 函数
功能强大,需要php支持。
我用的这种。因为这个不需要修改wordpress的代码,只需修改模板。
用另一个代码替换 the_excerpt() 函数,直接截断文章内容,可以设定要显示多少字数的内容。
将4.1中的 the_excerpt() 替换成
echo mb_strimwidth(strip_tags(apply_filters( 'the_content' , $post->post_content)),0,200, " ...... " );
注意,上面的200是你想显示的字数。

[2018-12-8补充]
在WP5.0的2019模板中,除了按上面步骤修改content.php文件外,还要修改 template-parts/content/content-excerpt.php 文件。否则在显示分类、tag时字数还是很多。
找到以下代码:
the_excerpt();
将它修改为:
if ( !is_single() ) {
echo mb_strimwidth(strip_tags(apply_filters( 'the_content' , $post->post_content)),0,200, " ...... " );
} else {
the_excerpt();
}

[2018-12-8补充over]

4.2.2 利用wp_trim_words()函数
这个函数是wordpress自带的函数,主要功能就是用来限制输出字数的。用它配合get_the_XXXX()函数可以调用并限制不同文字的字数。
echo wp_trim_words( get_the_content(), 100 ); // 文章内容,限制100个字符,溢出用…
echo wp_trim_words( get_the_excerpt(), 20 ); // 文章摘要,限制20个字符
echo wp_trim_words( get_the_title(), 10 ); // 文章标题,限制10个字符
这个函数只起到限制用作,但因里面的get_the_XXXX()函数需要在循环中才能使用,所以导致整个函数都在循环中使用。

4.2.3 利用强大的插件
WP CN Excerpt插件不错。

4.2.4 修改formatting.php文件
在程序的wp-includes文件夹里寻找formatting.php文件,然后找到这行代码:
$excerpt_length = apply_filters(‘excerpt_length’, 55);$excerpt_more = apply_filters(‘excerpt_more’, ‘ ‘ . ‘[…]’);
这里的55就是显示的字数字符数量,可以通过修改这个数字来达到目的。

4.2.5 修改functions.php文件
4.2.5.1 在functions.php中自定义函数
wordpress 内置函数the_excerpt()是个使用频率较高的函数,它是用来获取当前文章摘要的,以[…]结尾,如果在文章中没有编辑内容摘要字段,则默认截取文章的前55个字的内容,默认截取的字段去掉HTML标签和图形,并且一定要在循环内使用。
这个标签没有任何的参数,直接使用即可。但有时候我们会不习惯用[…]结尾,或者感觉 55 个字符太少。这就需要我们来调整下functions.php文件,重新定义下函数了。
控制摘要的字数:
function new_excerpt_length($length) {
return 150;
}
add_filter(“excerpt_length”, “new_excerpt_length”);

添加自定义结尾:
function new_excerpt_more($more) {
global $post;
return ” <a href='”. get_permalink($post->ID) . “‘>阅读更多</a>”;
}
add_filter(“excerpt_more”, “new_excerpt_more”);

更改摘要末尾的默认显示样式:
function new_excerpt_more($excerpt) {
return str_replace(“[…]”, “…”, $excerpt);
}
add_filter(“wp_trim_excerpt”, “new_excerpt_more”);

4.2.5.2 在functions.php中自定义函数
在functions.php最后加入以下代码:
function excerpttitle($max_length) {
$title_str = get_the_title();
if (mb_strlen($title_str,’utf-8′) > $max_length ) {
$title_str = mb_substr($title_str,0,$max_length,’utf-8′).’…’;
}
return $title_str;
}
这就定义了一个函数,如何调用呢?在你想要使用字数限制的地方,将原有的
the_title();
替换成
echo excerpttitle(20);
这个方法有个缺陷,就是把一个字母和一个汉字都当做了一个字符,结果就是一篇拥有大于20个字母的英文标题也会被限制为20个字母,而大于20个汉字的中文标题被限制为20个汉字!

Leave a comment

Your email address will not be published. Required fields are marked *