投稿以外でAdvanced Custom Fieldsのフィールドの値を取得する

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

https://www.advancedcustomfields.com/resources/select/

$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でセレクトボックスで値とラベルを取得する

http://vmemo.blog36.fc2.com/blog-entry-697.html

 

 

投稿以外で、
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にアップロードして、プラグインとして認識いただければ、関数が使えます。

 

こんな開発室も読まれています