WordPressのカスタムフィールドで最初のn文字だけを表示して、残りを...にする方法は?

コメントで以下のような質問を頂きました。

(カスタムフィールドの)テキストエリアで入力したテキストに文字数制限というのは可能でしょうか?

例えば、トップページにテキストエリアで入力した文字を表示させるとします。

その時に、30文字以上は、「...」というように表示制限をかけることは可能でしょうか?

といことで、これを実現するサンプルを作ってみました。

前提

今回の説明では、以下のようなカスタムフィールドを前提としています。

  • キー:textarea
  • 値:こんにちは。僕はどちらかというと、MTの方が好きなんですが、WordPressが嫌いってワケではないですよ。

普通に出力

このカスタムフィールドの値を普通に出力するには次のようにします。

<?php echo post_custom('textarea'); ?>
【出力結果】
こんにちは。僕はどちらかというと、MTの方が好きなんですが、WordPressが嫌いってワケではないですよ。

先頭の10文字だけ出力して、それ以降は...で出力

もっとスマートな方法もあるかもしれませんが、次のようなコードで実現できると思います。

<?php
    $pattern = '/(^.{10})(.+)/u';
    $subject = post_custom('textarea');
    $matches = array();
    preg_match($pattern, $subject , $matches);
    if ($matches[2] != '') {
        $out = $matches[1] . '...';
    } else {
        $out = $subject;
    }
    echo($out);
?>
【出力結果】
こんにちは。僕はどち...

このように、今回は正規表現を使って実現してみました。

解説

preg_match関数を使う

今回は、preg_match()という関数を使いました。最初は、mb_ereg関数を使おうと思ったのですが、どうも utf-8 の日本語だとうまくいかないようだったので、preg_match関数にしました。

mb_ereg(string pattern, string string [, array regs])
preg_match(string pattern, string subject [, array &matches [, int flags [, int offset]]])

まず、最初に正規表現のパターンを変数 $pattern に代入します。今回は「最初の10文字」だけを表示するので「10」になっていますが、30文字表示したければ、コード中の「10」を「30」にすればOKです。

$pattern = '/(^.{10})(.+)/u';

次に、検索対象文字列を変数 $subject に代入します。

$subject = post_custom('textarea');

そして、検索結果を入れる配列 $matches を定義します。

$matches = array();

それらの変数を順番に preg_match に渡し、検索した結果が $matches に格納されます。

preg_match($pattern, $subject , $matches);

$matches には、以下のように検索結果が格納されます。

  • $matches[0] : マッチした文字列全体
  • $matches[1] : (^.{10}) でマッチした最初の10文字
  • $matches[2] : (.+) でマッチした最初の10文字以降の文字

次に、条件分岐で出力方法を変えています。

if ($matches[2] != '') {
    /* (.+) でマッチした最初の10文字以降の文字がある場合は、最初の10文字と...で出力する */
    $out = $matches[1] . '...';
} else {
    /* (.+) でマッチした最初の10文字以降の文字がない場合は、カスタムフィールドの値をそのまま出力する */
    $out = $subject;
}
echo($out);

以上です。もっとスマートな方法があったら教えてください。

  • このエントリーをはてなブックマークに追加
Just a second...