カスタムフィールドの値を文字数制限して出力@WordPress
正規表現を使ったやり方
まず、以下の解説を参考にして確認してみました。
カスタムフィールドの管理にプラグインToolset Typesを使っています。カスタムフィールドの指定部分は適宜書き換えます。
<?php $pattern = '/(^.{50})(.+)/u'; $text_body = (types_render_field("カスタムフィールドのスラッグ", array())); $matches = array(); preg_match($pattern, $text_body , $matches); if ($matches[2] != '') { $out = $matches[1] . '… <a href="'. get_permalink() .'" class="more">→ ReadMore</a>'; } else { $out = $text_body . ' <a href="'. get_permalink() .'" class="more">→ ReadMore</a>'; } echo($out); ?>
HTML要素は実体参照されずHTMLとして出力されます。
等のエンティティも半角スペースとして出力されます。
1行目の「50」が制限する文字数です。この数値を超える場合には末尾に「…」を出力します。この数値に満たない場合にはそのまま(カスタムフィールドの値を)出力します。
50文字までいく前に改行が入っているとそこで終わりとみなされ(指定した文字数制限に満たっていない)入力されている文字が全て表示されます。
mb_strimwidth() 関数を利用する
PHPの mb_stimwidth() 関数を使った場合です。第三引数の数字のところが制限する文字数です。文字化け対策のため、文字コードを明示しています。
<?php $str = mb_strimwidth(post_custom('wpcf-remarks'), 0, 20 , '…', utf8); $more = ' <a href="'. get_permalink() .'" class="more">→ ReadMore</a>'; echo esc_html($str); // エスケープ処理 echo $more; ?>
カスタムフィールドのスラッグで冒頭に「wpcf-」がついてますが、これはプラグインToolset Typesを利用している場合です。プラグインを使用していなければ、そのフィールドのスラッグそのままです。
HTML要素はエスケープ(実体参照)処理しています。
wp_html_excerpt() 関数を利用する
WordPressで用意されているwp_html_excerptを利用する例です。
HTML要素が入っている場合には除去されます。エンティティ文字は変換されます。(HTMLソース上では実体が文字列として存在するので、引数の文字数指定の際にはこの文字数を考慮する必要があります)
<?php $str = (types_render_field("カスタムフィールドのスラッグ", array())); $count = 80; // 制限したい文字数 $more = '… <a href="'. get_permalink() .'" class="more">→ ReadMore</a>'; echo wp_html_excerpt( $str, $count, $more ); ?>
赤文字部分はカスタムフィールドの指定です。使用しているプラグイン等で指定の仕方が変わってきます。これはToolset Typesを使った例です。
ここまでで三通り試行してみましたが、使い勝手がよく、文字数指定への正確性も確かなのは最後の wp_html_excerpt() 関数かなと感じます。