乌徒帮技术范WordPressWordPress开发 › wordpress首页显示摘要的几种方法

wordpress首页显示摘要的几种方法

分类:WordPress开发

wordpress在首页默认情况下是将最新发布的文章全文输出,一字不漏,连图片也不放过,如果您的首页由于文章多,单篇文章太长而导致页面太长妨碍浏览的话,肯定希望将首页的文章稍微瘦身,让读者获取精华,从而节约首页界面。本文将介绍一些方法,为您解决这个问题。

方法一:在文章添加时使用<!--more-->标签或手动输入摘要

这是wordpress默认最简单最直接的方法,在《为WordPress长文章分页》一文中我介绍了用<!--nextpage-->为一篇长文章分页,而<!--more-->标签的使用方法一样,只不过效果不同。<!--more-->实现将你的文章从该标签的地方截断,前面部分作为首页显示的文章摘要,内容页不做任何影响。因此,一篇文章只需要一个<!--more-->就可以了。而且添加<!--more-->标签必须再HTML模式下,否则就跟现在你看到一样。

当然,每篇文章都有一栏摘要,你可以自行输入,输入后如果不做任何模板的修改,那么可以在分类列表也看到你的文章摘要是你输入的摘要。其实就是the_excerpt()函数,它获取你手动输入的摘要,如果没有手动输入,那么获取文章内容的开头部分作为摘要输出。

方法二:使用the_excerpt()代替the_content()函数

如果你稍微懂得wordpress的模板修改,肯定对这两个函数不陌生,the_excerpt()是输出文章的摘要,不同的主题这个摘要的输出格式和字数可能不同,上面也讲了,它是先判断你是否有手动输入的摘要,如果没有再将文章内的前面部分输出,而且是不换行的输出。而the_content()就是全文输出了。使用这种方法会让原来的首页相当干净,不仅文字急剧减少,而且没有图片,最痛苦的是没有分段。(下文会讲解如何解决这种没有分段的情况)因此,这种方法也显得太傻瓜了。

方法三:使用函数功能获取文章开头的固定字数(甚至HTML)作为摘要输出

这种方法需要mb_strimwidth()函数支持,如果你的主机开通了php的mb_string扩展的话,可以使用mb_strimwidth函数来截取文章内容,以达到显示固定字数摘要的目的,比如首页摘要显示前200个字:

echo mb_strimwidth(strip_tags($post->post_content),0,200,'......');

这样就会显示文章的前200个字,随后跟着一个省略号。这个mb_strimwidth函数可以很好截取中文字符。我们再稍改造一下,就可以显示“阅读全文”链接的效果:

echo mb_strimwidth(strip_tags($post->post_content),0,200,'<a href="'.get_permalink().'">......[阅读全文]</a>');

但是,如果假如万一你的主机没有激活php的mb_string扩展,使用这个函数就会报错。在这种情况下,我们可以自定义一个类似的函数,下面是我写的一个截取utf-8字符串的函数dm_strimwidth,也是我正在使用的方法:

