① タイトルの文字数制限
① 単純に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');
?>