23

投稿タイプで高度なカスタム フィールドを使用しています。選択したカスタム フィールドがいくつかあり、各フィールドからすべてのラベルの選択肢を表示したいと考えています。

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

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

する

var_dump($フィールド)

空に見えます:

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 つの環境があり、フィールド キーをハードコーディングしたくありません。

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

4

8 に答える 8

8

自分でやろうと思ったので調べてみました。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);

すでにフィールドを持っている投稿のフィールドを更新するか、フィールドを追加して、まだフィールドを持っていない投稿への重要な参照です。

于 2015-09-06T04:04:25.093 に答える
8

「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);
}
于 2016-01-21T12:10:34.207 に答える
6

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

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

データベースでは、両方とも と で保存されpost_except = 'title'ますpost_type = 'acf-field'。同じ を持つ 2 つのエントリ。したがって、ワイルドカードであろうとなかろうと、にのみpost_except依存するクエリは間違っています。post_except

投稿が常に存在するとは限らないため、投稿 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
于 2016-12-12T13:31:41.837 に答える
3

ACF が機能する方法では、実際にキーを使用する必要があります。

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

「$field_key は 100% の確率で使用できますし、使用する必要があります。

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

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

于 2014-08-27T17:17:20.053 に答える
2

名前はメタデータであるため、名前を使用してキーを確実に取得する方法はありません。そのため、キーは (少なくともデータベースを手動で編集することなく) 変更することができます。

ただし、この関数は最新バージョンの 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」という名前のフィールドがある場合、両方のフィールドが検出されるためエラーになります。

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

于 2015-09-29T11:16:51.520 に答える