タイトルを抜粋する
関連記事プラグインを使って、記事本文の下に「関連記事」を表示している。情報としては、タイトル、画像、投稿日、本文抜粋の順に表示しているところであるが、表示スペースが限られていることもあり、タイトルが長いと折返してしまい、パソコンで見た時、タイトルに押されて画像が横並びにならず、段がついてしまう。そこで、タイトルを折り返さない幅に省略してしまおうと言うのが、今回の課題である。英文のみのタイトルであれば、substr()関数で必要な長さに切り取ってくれるのであるが、タイトルに日本語が使われていると、単純にsubstr()で切り取れば良いわけではなくなってしまう。そこで登場するのがmb_substr()関数である。mb_の名の通り、マルチバイトでsubstr()出来る関数である。
タイトルが英文のみ、日本語のみの場合であれば、単純にタイトルの長さを比較することで何文字切り取るか決めることが出来るのであるが、混在しているとその比率が違ってくる。日本語寄りの切り取り長さにすると英文の時には短過ぎ、英語寄りに切り取り長さにすると日本語の時に長過ぎてしまう、ちょうど良いところを決める必要がある。
また、切り取りの長さと同じタイトル長さの時には、「…」を付加しないなど、細かい制御が必要になってくる。等々様々な制約を考慮した結果が以下のコードである。
if ( strlen( $post_title ) > 40 || mb_strlen( $post_title ) > 19 ) { $title_aspect = strlen($post_title) / mb_strlen($post_title); if ( $title_aspect == 1 || $title_aspect < 1.8 ) { $post_title = mb_substr( $post_title, 0, 20 ); } else { $post_title = mb_substr( $post_title, 0, 14 ); } if ( $title_aspect < 1.8 || $title_aspect <= 3 ){ $post_title = $post_title . '...'; } }
まず、タイトルをstrlen()とmb_strlen()で長さを測る。英文のみであれば、どちらの結果も同じ長さになり、日本語のみであれば、strlen()の結果は、マルチバイトの長さに対して3倍の長さになる。混在していると3倍以下になる。日本語のみであれば20文字以上で抜粋処理に入る事になる。
抜粋処理では、英文のみの場合(比率が1)か、比率が1.8未満の場合には20文字で切り取り、それ以外のケースは14文字で切り取る。そして比率が3以下の時には「…」を付加しない、という設定である。
これで気兼ねなく長いタイトルを使うことが出来る。タグ「世界遺産」や「廃墟」、「攻略法」などで表示される記事を選ぶと、関連記事のコーナーでタイトルが省略されている状態を見ることが出来る。