LoginSignup
2
2

More than 3 years have passed since last update.

【もう悩まない!】WordPressのexcerptやtitle文字数操作の奥義をお教えしますよ

Posted at

みなさん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の方がいいと思いますし、同じページ内で場所ごとに文字数制御を変えたいなら、今回のコードは使えるかなと思います。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2