タイトルと本文の文字数制限を使いこなす

① タイトルの文字数制限

① 単純に20文字で制限する


単純ですね。20文字まで表示させているだけです。 ただこれだとタイトルの内容によっては、ブツッと切れた感じになってしまうかもしれません。


<?php echo mb_substr($post->post_title, 0, 20); ?>

② 20文字で制限して後ろに「……」を付ける


後ろに省略記号を付け、省略されていることを明示しています。 ブツ切れ感は軽減できましたが、今度は20文字未満のタイトルでも省略記号が付いてしまいます。


<?php echo mb_substr($post->post_title, 0, 20).'……'; ?>

③ 20文字で制限し、それを超えた場合は「……」を付ける


文字数制限の前に文字数をカウントし、20文字以上と未満で条件分岐させました。これで安心ですね。何文字で制限するかの設定を変えれば、どんな場合でも使えると思います。※コピペされる場合は、制限文字数の『20』が2か所あるので気を付けてくださいね。


<?php
if(mb_strlen($post->post_title, 'UTF-8')>20){
	$title= mb_substr($post->post_title, 0, 20, 'UTF-8');
	echo $title.'……';
}else{
	echo $post->post_title;
}
?>

④ htmlタグを外して文字数制限し、改行コードを削除


2行目の「strip_tags」で、$post->post_contentの中からhtmlタグを除外しています。ですが半角スペースが生じています。 半角スペースの正体は「改行コード」です。ソース内で改行されていた場合に、HTMLタグだけが削除されたために改行コードだけが残り、ブラウザ上で半角スペースとして表示されてしまっているのです。なので、この改行コードを「str_replace」で取ってしまいましょう。


<?php
if(mb_strlen($post->post_content,'UTF-8')>200){
	$content= str_replace('\n', '', mb_substr(strip_tags($post-> post_content), 0, 200,'UTF-8'));
	echo $content.'……';
}else{
	echo str_replace('\n', '', strip_tags($post->post_content));
}
?>

⑤ 特定のhtmlタグだけ残して文字数制限


さて、もうひとつ考えるべきパターンとして、特定のタグだけ残してほしいと要望があった場合が考えられます。 改行だけ残してほしいとか、投稿時に設定した文字色はそのまま表示したいとかですね。 その場合は「strip_tags」に引数を渡して、特定のタグを除外対象から外すことができます。


<?php
//brだけ残す
if(mb_strlen($post->post_content, 'UTF-8')>200){
	$content= mb_substr(strip_tags($post->post_content, '<br>'), 0, 200, 'UTF-8');
	echo $content.'……';
}else{
	echo strip_tags($post->post_content, '<br>');
} 
?>

<?php
//brとspanを残す
if(mb_strlen($post->post_content, 'UTF-8')>200){
	$content= mb_substr(strip_tags($post->post_content, '<br><span>'), 0, 200, 'UTF-8');
	echo $content.'……';
}else{
	echo strip_tags($post->post_content, '<br><span>');
}
?>

⑥ 個別ページと固定ページ以外で、タイトルに文字数制限をかける


function.phpにて以下のコードを入力。下のif文で「個別ページ」と「固定ページ」以外に文字制限をかけるようにしています。これで一覧ページなどではタイトルが24文字以内(文字数制限)に収まるようになりました。

<?php

function title_char_change($title)
{
	if ( mb_strlen($title) > 24 && !(is_single()) && !(is_page()) )
	{
		// 制限させる文字数と省略文字を指定
		$title = mb_substr($title, 0, 24). '...';
	}
	return $title;
}
add_filter('the_title', 'title_char_change');

?>