ショウジンブログ on Hatena

“お芝居をしないと、この社会では異邦人として扱われるほかない”

カスタムフィールドの値を文字数制限して出力@WordPress

f:id:showjinx:20160726121516j:plain

正規表現を使ったやり方

まず、以下の解説を参考にして確認してみました。

www.tinybeans.net

カスタムフィールドの管理にプラグイン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として出力されます。

&nbsp;

等のエンティティも半角スペースとして出力されます。

1行目の「50」が制限する文字数です。この数値を超える場合には末尾に「…」を出力します。この数値に満たない場合にはそのまま(カスタムフィールドの値を)出力します。

50文字までいく前に改行が入っているとそこで終わりとみなされ(指定した文字数制限に満たっていない)入力されている文字が全て表示されます。

mb_strimwidth() 関数を利用する

PHPの mb_stimwidth() 関数を使った場合です。第三引数の数字のところが制限する文字数です。文字化け対策のため、文字コードを明示しています。

<?php
    $str = mb_strimwidth(post_custom('wpcf-remarks'), 0, 20 , '', utf8);
    $more = '&nbsp;<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() 関数かなと感じます。