カスタムフィールドの値をフィルターフックで一部置換してテンプレート内で使いたいと思い、方法を調べました。
ADs
「my_meta_key」というフィールドに「1」と入っていたら、テーマ上では「あり」と表示させたい、ということをやりたいです。
カスタムフィールドをフラグとして使ったり、meta_queryで使いたいからカスタムフィールドは数字にしておきたいなど、利用頻度はまぁまぁあるのではないかと思います。
get_post_metaでカスタムフィールドの値を取得し、比較して置換すればよさそうですが以下のコードは上手く動きません。
1 2 3 4 5 6 7 8 |
function edit_metadata_wrong($metadata, $object_id, $meta_key, $single) { $value = get_post_meta($object_id,'my_meta_key',true); if($value == '1'){ $value = 'あり'; } return $value; } add_filter('get_post_metadata', 'edit_metadata_wrong', 10, 4); |
get_post_metaは内部でget_post_metadata関数を実行しているため、フィルターフックが無限ループしてしまいます。
get_post_metadataを介さずカスタムフィールドの値を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function edit_metadata($metadata, $object_id, $meta_key, $single) { $fieldtitle="my_meta_key"; if($meta_key==$fieldtitle&& isset($meta_key)) { global $wpdb; $value = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = $object_id AND meta_key = '".$meta_key."'" ); if($value == '1'){ $value = 'あり'; } } return $value; } add_filter('get_post_metadata', 'edit_metadata', 10, 4); |
以下の記事が参考になりました。
How to hook a filter to catch get_post_meta when alternate a custom field output?
記事中にremove_filter→get_post_meta→add_filterという回答もありますが、こちらは上手く動きませんでした。
functions.phpじゃなくてテンプレート内に書く場合は以下のようになります。
1 2 3 4 5 6 7 |
<?php $value = get_post_meta($post->ID,'my_meta_key',true); if($value == 1){ $value = 'あり'; } echo $value; ?> |
これはこれで問題ないのですが(もっと短く書けるなど見直す点はありますが)、カスタムフィールドの表示箇所が複数ファイル複数箇所に散らばっているとめんどくさそうな感じがします。
フィルターフックによる処理が手っ取り早そうな場合は試してみてください。
ADs
コメントはまだありません。