wordpress カスタムフィールドの利用(値を改行して出力)

2013年6月5日

投稿(カスタム投稿)で、イベントの各種の情報をカスタムフィールドに入力して、それらを出力する場合などの利用方法のメモ。

訂正:カスタムフィールドの値に <br> は記述できますし、改行して記述することもできます。

  • カスタムフィールドの値に改行などの記述はできないので、区切り文字を使って対応。
  • 以下の例では、場所(venue)、日時(date)、住所(address)、ウェブサイト名(web)とそのURL(url)をカスタムフィールドに入力。
  • 値に改行が必要な場合は、「|」で区切って入力する。
    値に改行が必要な場合は、改行して記述するか <br> を記述。
  • 改行して記述されているものは、nl2br() で <br> に変換
  • get_post_custom() でカスタムフィールドの値を取得し、foreach でそれぞれの値を取得。
  • 同じカスタムフィールドのキーに対する値は1つのみとする。(複数ある場合は、その値を更に foreach で処理すれば可能)
  • 区切り文字を他の文字に変換して返す関数を作成しておく。(不要)

区切り文字を他の文字に変換して返す関数(不要)

  • $string:変換対象の文字列
  • $delimeter:区切り文字
  • $replace:区切り文字に代わる文字列
//区切り文字を他の文字(スペースや'<br />'等)に変換して返す関数
function get_replaced_string($string, $delimeter, $replace) {
  $escaped_string = esc_html($string);
  if($escaped_string == '') return '';
  $string_array = explode($delimeter,$escaped_string );
  $replaced_string = '';
  $count = count($string_array);
  if($count > 1 ) {
    for($i = 0 ; $i < $count; $i++) {
      if($i != $count -1) {
        $replaced_string .= $string_array&#91;$i&#93;.$replace;
      }else{
        $replaced_string .= $string_array&#91;$i&#93;;//最後の文字列には変換文字を付けない
      }
    }
    return $replaced_string;
  }else {
     return $string_array&#91;0&#93;;//1つの場合(区切文字がない場合)はそのまま返す
  }  
}

&#91;/code&#93;

<h3>カスタムフィールドの値を出力</h3>
<ul>
<li>それぞれの情報が必ず入力されているわけではないので、ない場合は出力しない。</li>
<li>それぞれの値を格納する変数を初期化。</li>
<li>get_post_custom()で値を取得。</li>
<li>内部的なフィールド以外の値を処理。</li>
<li>値は空白を取り除き、エスケープ処理<del datetime="2014-06-17T18:14:15+00:00">して、区切り文字がある場合は、&lt;br&gt; に変換。</del></li>
<li>エスケープ処理には、wp_kses() を使用すると便利(許可する HTML 要素を指定できる)</li>
<li><del datetime="2014-06-17T18:14:15+00:00">get_replaced_string()ではエスケープ処理を含む。</del></li>
<li>値が入力されているものだけを出力。</li>
</ul>

<?php $venue =''; $date =''; $address =''; $web =''; $url =''; $fields = get_post_custom(); //許可する(エスケープしない)HTML 要素 $allowed_html = array( 'a' => array( 'href' => array (), 'target' => array() ), 'br' => array(), 'span' => array(), 'strong' => array() ); foreach($fields as $name => $value) { if(!(preg_match("/^_/", $name))) {//内部的なフィールド以外 switch($name) { case 'venue': //$venue = get_replaced_string(trim($value[0]), '|', '<br />'); 以下に変更 $venue = wp_kses(nl2br(trim($value[0])), $allowed_html); break; case 'date': //$date = get_replaced_string(trim($value[0]), '|', '<br />'); 変更 $date = wp_kses(nl2br(trim($value[0])), $allowed_html); break; case 'address': //$address = get_replaced_string(trim($value[0]), '|', '<br />'); 変更 $address = wp_kses(nl2br(trim($value[0])), $allowed_html); break; case 'web': //$web = esc_html(trim($value[0])); 変更 $web = wp_kses(trim($value[0]), $allowed_html); break; case 'url': //$url = esc_html(trim($value[0])); 変更 $url = wp_kses(esc_url(trim($value[0])), $allowed_html); break; default: break; } } } ?> <?php if($venue): ?> <p class="venue"><?php echo $venue; ?></p> <?php endif; ?> <?php if($date): ?> <p class="date"><?php if($date) echo $date; ?></p> <?php endif; ?> <?php if($address): ?> <p class="address"><?php echo $address; ?></p> <?php endif; ?> <?php if($web && $url): ?> <p class="web1"><?php echo '<a href="' . $url . '" target="_blank">' . $web . '</a>' ?></p> <?php endif; ?>
get_post_custom($id)
カスタムフィールドの名前/値をまとめて取得
パラメータ:投稿の ID(オプション)。デフォルトは現在の投稿の ID
戻り値:カスタムフィールド名をキーにした(名前/値からなる)連想配列
戻り値の配列には、WordPress の内部で使われているカスタムフィールドも含まれる。
nl2br ( string $string [, bool $is_xhtml = true ] )
改行文字の前に HTML の改行タグを挿入する
パラメータ
string : 入力文字列。
is_xhtml : XHTML 準拠の改行を使うか否か。(オプション。デフォルトは true)
戻り値:変更後の文字列
wp_kses($string, $allowed_html, $allowed_protocols)
第一パラメータに文字列を指定すると、第二パラメータの配列で指定した HTML 要素のみを許可し、それ以外は全てエスケープした文字列を返す
パラメータ
$string : 文字列(必須)。
$allowed_html : 許可する HTML 要素の配列(必須)。要素に属性があり、その属性を許可する場合は、要素名の中にその要素の許可する属性名の配列を作る。属性の配列を指定しないと、要素だけが許可され属性はエスケープされる。
$allowed_protocols : 許可する(リンク)プロトコル。デフォルトでは「http, https, ftp, mailto, news, irc, gopher, nntp, feed, ,telnet」が許可されている。
戻り値:フィルタ(エスケープ処理)された文字列(HTML)
以下は参考になるサイト