function dm_strimwidth($str ,$start , $width ,$trimmarker ){ ?$output = preg_replace('/^(?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$start.'}((?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$width.'}).*/s','1',$str); ?return $output.$trimmarker; }

使用方法和前面的mb_strimwidth是一样的,不过使用前你需要把上面的函数定义复制到functions.php文件中,然后调用

echo dm_strimwidth(strip_tags($post->post_content),0,200,'<a href="'.get_permalink().'">......[阅读全文]</a>');

有时候下面这种做法也是不错的,即如果给文章手动添加了摘要,就显示这个手动添加的摘要,如果没有就显示固定的字数。方法如下:

if(has_excerpt()) the_excerpt();
else echo mb_strimwidth(strip_tags($post->post_content),0,200,'<a href="'.get_permalink().'">......[阅读全文]</a>');

参考:http://domety.com/archives/216/

方法四:wordpress摘要插件

网络上应该有很多插件,这里就不多提,只是列举几个。

1,Fwolfhttp://www.fwolf.com/blog/post/296
和wp自带的几乎一样,只不过把按空格判断改成了按段落判断,会输出文章的前三段作为摘要。因为是按段落输出,也不会出现中文乱码。

2,桑葚的中文工具箱 http://yanfeng.org/blog/wordpress/kit/
用substr()函数截取前256个字节,再用utf8_trim()函数处理,保证中文不会出现乱码。

3,Yskinhttp://yskin.net/2006/07/mulberrykit.html
Yskin的是段落和字数混合判断,先根据回车把文章分割成n段,然后用mb_strlen()判断字数,如果没超过规定的字数,就再输出一段。因此他的最小输出单位仍然是段落。

以上所有方法都有一个共同特点:输出的摘要是没有格式的,只有纯文本,原来的颜色、字体、超链接、图片等等都被过滤掉了。而我个人其实希望能够保留格式。

另外,按段落输出的话,有的段落长,有的段落短,那么输出的摘要就不是很整齐。网页不像书本,宽度不固定,无法预知每行写满了应该是多少字,而且如果保留图片的话,那么图片应该占多少行也很难判断,所以根据行数判断暂时不可行。

退而求其次的办法是根据字数判断。每个摘要虽然“占地面积”可能不一样,但字数是一样的,也还算整齐。不过中文工具箱的办法有点麻烦,其实有个mb_substr()函数就完全可以达成这一任务,截取指定数量的前若干个汉字,绝不会出现乱码。

不过mb_substr()函数也有个问题,它是根据字符数截取,如果文章里面夹杂了英文,比如wordpress这一个词就是9个字符了,它比九 个汉字的占地面积要小的多,那么夹杂英文的摘要就会显得比全汉字的摘要短。解决办法是用mb_strcut()函数,它和mb_substr()函数基本一样,只是是根据字节数截断的,在utf-8里,一个汉字大概占 三个字节,一个英文字母占一个字节,这样截出来的汉字文本就会短一些,和英文的长短比较一致。同样,mb_strcut()函数也不会出现乱码。

mb_substr()和mb_strcut()函数共同的问题是,它们是按字符截取的,对英文来说就是按字母截取的,因此有可能把一个单词从中间截断……

另一个问题是mb_substr()和mb_strcut()属于mbstring扩展库,有的空间不支持。对于这种空间商,写信去要求他安装吧,付了钱的就得理直气壮提要求。要求无效的,真得考虑一下这种基本要求都不能满足的空间的质量了。

根据以上的阐述提供的插件http://wordpress.org/extend/plugins/advanced-excerpt/

以上部分来自:http://myfairland.net/wordpress-excerpt/

除了上面的mb_substr()函数外,我还曾经使用过nl2br()函数,使用如下

nl2br(dm_strimwidth(strip_tags($post->post_content),0,200,'<a href="'.get_permalink().'">......[阅读全文]</a>');)

但这种方法太无语,原来图片的地方被strip_tags()去掉后,现在成为很多个<br>换行,如果原来的文章有很多图的话,这里就会有无数个<br>极为难看,因此被放弃。我曾经想过用这种方法的时候不用strip_tags()函数,但当截断的地方正好是一个<img>或<a>标签时就惨了,要么图片成一个叉叉,要么下面全是一个链接。因此该想法被放弃。

五、利用wordpress的内在规律,想怎样就怎样[增加]

wordpress就是那么炫,你可以随意改造它原有的呈现方式。文章给出了get_the_excerpt(),get_the_content(),the_excerpt(),the_content()这几个函数,而在这同时,还有个厉害角色,就是$post->post_content和$post->post_excerpt。而$post->post_excerpt只有你填写摘要内容之后才有内容,和get_the_excerpt()得到的结果完全不同。

而get_the_excerpt()得到的是完全除去格式的,没有分段分行的文章摘要,不爽,让我们来自己写一段代码,让你玩起来。

function get_excerpt($excerpt){
?? ?$content = get_the_content();
?? ?$content = strip_tags($content,'<img><h3><blockquote><strong>');
?? ?//$content = preg_replace('/<h1[^>].*?</h1>/i',"[图片省略]",$content);
?? ?$content = mb_strimwidth($content,0,800,'...');
?? ?return wpautop($content);
}
add_filter('the_excerpt','get_excerpt');

这段代码可酷了,注意一个函数wpauto(),它是wordpress内部的段落整理函数,能自动将文章的格式进行调整使其自然。$post->post_content得到的是存储在数据库中的没有<br>或<p>标签的内容格式,换行都被\n代替了,而wpauto()不仅帮助你换行,而且还把多余的换行去掉,缩短为一个换行。那么这段代码你就可以理解有多酷了,你可以通过对它的修改,灵活的使用,打造属于你自己的文章摘要的显示模式。

举个很简单的例子,只保留<img>,只要前500个字,没有问题,修改上面的对应的内容即可。你不想分段?没问题,不要用wpauto即可,直接return $content。直接在loop中调用get_excerpt也没有问题。当然,还有可以保留多少段落的方法,请看wordpress文章内容除去文本之外的标签并分段获得思路,在foreach中做数量限制即可。

$i = 1;$num=10;//只输出10个段落
if(preg_match('/<p>(.*)<\/p>/iU',trim(strip_tags($post->post_content,"<p>")),$matches)){
?? ?//如果是使用 Windows Live Writer 这些工具写日志,可能使用<p>和</p>进行分段
?? ?foreach($matches as $match){
?? ??? ?if($i<$num)$output.=$match;
?? ??? ?$i++;
?? ?}else{
?? ??? ?//如果直接在 WordPress 写日志,使用换行符(\n)来分段
?? ??? ?$post_content = explode("\n",trim(strip_tags($post->post_content,'<a>')));
?? ??? ?foreach($post_content as $content){
?? ??? ?if($i<$num)$output.='<p>'.$content.'</p>';
?? ??? ?$i++;
?? ?}
}

综合而言,站长们应该根据自己的情况来确定使用哪种摘要形式。另外,本站实现了在首页输出方式为前两篇全文输出,后面的摘要显示,并判断如果有图片的话在摘要前将第一章图显示出来。具体的实现方法你可以搜索本站,也可以下载本主题研究模板原始码。

已有12条评论 快速评论
  1. Genghis #664楼 2011/12/17 15:49:23 回复

    拜读之后受益匪浅!

  2. frustigor #403楼 回复给@402楼 2011/09/18 20:51:50 回复

    不客气哦,慢慢来,有问题大家一起交流

  3. 浩子文 #402楼 2011/09/18 20:45:00 回复

    OK我找到了,在查看源码网页源码里面找到了控制元素,再次感谢你的帮助!

  4. 浩子文 #401楼 回复给@399楼 2011/09/18 20:41:47 回复

    我还想请教下,加密日记口令框的结构在哪个文件想CSS控制下。还有这样弄管理员也必须输一次密码才显示当然这个是次要的,刚才没看到你的第一条回复所以让你多费了下心不好意思哈。。。非常感谢您的帮助。。。

  5. frustigor #400楼 回复给@399楼 2011/09/18 20:37:47 回复

    嘿嘿,不客气,多多交流哦

  6. 浩子文 #399楼 回复给@397楼 2011/09/18 20:31:50 回复

    谢谢,已经搞定了,我就是想知道post_password_required这个套感谢了,呵呵

  7. frustigor #398楼 回复给@397楼 2011/09/18 19:40:21 回复

    mb_strimwidth()函数是系统函数,无法重新定义,它的功能就是截字功能。如果你确定需要用一个函数来实现判断,那么可以自己写一个函数:
    function dm_strimwidth($lenght){
    global $post;
    if(post_password_required()) the_content();
    else echo mb_strimwidth(strip_tags($post->post_content),0,$length,’……’);
    }
    在原模板中用该函数替换the_content()即可

  8. 浩子文 #397楼 回复给@396楼 2011/09/18 19:31:28 回复

    但是访客呈现的效果就是加密日记的摘要,我是想用mb_strimwidth能够让它自动判断加密文章显示口令框没加密的显示摘要。或者加密日记的控制函数是什么?

  9. frustigor #396楼 回复给@395楼 2011/09/18 19:27:21 回复

    这和mb_strimwidth函数无关,而是和模板的控制有关,如果你的博客中存在加密的文章,请加上如下的条件控制:
    < ?php if ( post_password_required() ) : ? >
    < ?php the_content(); ? >
    < ?php else : ? >

    < ?php endif; ? >
    因为加密的文章会显示为一个口令框,因此你不用考虑访客到来的呈现效果。

  10. 浩子文 #395楼 2011/09/18 16:08:28 回复

    用mb_strimwidth可是加密的文章也显示出来了。

  11. frustigor #264楼 回复给@263楼 2011/08/28 01:26:16 回复

    用这段代码替换LOOP循环中的the_content()函数即可

  12. wangchenglong #263楼 2011/08/28 00:20:15 回复

    方法三中“echo mb_strimwidth(strip_tags($post->post_content),0,200,’……’);”写在哪里?

填写个人信息,赶快回复吧!