當然, 尚有諸位前輩也曾把以上三種方案結合一二, 以達到更廣泛的適應度. 不過, 這廂先前在網路上搜索許久, 卻未曾尋到三種方案合為一體的嘗試, 于是只好自己動手寫一下了:)
沒有demo, 整個過程并不麻煩, 主要分作以下兩部分:
STEP 1. 加工 more標簽 ↓
復制代碼
代碼如下:
<?php
function my_more_link($link){
//禁止more標簽自動跳轉
$link=preg_replace('/#more-\d+/i','',$link);
//我在more標簽的外圍加了一層 p, 用以更方便地自定義more標簽在頁面中的顯示(使用 p.read-more)
$link=str_replace('<a','<p class="read-more"><a rel="nofollow" />
以上, 應是添加入主題的 function.php, 略有注釋. 整個 more標簽, 我新增了 nofollow 與 />
STEP 2. 加工完整方案 ↓
嗯, 這廂以下才是正題...
我的想法是, 首先判斷 內置摘要, 如果有就直接顯示, 否則進入下一判斷, 是否存在 more標簽. 最后才是使用php自身的 mb_strimwidth 函數截斷.
實現的全部代碼如下(基于 STEP 1 中的操作):
復制代碼
代碼如下:
<?php //這是為了在單篇文章(或頁面)直接顯示全部內容,而不使用以下的判斷
if(is_singular()){the_content();}else{
//定義兩個$
$pc=$post->post_content;
$st=strip_tags(apply_filters('the_content',$pc));
//判斷是否存在 內置摘要
if(has_excerpt())
the_excerpt();
/*使用正則表達式嘗試匹配more標簽,
并判斷如果存在more標簽, 或者正文內容長度小于300, 則直接以more標簽方式顯示,
即是說, 有more便顯示more, 沒more且長度小于300則直接顯示全文.
我使用了mb_strwidth來判斷長度.
*/
elseif(preg_match('/<!--more.*?-->/',$pc) || mb_strwidth($st)<300)
the_content('Read more »');
//否則...以下
elseif(function_exists('mb_strimwidth'))//判斷是否支持mb_strimwidth函數
echo'<p>'//mb_strimwidth截斷后得到的是純文本, 所以我給它包了一層 p
.mb_strimwidth($st,0,300,' ...')//對文本內容截斷, 從位置0開始往后截取300長度, 超出部分以點點點替代
.'</p><p class="read-more"><a />
以上便是整個過程了, 把 STEP 2 的全部代碼拷貝, 然后找到主題循環部分, 以之替換類似 <?php the_content(); ?>" 的存在即可.
至此, 我使用的文章摘要與截斷方案 便算完成了, 若有不當之處, 還請不吝留言指教~感恩啦~
注1: 使用 mb_strimwidth 倘若出現亂碼, 請自行 Google 之...
注2: 使用 mb_strimwidth 會強制截斷html代碼塊而導致格式亂套, 所以最好還是手動設置 more標簽, 或者只將其用于純文字的文章.
注3: 若php文件中寫入了中文字符, 請保存為 utf8-no-bom 格式.
Update: 2011.05.31