みなさんwordpressで開発をしていて、よくタイトルや抜粋文の文字数制限や、末尾を...にしたりしますよね。
そしてやり方をググると、例えば抜粋文なら大抵このようなコードを目にするかと思います。
function twpp_change_excerpt_length( $length ) {
$length = 50;
if ( is_category() || is_tax() ) {
$length = 100;
}
return $length;
}
add_filter( 'excerpt_length', 'twpp_change_excerpt_length', 999 );
これはページごとに抜粋文の長さを変えられるコードですね。
excerpt_lengthフィルターを使っています。
function twpp_change_excerpt_more( $more ) {
return '......';
}
add_filter( 'excerpt_more', 'twpp_change_excerpt_more' );
これは、抜粋文の省略記号を...にするよくあるやつです。
excerpt_moreフィルターを使っています。
一部分だけ適用したいんだが...
そう、例えばページの人気記事一覧の部分だけ文字数を20文字、そのほかの記事一覧の文字数を50文字にしたい
場合どうでしょうか。
そういう風に融通がきくコードを今回紹介します。
まずはタイトルの制御から
タイトル文の制御は抜粋文に比べて楽なので、肩慣らしと行きましょう。
20文時までに制限して、それを超えたら末尾は...にします。
いきなりコードを見ます。
<?php
if(mb_strlen($post->post_title)>20) {
$title= mb_substr($post->post_title,0,20) ;
echo $title . '...';
} else {
echo $post->post_title;
}
?>
mb_srtlenとmb_substr
mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] ) : int
mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] ) : string
肝はこの辺ですね。
上から順に見ていくと、
まず$post->post_title
でタイトルを投稿から文字列で持ってきてます。
そしてそれをmb_strlen
で文字数調査、今回は20文字制限にしてます。
20文字以上ならmb_substrで文字数制限をかけます。
プラグインのWP Multibyte Patchを入れていること
そしたらechoでそのタイトルと、末尾に...を出力します。
ここでif文分岐が起きているのは、if文で文字数調査をしないと、20文字以内のタイトルの末尾にも...がついてしまうためですね。
else以下は当然20文字以下なので、タイトルのみechoします。
抜粋文(excerpt)はやっかい
それでは抜粋文を見ていきましょう。
20文字に制限して、それ以上のときは...を出力します。
コードを見ます。
<?php if (mb_strlen($post->post_content, 'UTF-8') > 20) {
$content = str_replace('\n', '',
mb_substr(strip_tags($post->post_content), 0, 20, 'UTF-8'));
echo $content . '...';
} else {
echo str_replace('\n', '', strip_tags($post->post_content));
}
?>
『やだいきなり複雑になった怖いやめてください🥺』
落ち着いて。calm down
。1つ1つ解説します。
str_replaceとstrip_tags
str_replace( $検索文字列 , $置換後文字列 , $検索対象文字列 [, int &$count ] )
基本はタイトル文の制御と一緒ですが、post_contentにはhtmlタグが含まれています。
そのためそれらを取り除ければ良さそうです。
まずはmb_strlen
で文字数調査をします。
mb_substrで文字数制限をする前に、strip_tags
でhtmlタグを取り除きます。
最後にstr_replace
で半角スペースを取り除いて純粋な文字列になったものを$contentに代入して終わりです。
全体に適用するか、個別に適用するか
ここまで紹介したコードは、どちらかといえば細かに適応させたい場合に有効かなと思います
ページ全体でタイトルや抜粋文を制御したい場合はfunctions.phpの方がいいと思いますし、同じページ内で場所ごとに文字数制御を変えたいなら、今回のコードは使えるかなと思います。