wordpress WordPress でカスタムフィールドの値を元にリンクを出力する

2013年4月21日

個別ページやサイドバーにカスタムフィールドの値を元にリンクを出力する方法。

注意点としては、カスタムフィールドの入力などから受け取る値の出力に関しては、必ずエスケープ処理の関数を用いる必要があるということ。

以下は、個別ページの場合に、特定のカスタムフィールドが設定されていれば、サイドバーにカスタムフィールドの名前と値を使ってリンクを出力する例。

カスタムフィールドの名前:参考サイト
カスタムフィールドの値:サイト名と URL をカンマ区切りで指定

以下を sidebar.php に記述する。

<?php if(is_single()): ?>  //個別ページの場合

<div id="ref_list" class="ref_list">
<?php 
$ref_sites = get_post_meta($post->ID, '参考サイト', false);
//カスタムフィールドが空でなければ(空の場合の「''」は false )
if($ref_sites) {  
  echo '<h3>参考サイト</h3>'."\n";
  echo '<ul>'."\n";  //改行文字はダブルクオートで
  //カスタムフィールドの値をサイト名と URL に分割して、出力する
  foreach($ref_sites as $ref_site){
    $values = explode(',', $ref_site);
    echo '<li><a target="_blank" href="';
    //URL はesc_url()でエスケープ処理
    echo esc_url($values[1]) . '" >';
    //サイト名はesc_html()でエスケープ処理
    echo esc_html($values[0]) . '</a></li>'."\n";    
  }
  echo '</ul>'."\n";
}
?>
</div><!-- end of #ref_list -->
get_post_meta($id, $key, $flag)
特定の投稿のカスタムフィールド名(キー)を指定してカスタムフィールドの値を得る
パラメータ:
 $id 投稿の ID(必須):個別ページなどでは、その投稿のIDを $post->ID で取得可能
 $key カスタムフィールド名(オプション):指定しなければ、全てを指定したのと同じ
 $flag 単数/複数フラグ(オプション)
戻り値:カスタムフィールドの値の文字列または配列(デフォルトは配列)
「単数/複数フラグ」がfalse か、省略した場合、指定したキー(カスタムフィールド名)を持つ値からなる配列を返す
「単数/複数フラグ」が true の場合、指定されたキーを持つ最初の値を返す(配列ではない)
カスタムフィールド名が見つからなかったら空の文字列を返す

また、複数のカスタムフィールドが設定されていて、値が同じ形式の場合、それらを出力するには、以下のような方法もある。

例:
カスタムフィールドの名前:参考サイト, 関連サイト, 関連ページ(の3種類がある)
カスタムフィールドの値:サイト名と URL をカンマ区切りで指定

<?php if(is_single()): ?>
<?php
$keys_all = get_post_custom_keys();  //カスタムフィールドの名前を読み込み変数 $keys_all に代入
$keys = array();  //配列変数 $keys を初期化
if(count($keys_all)) {  //変数 $keys_all に要素があれば(count を使わなくても同じだが。)
  foreach($keys_all as $key) {
    //「_」が先頭に付いているフィールドは内部的に使用されているものなので除外する
    //カスタムフィールドの名前($key)が「_」で始まっていなければ
    if( !preg_match('/^_/', $key)) {  
      $keys[] = $key;  //配列 $keys にカスタムフィールドの名前を格納(追加)
    }
  }
}
?>
<?php if(count($keys)): //配列 $keys が空でなければ(カスタムフィールドを持たない投稿もあるため)?>
<div class="ref_list">
<?php 
  foreach($keys as $key) { 
    //カスタムフィールドの名前からそれに対応する値を取得
    $values = get_post_custom_values($key); 
    echo '<h3>'. $key. '</h3>'."\n"; 
    echo '<ul>'."\n";
    //値は配列で返るので foreach で処理
    foreach($values as $value) {
      //それぞれの値を、カンマで分割してサイト名とURLにする
      $elem = explode(',', $value);
      //カスタムフィールドの名前が「関連ページ」の場合以外は「target="_blank"」を追加
      echo ($key == '関連ページ') ? '<li><a href="': '<li><a target="_blank" href="';
      echo esc_url($elem[1]) . '" >';
      echo esc_html($elem[0]) . '</a></li>'."\n";
    }
    echo '</ul>'."\n";
  }

?>
</div><!-- end of #.ref_list -->
<?php endif; ?>
get_post_custom_keys($id)
カスタムフィールドの名前を取得する
パラメータ
 $id 投稿の ID(オプション):パラメータを省略した場合、現在の投稿(固定ページ)のカスタムフィールド名を読み込む
戻り値:カスタムフィールド名の配列
 戻り値の配列には、WordPress の内部で使われているカスタムフィールド名も含まれる。
 内部用のカスタムフィールド名は先頭が「_」(アンダースコア)が付いている。
get_post_custom_values($key, $id)
カスタムフィールド名(キー)を指定してそのカスタムフィールドの値を取得
パラメータ
 $key カスタムフィールド名(必須):値を取得したいカスタムフィールドのキー
 $id 投稿の ID(オプション):値を取得したい投稿の ID。省略時は現在の投稿の ID
戻り値:カスタムフィールドの値の配列
  • count :要素の数を返す
  • preg_match :正規表現によるマッチングを行う

同様のことを「get_post_custom()」を使ってもできる。

<?php 
$fields = get_post_custom();  //は現在の投稿のカスタムフィールドの名前/値をまとめて取得
$my_fields = array();  //独自に作成したカスタムフィールドを格納する配列を初期化
//get_post_custom()では内部的なカスタムフィールドも取得されるので、それら以外を $my_fields に抽出
foreach($fields as $name => $values) {  //それぞれのフィールド名を $name に、値を $values に入れて処理
  if(!(preg_match("/^_/", $name))){  //フィールドが内部的に使用されているもの以外の場合
    $my_fields[$name] = $values;  //それらを配列 $my_fields に(連想配列として)格納(追加)
  }
}
if($my_fields) {  //独自に作成したカスタムフィールドが存在する場合
  echo '<div class="ref_list">'."\n";
  foreach($my_fields as $name => $values) {
    echo '<h3>' . $name . '</h3>'."\n";
    echo '<ul>'."\n";
    //値は配列で返るので foreach で処理
    foreach($values as $value) {
      //それぞれの値を、カンマで分割してサイト名とURLにする
      $elem = explode(',', $value);
      //カスタムフィールドの名前が「関連ページ」の場合以外は「target="_blank"」を追加
      echo ($key == '関連ページ') ? '<li><a href="': '<li><a target="_blank" href="';
      echo esc_url($elem[1]) . '" >';
      echo esc_html($elem[0]) . '</a></li>'."\n";
    }
    echo '</ul>'."\n";

  }
  echo '</div><!-- end of #.list -->';
}
?>
get_post_custom($id)
カスタムフィールドの名前/値をまとめて取得
パラメータ:投稿の ID(オプション)。デフォルトは現在の投稿の ID
戻り値:カスタムフィールド名をキーにした(名前/値からなる)連想配列
戻り値の配列には、WordPress の内部で使われているカスタムフィールドも含まれる。