投稿(カスタム投稿)で、イベントの各種の情報をカスタムフィールドに入力して、それらを出力する場合などの利用方法のメモ。
訂正:カスタムフィールドの値に <br> は記述できますし、改行して記述することもできます。
//区切り文字を他の文字(スペースや'<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つの場合(区切文字がない場合)はそのまま返す
}
}
[/code]
<h3>カスタムフィールドの値を出力</h3>
<ul>
<li>それぞれの情報が必ず入力されているわけではないので、ない場合は出力しない。</li>
<li>それぞれの値を格納する変数を初期化。</li>
<li>get_post_custom()で値を取得。</li>
<li>内部的なフィールド以外の値を処理。</li>
<li>値は空白を取り除き、エスケープ処理<del datetime="2014-06-17T18:14:15+00:00">して、区切り文字がある場合は、<br> に変換。</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; ?>