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