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″]