
表示する記事タイトルの文字数を変更・制限する(PHP7・PHP8)
タイトル文字数を制限する記述は、echo mb_substr($post->post_title, 0, 25) . '…';が一般的です。
PHP7系のWordpressサイトは上記で問題ありませんが、PHP8系の最新Wordpressサイトだと警告エラーが出ます。
if条件分岐で$post内にデータがある時と無い時の処理を書くか、wp_trim_words関数を使いましょう。
Wordpressでタイトルの文字数を制限する
本記事では、Wordpress記事タイトルの文字数を制限・調整する方法について紹介します。
よく出回っている方法の紹介になりますが、それでは取得できないケースにも遭遇します。
いくつかの関数の紹介と処理方法について解説していきます。
現環境がPHP7系の場合は通常通りの処理で大丈夫です。
ただし最近構築した環境(PHP8系)の場合は、セキュリティルールが厳しくなったので手を加える必要があります。
記事タイトルの出力方法
Wordpressの投稿記事のタイトルは、簡単に出力できる様になっています。
仮にタイトル文字に制限をつけない場合だと、以下の様に書く事でしょう。
タイトル出力例(h3タグ内)
<h3><?php the_title(); ?></h3>
ループ処理中に書く簡単な記述ですが、タイトルがやたらと長いと不都合が出てきます。
例えば記事一覧の様に文字を整列させる場合がそれにあたりますね。
文字量の多いタイトルは2段に改行されたりして、並びが不揃いになる訳です。
文字数をコントロールする関数
そんな時によく実施するのが、関数による文字数制限です。
例えば25文字や30文字など、実質のタイトル文字数に関係なく、指定した文字数しか映さない設定です。
これにより、指定文字数より少なければ全て表示され、それより多い場合は指定文字数のみ抽出されます。
この制限を掛ける事で、記事一覧の並びを整列させる事ができる訳です。
mb_substr関数を使った記述
以下に一般的な書き方をご紹介します。
<?php echo mb_substr($post->post_title, 0, 25) . '…'; ?>
コード解説
まずphpのecho関数でタイトル文字を呼び出ししています。
mb_substr関数は、指定の文字数の左端から指定文字数までを抽出する命令です。
$post->post_titleは、$postの情報群の中からタイトル部分を抜き出ししています。
上記の場合は、左の先頭から25文字目までを抽出している事になりますね。
さらに末尾には'…'の文字を連結しています。
本来はこれより長いのですが「…」により途中までしか表示していない事がわかりますね。
mb_substr関数で表示されない場合
他サイト記事でもよく紹介されていますので、これでほぼ問題は無いと思います。
ところが最近のWordpressサイトでは、この方法だとタイトル文字数が制限できない場合があります。
タイトル自体が表示されず、代わりに「警告エラー」が出る様になります。
それがPHPの「バージョン8系」を使っている最新のWordpressサイトです。
php8系でよりルールが厳格になった
これまでのPHPの7.2系や7.4系を使ったサイトであれば、警告に遭う事は無いでしょう。
しかし今新規にWorpdressサイトを立ち上げた場合、PHP8.1がデフォルトの状態になります。
PHPが8系はセキュリティルールが高くなっているので、それに伴い記述ルールも変える必要があるのです。
警告エラーの内容
まずは、表示されている警告エラーを見てみましょう。
Undefined variable $post in
PHP Warning: Undefined variable $post in …
これは「記述内に変数$postが使われていますが、変数が定義されていません。」という意味です。
使用した変数$postの「規定値」が設定されていないために、警告がされているのです。
つまり、$postからタイトルpost_titleを抜き出していますが、もし中に値がなかった場合はどうしますか?と懸念されている訳です。
Undefined variable $post on null in
今回は同時に以下の警告も出ています。上と似ていますが末尾が違います。
PHP Warning: Undefined variable $post on null in …
これは$post->post_titleによって、「post_title」データが取り出せなかった事を示します。
まさに、&postの中に情報が入っていなかったために起こった警告ですね。
この様にPHPが8系にバージョンアップした事で、これまでできていた処理ができなくなる場合があります。
PHP8系の対策方法
対策としては「変数が存在する場合とそうでない場合」とで条件分岐させ、各々記述する形が有効になります。
或いは状況によって、あらかじめ変数を指定しておく事も必要になるでしょう。
変数の存在を確認する様追記
これを踏まえて記述をし直すと以下の様になります。
isset()を使ったif条件文の例
<?php if(isset($post)){ echo mb_substr($post->post_title, 0, 25) . '…'; } else{ //入っていない場合の処理 } ?>
isset()で$postの中に情報が入っているかどうかを確認し、入っている場合にのみifの条件欄で処理を行います。
入っていない場合は、elseの欄で対応する処理を書く事になります。
これでphp8系でも警告エラーが出る事なく、タイトル文字数が制限された状態で表示されるはずです。
注意
私の環境では同時に「on null in…」警告も出ていたため、上記だけでは不十分でした。
そこで以下の様に、あらためて「global $post;」で情報を再度取得して処理しています。
global変数入りコード
<?php global $post; //$post情報再取得 if(isset($post)){ echo mb_substr($post->post_title, 0, 25) . '…'; } else{ //入っていない場合の処理 } ?>
わたしの環境の場合、テーマファイル上部でnew wp_queryを実行し別の変数名にポスト情報を格納していました。この様に環境によって変わってきますので注意が必要です。
もう一つの方法「wp_trim_words」
PHP8系の場合、以前と比べて処理が長くなる事は間違いありません。
それに先程の様にglobal $postで再取得するのも、あまり良い事ではないと思います。
そこでもう一つ簡単な関数の記述を紹介しましょう。
それが「wp_trim_words関数」です。
wp_trim_words
以下の様に1行で済みますし、PHP8系でも安全に使えます。
<?php echo wp_trim_words( get_the_title(), 25, '…' ); ?>
wp_trim_wordsは、文字数を制限する専用関数です。
コード解説
まず第一引数のタイトル情報は、get_the_title()で取得しています。
第二引数で文字数を指定(上は25文字)し、第三引数で、末尾の文字(…)をつける事ができます。
今後の事を考慮して、こちらのやり方に変えた方が無難かもしれませんね。
いかがだったでしょうか
WordpressやPHPをバージョンアップした場合は、今回の様に記述を変更しなければならない場合があります。
特にタイトル文章の文字量を制限している場合は、改変が必要です。