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[$i].$replace;
      }else{
        $replaced_string .= $string_array[$i];//最後の文字列には変換文字を付けない
      }
    }
    return $replaced_string;
  }else {
     return $string_array[0];//1つの場合(区切文字がない場合)はそのまま返す
  }  
}

カスタムフィールドの値を出力

  • それぞれの情報が必ず入力されているわけではないので、ない場合は出力しない。
  • それぞれの値を格納する変数を初期化。
  • get_post_custom()で値を取得。
  • 内部的なフィールド以外の値を処理。
  • 値は空白を取り除き、エスケープ処理して、区切り文字がある場合は、<br> に変換。
  • エスケープ処理には、wp_kses() を使用すると便利(許可する HTML 要素を指定できる)
  • get_replaced_string()ではエスケープ処理を含む。
  • 値が入力されているものだけを出力。
<?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)
以下は参考になるサイト