ACF(Advanced Custom Fields)は、すごく便利なプラグインなんですが、
自分のやりたいことを実現するためには、ちょっと関数を書く必要があったので、公開してみました。
正直、プラグイン化する必要は、全くないレベルです。
functionsに直接関数を書けばいいだけの話なのですが、
あると便利かもしれないと思い、作ってみました。
ちなみに、関数はこれだけ。
わかる方は、直接 functions.phpに記入した方が早いと思います。
//ACFのそのものの配列を取得
function get_acfe_field($field = null , $acf_id = null){
$acf_fields = get_post_custom( $acf_id );
if( is_array($acf_fields) ){
foreach( $acf_fields as $key=>$item ){
if(strpos($key,'field') !== false){
$item_value = unserialize($item[0]);
if( $item_value['name'] == $field ){
$acfe_fields[ $item_value['name'] ] = $item_value;
}
}
}
}
return $acfe_fields[$field];
}
ACFの、choicesの値を取得する
もしかしたら、同じことでつまづいている方もいるかもしれません。
Advanced Custom Fieldsは、かなり柔軟にフィールドを追加することができます。
その中でも、セレクトボックスや、チェックボックスなどは、
ポータルサイトなどで店舗の値を絞り込ませる値に使ったりするのに、最適かもしれません。
例えば、
「利用できるクレジットカード」というチェックボックスフィールドを
enable_card みたいなフィールド名で追加して、
投稿のループの中で
get_field( 'enable_card' )
とすれば、その投稿に使われているカードのリストを取得することができます。
・・・では、
「すべての選択肢を表示しておいて、
その上で、使えるカードだけをハイライトしたい」
という場合は?
投稿の中なら、get_field_objectを使う
公式サイトの中にも書いてあることですが、
その場合は、get_field_object を使います。
Display value and label
$field = get_field_object('color');
$value = $field['value'];
$label = $field['choices'][ $value ];
こうすることで、$label に、全ての選択肢が入ります。
それを、foreach( $label as $key => $value ) などで出力してあげれば、
全ての選択肢を、配列として利用することができます。
こちらも、非常に参考になります。
Advanced Custom Fieldsでチェックボックスの値を取得する
http://www.wp-tech.net/wordpress_tips/2266/
Advanced Custom Fieldsでセレクトボックスで値とラベルを取得する
投稿以外で、
ACFのチェックボックスの全ての選択肢を出すには?
今回、つまづいたのは、これ。
例えば、ポータルサイトなどでは、「絞り込み機能」を、検索ページに表示することがありますよね。
その際に、Advanced Custom Fieldsのチェックボックスを使って、選択肢を出力したい場合があります。
そんな時に、選択肢を取得するには、どうしたらいいか・・。
色々なドキュメントをみて、思い当たったことは、
「投稿の中」を再現して取得する
というものでした。
つまり、ダミーで1つ、投稿を取得しておいて、
get_field_objectを使って、チェックボックスの全ての値を取得する。
具体的には、
$acf_args = array(
'post_type' => 'post', //取得したい投稿タイプ
'post_per_page' => 1, //とりあえず、1つだけ取得
);
$acf_posts = get_posts($acf_args);
$field_arr = get_field_object('取得したいフィールド名', $acf_posts->ID );
で、$field_arr[‘coices’] とかを使えば
チェックボックスのすべての選択肢を取得することはできます。
でも、ちょっと、面倒ですよね・・・・。
チェックボックスのリストを、
直接 取得できる関数を書いてみた
今回の案件では、カスタムフィールドのチェックボックスの値を絞り込みに使いたかったので
いろんなシーンで、チェックボックスのすべての選択肢を表示する必要がありました。
そこで、シンプルに取得できるように、関数化しました。
ACFフィールド全体のidは、アドレスを見ればわかります。
wp-admin/post.php?post=[ID]&action=edit
ACFのフィールドの、編集画面のアドレスを見ると、こんな感じのURLになっていますよね。
そこで、「今 編集しているフィールドグループのID」を取得することができます。
例えば、1234 がIDで、
その中の「enable_card」の、すべての選択肢を取得したいのであれば、
get_acfe_field( ‘enable_card’ ,’1234′)
で、以下の配列が取得できます。
Array ( [key] => field_キー [label] => フィールドのラベル [name] => フィールド名 [type] => select [instructions] => [required] => 0 [choices] => Array ( [visa] => VISAケア [master] => MASTER [jcb] => JCB [amex] => AMEX ) [default_value] => [allow_null] => 0 [multiple] => 0 [conditional_logic] => Array ( [status] => 0 [rules] => Array ( [0] => Array ( [field] => field_キー [operator] => == [value] => 有り ) ) [allorany] => all ) [order_no] => 0 )
などなど。
つまり、選択肢を使う場合で、例えば、$chose_card に、選択済みの値が入っている場合は
$field_arr = get_acfe_field('enable_card' , '1234' );
foreach($field_arr['choices'] as $key => $value){
echo '<div class="cards';
if( $value == $chose_card ){
echo ' selected';
}
echo ='">';
echo $value . '</div>';
}
みたいにすれば、
すべての選択肢の中から、選んだカードだけ「selected」というclassをつけられます。
ACFのフィールドグループ設定の、すべての値を取得
一番上に書いたコードでは、フィールドを指定して取得していますが
配布プラグインの方では、
‘all’ を指定することで、すべてのフィールドグループの設定値を取得できるようにしています。
つまり
$value = get_acfe_field('all','1234');
とすれば、$value に、フィールドグループの設定が全て入ります。
しかも、それぞれのキーは、フィールド名になっているので
「field_5a01tets5d7c4ca」みたいな、難解なものではなく
$value['enable_card']['coices']
などで、設定を配列で取得することができます。
もっと他に、スマートなやり方があるのかもしれませんが・・・
同じく、困っている方がいらっしゃったら、お使いください。
検証は、PHP7で行っているので、バージョンによる不具合が出たら・・・すみません(汗
ダウンロードは、こちらから。
圧縮ファイルをWordPressにアップロードして、プラグインとして認識いただければ、関数が使えます。
[product_page id=”4367″]