web-dev-qa-db-ja.com

WordPressデータベースから高度なカスタムフィールドフィールドキーを取得する方法?

ポストタイプでAdvanced Custom Fieldsを使用しています。いくつかのカスタムフィールドを選択していて、各フィールドのすべてのラベルの選択肢を表示したいと思います。

私はこの方法を試しました。

$field = get_field_object('hair_color');
$hair = $field["choices"];
    foreach($hair as $value){

やっている

var_dump($ field)

空のように見えます:

array(18) { 
   ["key"] => string(16) "field_hair_color" 
   ["label"] => string(0) "" 
   ["name"] => string(10) "hair_color" 
   ["_name"] => string(10) "hair_color" 
   ["type"]=> string(4) "text" 
   ["order_no"]=> int(1) 
   ["instructions"]=> string(0) "" 
   ["required"]=> int(0) 
   ["id"] => string(20) "acf-field-hair_color" 
   ["class"] => string(4) "text" 
   ["conditional_logic"] => array(3) { 
        ["status"] => int(0) 
        ["allorany"]=> string(3) "all" 
        ["rules"]=> int(0) 
   } 
   ["default_value"] => string(0) "" 
   ["formatting"] => string(4) "html" 
   ["maxlength"] => string(0) "" 
   ["placeholder"] => string(0) "" 
   ["prepend"] => string(0) "" 
   ["append"] => string(0) "" 
   ["value"] => bool(false) 
}

それを完全にする唯一の方法は、次のとおりです。

get_field_object( 'field_51ac9d333d704');

array(17) { 
   ["key"] => string(19) "field_51ac9d333d704" 
   ["label"] => string(13) "Color de pelo" 
   ["name"] => string(10) "hair_color" 
   ["_name"] => string(10) "hair_color" 
   ["type"] => string(6) "select" 
   ["order_no"] => int(9) 
   ["instructions"] => string(27) "Selecciona el color de pelo" 
   ["required"] => int(0) 
   ["id"] => string(20) "acf-field-hair_color" 
   ["class"] => string(6) "select" 
   ["conditional_logic"] => array(3) { 
       ["status"] => int(0) 
       ["rules"] => array(1) { 
           [0] => array(3) { 
               ["field"] => string(19) "field_5195ef9879361" 
               ["operator"] => string(2) "==" 
               ["value"] => string(5) "small" 
           } 
       } 
       ["allorany"] => string(3) "all" 
   } 
   ["choices"] => array(5) { 
        ["bald"] => string(5) "Calvo" 
        ["brown"] => string(8) "Castaño" 
        ["brunette"] => string(6) "Moreno" 
        ["red"] => string(9) "Pelirrojo" 
        ["blonde"] => string(5) "Rubio" 
    } 
    ["default_value"] => string(0) "" 
    ["allow_null"] => int(1) 
    ["multiple"] => int(0) 
    ["field_group"] => int(90679) 
    ["value"]=> bool(false) 
}

しかし、私には3つの環境があり、フィールドキーをハードコーディングしたくありません。

何か解決策はありますか?前もって感謝します。

20
user1432966

これは、「LIKE」の正確なmeta_valueに一致する@BFDatabaseAdminによって提供される変更された回答です。

function get_acf_key($field_name) {
  global $wpdb;
  $length = strlen($field_name);
  $sql = "
    SELECT `meta_key`
    FROM {$wpdb->postmeta}
    WHERE `meta_key` LIKE 'field_%' AND `meta_value` LIKE '%\"name\";s:$length:\"$field_name\";%';
    ";
  return $wpdb->get_var($sql);
}
8
Hivenfour

私がこれを自分でやろうとしているので、調査をしました。 ACFの各フィールドとフィールドグループは、カスタム投稿タイプとしてデータベースのwp_postsテーブルに格納されているようです。フィールドは「acf-field」であり、グループは「acf-field-group」です。

この関数を使用してフィールドキーを取得し、フィールドがまだない投稿でupdate_field($ field_key、$ value)を使用することができました。

function get_acf_key($field_name){
    global $wpdb;

    return $wpdb->get_var("
        SELECT post_name
        FROM $wpdb->posts
        WHERE post_type='acf-field' AND post_excerpt='$field_name';
    ");
}

それから私は使うことができました:

update_field(get_acf_key('my_field_name'), 'some value', $post_id);

既にフィールドがあった投稿のフィールドを更新するか、フィールドを追加して、まだフィールドがなかった投稿へのキー参照を追加します。

7
aaron.cimolini

私は別のオプションをミックスに投入しています。既存の回答は良いと思いますが、親グループを確認しない限り、フィールド名が複数のグループに存在する可能性があるため、信頼できるフィールドキーを取得することはできません。

たとえば、2つのカスタムグループがあるとします。1つは投稿タイプbooks、もう1つはカスタム投稿タイプmoviesです。どちらのグループにも、titleというフィールドが追加されています。

データベースでは、どちらもpost_except = 'title'post_type = 'acf-field'で保存されます。 post_exceptが同じ2つのエントリ。したがって、post_exceptonlyを使用するクエリは、ワイルドカードかどうかにかかわらず、正しくありません。

投稿IDに依存するクエリも適切ではありません。投稿が常に存在するとは限らないためです。

したがって、名前からフィールドキーを取得するには、フィールドとグループの組み合わせを渡す必要があります。このスニペットは私にとってはうまくいきます:

if (! function_exists('acf_field_from_name')) {

    function acf_field_from_name($field, $group)
    {
        global $wpdb;

        return $wpdb->get_var($wpdb->prepare("
            SELECT post.post_name as field_name
            FROM $wpdb->posts AS post
            LEFT JOIN $wpdb->posts AS parent
                ON post.post_parent = parent.id
            WHERE post.post_excerpt = %s
                AND post.post_type = 'acf-field'
                AND parent.post_excerpt = %s
                AND parent.post_type = 'acf-field-group'
        ", $field, $group));
    }
}

名前とグループからフィールドキーを返すか、存在しない場合はnullを返します。

使用法:

acf_field_from_name('title', 'movie-fields'); // returns field_3333333333333

acf_field_from_name('title', 'book-fields'); // returns field_4444444444444

acf_field_from_name('plumbus', 'movie'); // returns null
6
Chris

ACFは、複数の環境の同期を維持するのに役立ついくつかの簡単な方法を提供します-PHPまたはローカルJSONファイルでフィールドを登録できます。これを行うと、単一フィールドでget_field_object()を使い続けることができます複数の環境にわたるキー。以下を参照してください。

http://www.advancedcustomfields.com/resources/register-fields-via-php/

http://www.advancedcustomfields.com/resources/local-json/

私は通常、ユーザーインターフェイスでACF開発を行い、すべてのフィールドグループをPHPとしてエクスポートして、複数の環境に展開します。

UPDATEを簡単な例で:これをfunctions.phpまたはカスタムプラグインに追加して、フィールドをプログラムで複数の環境に追加できます。次に、get_field_objectを呼び出します。 ()すべての環境に共通のfield_key

add_action('acf/init', 'wp123_add_local_acf_fields');
function wp123_add_local_acf_fields() {

    acf_add_local_field_group(array(
        'key' => 'group_1',
        'title' => 'My Group',
        'fields' => array (
            array (
                'key' => 'field_51ac9d333d704',
                'label' => 'Color de pelo',
                'name' => 'hair_color',
                'type' => 'select',
                'instructions' => 'Selecciona el color de pelo'
                'required' => 0,
                'choices' => array (
                    'bald' => 'Calvo',
                    'brown' => 'Castaño',
                    'brunette' => 'Moreno',
                    'red' => 'Pelirrojo',
                    'blonde' => 'Rubio',
                ),
                'default_value' => array (
                ),
                'allow_null' => 1,
                'multiple' => 0,
            )
        ),
        'location' => array (
            array (
                array (
                    'param' => 'post_type',
                    'operator' => '==',
                    'value' => 'post',
                ),
            ),
        ),
    ));

}
5
locomo

ACFの動作方法は、実際にはキーを使用する必要があります。

から( http://www.advancedcustomfields.com/resources/get_field_object/

「いつでも100%$ field_keyを使用できます。

$ field_nameの使用に関する問題は、参照がまだ存在しない場合、ACFはフィールドオブジェクトを見つけられず、値を保存できないことです。この状況は、コードを使用して投稿を挿入した場合に発生します。

また、参照ルックアップをバイパスするため、update_field関数の最初のパラメーターとしてfield_keyを使用する方が効率的です。

3
Nigel Fish

信頼できる方法で名前を使用してキーを取得する方法はありません名前はメタデータであり、したがって変更可能ですが、キーは(少なくとも編集せずに)データベースは手動ではありません)。

ただし、この機能は最新バージョンのACFで機能しますが、いくつかの注意点があります。 ACFはACFのカスタム投稿タイプとして投稿内にフィールドグループを作成しますが、フィールド自体に関するすべてのデータはpost_metaテーブル内に保持されます。

function get_acf_key($field_name) {

    global $wpdb;

    return $wpdb->get_var("
        SELECT `meta_key`
        FROM $wpdb->postmeta
        WHERE `meta_key` LIKE 'field_%' AND `meta_value` LIKE '%$field_name%';
    ");

}

警告:フィールド名は配列の一部として格納されているため、SQLでフィールド名を検索する場合は、信頼する必要があります。エラーが発生しやすいワイルドカード検索。すべてのフィールドの名前がまったく異なる限り問題ありませんが、たとえば「farm」というフィールドと「farmer」というフィールドがある場合、両方のフィールドが検出されるため、エラーが発生します。

フィールドを更新する唯一の信頼できる方法は、手動でキーをコーディングすることですが、これは確かに不格好です。

2
Sinister Beard

正しい方法は、次のように_acf_maybe_get_field_関数を使用することです。

acf_maybe_get_field( 'field_name', false, false );

引数は次のとおりです。_field name_、_post id_(デフォルトは現在の投稿)、最も重要なstrictはデフォルトがtrueですが、falseここで、フィールドオブジェクトがまだ投稿に存在しない場合でも、フィールドオブジェクトを取得します。

参照 フィールド名でプログラム的にACFフィールドキーを取得

同じ問題があり、キーも使用してしまい、キー値を取得する通常の方法がなく、別の行き止まりになってしまいましたが、幸いにもこれに遭遇しました。

- https://wordpress.stackexchange.com/questions/248006/acf-add-fields-values-to-newly-inserted-post から取得

function acf_getValue($fieldname, $post_id){
    if(($value = get_field($fieldname, $post_id)))
        return $value;
    $value = get_post_meta($post_id, $fieldname);
    return $value[0];
}
function acf_updateValue($fieldname, $value, $post_id){
    $field_key = 'field_' . uniqid();
    update_post_meta($post_id, $fieldname, $value);
    update_post_meta($post_id, '_'.$fieldname, $field_key);
    update_field($field_key, $value, $post_id);
}

ここで、acf_updateValueは、手動で保存したときにACF自体によってどのように実行されるかをシミュレートします。 update_fieldだけではACF列には不十分であるため

0
Jiro Matchonson