玩WordPress » 技巧方法 » 2009 » 10 » 01 » WordPress自动实现摘要

WordPress自动实现摘要

WordPress在不使用任何的插件的情况下是能在首页实现摘要显示的,但她实现起来不是那么方便,或要自己做文章的中间加<!–more–>;或要修改主题中的标签。总之是不太方便吧。要怎样才能让WordPress自动实现在首页等位置(除了单篇文章的其他页面)只显示指定字节数的摘要,而不用操作其他不关文章的事呢?下面的代码可以帮你实现。

/**
 * author 冰古
 * link http://wanwp.com
 */
$size = 500;    // 500是显示的字节数,可按照自己的要求修改
$more_link_text = 'more...';    // 显示在摘要后面的提示

add_action('the_content', 'control_content_size');

function control_content_size($content) {
    global $size, $more_link_text;
    if (is_singular()) return $content;
    $content = strip_tags($content);
    $content = cut_str($content, $size);
    $content = '<p>' . $content . '</p><p><a href="' . get_permalink() . "\" class=\"more-link\">$more_link_text</a></p>";
    return $content;
}

/**
 * cut_str用于截断包含中文(或其他多字节?)的utf8编码的字符串
 * @param string $str utf8编码的字符串
 * @param int $len 需要截取的长度(单位是字节)
 */
function cut_str($str, $len) {
    if (!isset($str[$len])) {
        // 判断字符串长度是否已经达到需要截取的长度
        // 未达到时,直接输出原字符串
    } else {
        if (seems_utf8($str[$len-1])) // 判断截断字符串的最后一个字符是否是utf8编码的
            $str = substr($str, 0, $len); // 如果是utf8编码的,直接截断输出
        else { // 如果不是utf8编码的,因为utf8编码的中文是三个字节进行保存的,则判断该字符和周围字符组成的字符串是否符合utf8编码
            if(seems_utf8($str[$len-3].$str[$len-2].$str[$len-1]))
                $str = substr($str, 0, $len-3) . $str[$len-3] . $str[$len-2] . $str[$len-1];

            elseif(seems_utf8($str[$len-2].$str[$len-1].$str[$len]))
                $str = substr($str, 0, $len-2) . $str[$len-2].$str[$len-1].$str[$len];

            elseif(seems_utf8($str[$len-1].$str[$len].$str[$len+1]))
                $str = substr($str, 0, $len-1) . $str[$len-1].$str[$len].$str[$len+1];

            else // 这个else应该不用也是可以的
                $str = substr($str, 0, $len);
        }
    }
    return $str;
}

代码的作用:

  1. 首先判断是否在单篇文章页面(如果是,直接返回内容,下面的操作省略);
  2. 然后把文章和WordPress自动添加的HTML标签过滤掉(如果不进行这步,可以想象页面将会大乱。);
  3. 再然后截取内容的前面n个字节(这里使用了我之前写的WordPress可用的截断中文字符的函数);
  4. 最后修饰一下,返回处理过的文章内容(怎样修饰,可以自己手动改改)。

使用方法:

  1. 按照自己的要求修改代码中的$size和$more_link_text
  2. 将修改后的代码加入到主题的functions.php中

或者automatic-excerpt插件到./wp-content/plugins文件夹中,然后在后台激活,当然不要忘了修改代码中的$size和$more_link_text啦。

提示:

  1. 因为懒得(也觉得没必要)弄一个管理页面,所以要在代码中修改显示的字节数和阅读全文的提示。
  2. 如果你之前使用了<!–more–>,在显示中可能有点不好看。玩WordPress就是因为这个原因没有激活这个插件。

有要求,留言提。

26 Responses to “WordPress自动实现摘要”

  1. MENCASE says:

    你好,用了几个你做的东西感觉很不错,
    我想做一个文章排行榜显示在页面上,不知能否提供一点思路,谢谢!
    下面是几个参考例子:
    http://paranimage.com/explore/most-viewed/

  2. MENCASE says:

    译言网的http://www.yeeyan.com/articles/top

  3. 笨猫 says:

    欢迎回访哦

  4. 姐姐大人 says:

    让首页上最新发布的日志(最好也可以自己设置篇数或者距今多少时间内的)显示全部,然后老的日志自动截取,有什么好办法吗?不用插件的。嘿嘿。

    • 冰古 says:

      jj大人,你好。

      “首页不截取,第二页后截取”,可以通过修改上面的代码实现:

      if (is_singular() || ((is_front_page() || is_home()) && !is_paged())) return $content;
      替代
      if (is_singular()) return $content;

      然后把替代后的代码加入到主题的functions.php文件中。

  5. […] 冰果写的代码,WordPress自动实现摘要。 感兴趣的可以自己去冰果的站点看看,作者也写了比较详细的说明文档。 […]

  6. vela says:

    不知道为什么添加代码之后就空白页面了,无法显示,不知道是哪里出错了

  7. 可可多 says:

    你好,请问你的站点是在PR3-PR5之间吗?我们购买你的链接,如有意向请联系QQ:2①523

  8. 乘风归来兮 says:

    这个是很多人想要的东西,可惜一直没有,楼主牛

  9. LAONB says:

    兽人fom推荐我过来学习的。

  10. Terry says:

    谢谢,新弄了一个博客,特地来取经。

  11. […] 参考文章:http://wanwp.com/tips-tricks/automatic-excerpt-for-wordpress/ 【专】CPU   PHP, WordPress      禁用WordPress日志历史版本 » […]

  12. love冰古 says:

    唉,来的太晚了,不过解决了。
    找了一晚上,花了我12个小时,别的什么插件,方法都不行。就你的好用。谢谢

  13. love冰古 says:

    就是多问一句,怎么能让摘要的最后,自动加上”…”省略号呢?请指教。

    • love冰古 says:

      3天后来看你的答复。呵呵。

    • 冰古 says:

      在代碼的 22 行處找到 <br />,在它前面加 … 即可。

      • love冰古 says:

        找不到,估计您也找不到。怎么办?

        • 冰古 says:

          什麼叫我也找不到啊?我沒找到我還能亂說啊。

          • love冰古 says:

            您说的代码是指您上面写的那些代码里的22行吧。
            找遍了也没有啊,不然,您说的不是那里?
            那您是指?

            ps:您的一句“在代碼的 22 行處找到 ,在它前面加 … 即可。”让我找得好辛苦,找不到…,可能是我太笨蛋了,不是说您乱讲。

            • 冰古 says:

              抱歉抱歉,我以為你用的是那個插件(http://code.google.com/p/bingu/source/browse/trunk/wp-plugins/automatic-excerpt.php),你是直接用的那個代碼,代碼你找到這行:

              $content = '<p>' . $content . '</p><p><a href="' . get_permalink() . "\" class=\"more-link\" rel="nofollow">$more_link_text</a></p>";
              

              修改為

              $content = '<p>' . $content . '...</p><p><a href="' . get_permalink() . "\" class=\"more-link\" rel="nofollow">$more_link_text</a></p>";
              
  14. 西直门吹雪 says:

    摘要实现了,可是不能在摘要里包含一张图片

  15. aiya says:

    你可以设置缩略图的呀

  16. Jatime says:

    感謝冰古的代碼。
    除前屏西門吹雪提到的縮略圖問題外,另外請教:展開某一分類,其中的文章顯示為摘要並附有’more…’字樣,可’more’並非可點擊的超鏈接。