以下の画像は、通常の投稿の先頭に画像を挿入し、文字列が続く、極ありふれた投稿が元になっています。
トップページには、htmlを含んだ抜粋を表示し
個別ページには、全文を表示します
the_content()を使う代わりに、the_excerptを使ったり、<!–more–>を使ったりする方法は、WordPressになれた人なら、使い分けも出来ると思いますが
文字列だけの抜粋文を表示するというのも、コンテンツを作っている人の思いからすると、乾いた感じがするだろうし、
htmlが混じりのテキストを、htmlを含んだ形で、抜粋できれば、より自然だろうと考えました。
世の中には、同じような事を考えて、コードを公開している人もいたので、マルチバイトで利用できるように、関数を書き換えて、htmlフレンドリーな抜粋文を表示できる関数を作りました。
以下のコードは、テーマの、functions.phpに記述する事で、index.phpで、html交じりの要約文を表示します。
table等の複雑なレイアウトを持つ投稿の場合は、指定文字数が表示されないといった事もあるかもしれません
add_filter( 'the_content', 'nobita_front_page_excerpt' );
function nobita_front_page_excerpt( $content ){
if( is_home() or is_front_page() ){
return mb_strimwidth_with_elements( $content, 100, '...', true, true);
}
return $content;
}
function mb_strimwidth_with_elements($text, $length= 100, $ending= '...', $exact= true, $considerHtml= false){
/*
* An inspired http://www.gsdesign.ro/blog/cut-html-string-without-breaking-the-tags/
*/
if ($considerHtml) {
if (mb_strlen( strip_tags( $text ),"UTF-8" ) <= $length) {
return $text;
}
preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);
$total_length = mb_strlen($ending,"UTF-8");
$open_tags = array();
$truncate = '';
foreach ($lines as $line_matchings) {
if ( isset($line_matchings[1]) and !empty( $line_matchings[1] ) ) {
if (preg_match('/^<(\s*.+?\/\s* |\s*(img |br |input |hr |area |base |basefont |col |frame |isindex |link |meta |param)(\s.+?)?)>$/is', $line_matchings[1])) {
} else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
$pos= array_search($tag_matchings[1], $open_tags);
if ($pos !== false) {
unset($open_tags[$pos]);
}
} else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
array_unshift($open_tags, strtolower($tag_matchings[1]));
}
$truncate .= $line_matchings[1];
}
$content_length= mb_strlen(preg_replace('/&[0-9a-z]{2,8}; |&#[0-9]{1,7}; |&#x[0-9a-f]{1,6};/i', ' ', $line_matchings[2]),"UTF-8");
if ($total_length+$content_length> $length) {
$left= $length - $total_length;
$entities_length= 0;
if (preg_match_all('/&[0-9a-z]{2,8}; |&#[0-9]{1,7}; |&#x[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
foreach ($entities[0] as $entity) {
if ($entity[1]+1-$entities_length <= $left) {
$left--;
$entities_length += mb_strlen($entity[0],"UTF-8");
} else {
break;
}
}
}
$truncate .= mb_substr($line_matchings[2], 0, $left+$entities_length,"UTF-8");
break;
} else {
$truncate .= $line_matchings[2];
$total_length += $content_length;
}
if($total_length>= $length) {
break;
}
}
} else {
if (mb_strlen($text,"UTF-8") <= $length) {
return $text;
} else {
$truncate= mb_substr($text, 0, $length - mb_strlen($ending,"UTF-8"),"UTF-8");
}
}
if (!$exact) {
$spacepos= mb_strrpos($truncate, ' ');
if (isset($spacepos)) {
$truncate= mb_substr($truncate, 0, $spacepos,"UTF-8");
}
}
$truncate .= $ending;
if($considerHtml) {
foreach ($open_tags as $tag) {
$truncate .= '</' . $tag . '>';
}
}
return $truncate;
}

