つながるnet

Advanced Custom Fieldsで定義したすべてのフィールドを取得する方法

カスタムフィールドを設置するために、これまでは好んでスクラッチしていたのですが、最近は便利なWordPressプラグイン Advanced Custom Fields (以下ACF)を積極的に使うようにしています。やっぱり楽ですからね。

ACFでフィールドタイプを、チェックボックス(checkbox)プルダウン(select)ラジオボタン(radio)にすると、選択肢(choices)を設定することになります。この選択肢(choices)をループ外で全部取得する方法です。

ACFには get_field_object()get_field_objects() というファンクションが準備されています。細かな説明は割愛しますが、投稿と関連付けてなら選択肢を取得することが可能です。今回はループ外で選択肢を取得する方法です。

以下の例では、選択肢だけではなく、フィールドのすべての要素を配列として取得しています。

ACFフィールドのすべての要素を配列として取得

テーマのfunctions.phpにfuncitonを定義:

/***********************************************
 * ACFのフィールドグループ設定を取得
 ***********************************************/
function get_acf_all_fields_in_group ($group_id) {
    $acf_post_custom = get_post_custom($group_id);
    $acf_fields_object = array();
    foreach ( $acf_post_custom as $key => $arr ) {
        if ( preg_match( "/^field_/", $key ) ) {
            $arr = unserialize($arr[0]);
            $field_name = $arr['name'];
            $acf_fields_object[$field_name] = $arr;
        }
    }
    return $acf_fields_object;
}

5行目:ACFのフィールドグループのIDをもとにカスタムフィールドの値を取得
9行目:取得した値はシリアライズされた状態なのでアンシリアライズ
10行目:フィールド名をキーとして配列に格納

使用例

以下は、
地域での絞り込み実装のために、カスタムフィールド(area)の選択肢を取得して、チェックボックスを展開している例です。

// 絞り込み条件の取得
$vars = $_GET;
if ( isset($vars) ) {
    foreach ( $vars as $key => $val ) {
        $$key = $val;
    }
}

// フィールドグループIDを指定してフィールド設定を取得
$acf_all_fields = get_acf_all_fields_in_group (2115);

// チェックボックスとして展開
if ( isset($acf_all_fields['area']) ) : ?>
<form action="" method="get">
    <?php
    foreach ( $acf_all_fields['area']['choices'] as $val ) : ?>
    <label><input type="checkbox" name="area[]" value="<?php echo $val; ?>" <?php if ( isset( $area ) && in_array( $val, $area ) ) echo 'checked'; ?> /> <?php echo $val; ?></label>
    <?php
    endforeach; ?>
    <input type="submit" value="絞り込み" />
</form>
<?php
endif;

2行目~:URLからクエリパラメータをパラメータごとに取得
10行目:前述のfuncitonを使ってフィールド設定を取得(パラメータはフィールドグループの投稿ID)
17行目:検索実行後のcheckedもチェック

他の良い方法がありましたらどうぞお教えください!

直接メールしてみる

お名前 (必須)
メールアドレス (必須)
件名
ご相談内容
画像文字をご入力ください
captcha

コメントを残す