個別ページやサイドバーにカスタムフィールドの値を元にリンクを出力する方法。
注意点としては、カスタムフィールドの入力などから受け取る値の出力に関しては、必ずエスケープ処理の関数を用いる必要があるということ。
以下は、個別ページの場合に、特定のカスタムフィールドが設定されていれば、サイドバーにカスタムフィールドの名前と値を使ってリンクを出力する例。
カスタムフィールドの名前:参考サイト
カスタムフィールドの値:サイト名と 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 -->
また、複数のカスタムフィールドが設定されていて、値が同じ形式の場合、それらを出力するには、以下のような方法もある。
例:
カスタムフィールドの名前:参考サイト, 関連サイト, 関連ページ(の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()」を使ってもできる。
<?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 -->'; } ?>