web-dev-qa-db-fra.com

Comment obtenir la clé de champ Advanced Custom Fields de la base de données WordPress?

J'utilise Advanced Custom Fields avec post-type. J'ai quelques champs personnalisés sélectionnés et je veux afficher tous les choix d'étiquettes de chaque champ.

J'ai essayé de cette façon.

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

Faire un

var_dump (champ $)

il semble vide:

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) 
}

La seule façon de l'obtenir est la suivante:

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) 
}

Mais j’ai l’environnement 3 et je ne veux pas coder en dur la clé de champ.

Y-a-t'il une solution? Merci d'avance.

17
user1432966

Voici une version modifiée de la réponse fournie par @BFDatabaseAdmin correspondant à la méta_valeur exacte dans "LIKE"

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);
}
7
Hivenfour

J'essayais juste de le faire moi-même, alors j'ai fait une enquête. Il semble que chaque champ et groupe de champs pour ACF sont stockés dans la table wp_posts de la base de données en tant que types de publication personnalisés. les champs sont 'acf-field' et les groupes sont 'acf-field-group'.

J'ai pu utiliser cette fonction pour que la clé de champ utilise ensuite update_field ($ field_key, $ value) sur les publications qui n'avaient pas déjà le champ.

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';
    ");
}

Ensuite, j'ai pu utiliser:

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

Pour mettre à jour le champ des publications qui l'ont déjà ou bien ajouter le champ et sa référence clé aux publications qui ne l'avaient pas déjà.

6
aaron.cimolini

Je jette une autre option dans le mélange. Je pense que les réponses existantes sont bonnes, mais si vous ne regardez pas le groupe parent, vous n’obtiendrez jamais de clé de champ fiable car le nom du champ peut exister entre plusieurs groupes. 

Par exemple, supposons que vous ayez deux groupes personnalisés - un pour le type de publication books , et un pour le type de publication personnalisé movies . Les deux groupes ont ajouté un champ appelé titre. 

Dans la base de données, les deux sont stockés avec post_except = 'title' et post_type = 'acf-field'. Deux entrées avec le même post_except, ainsi toute requête utilisant seulement sur post_except sera fausse, générique ou non. 

Toute requête reposant sur un identifiant de publication n'est pas excellente non plus, car une publication peut ne pas toujours exister pour passer. 

Vous devez donc transmettre une combinaison de champ et de groupe pour obtenir la clé de champ du nom. Cet extrait fonctionne bien pour moi:

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));
    }
}

Renverra la clé de champ du nom et du groupe, ou NULL s'il n'en existe aucune. 

Usage:

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
4
Chris

ACF fournit des moyens simples pour maintenir la synchronisation de plusieurs environnements. Vous pouvez enregistrer vos champs avec PHP ou un fichier JSON local. Cela vous permettrait de continuer à utiliser get_field_object () avec une seule clé de champ dans plusieurs environnements. Voir:

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

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

Je développe habituellement ACF avec l'interface utilisateur, puis exporte tous mes groupes de champs en tant que PHP à déployer dans plusieurs environnements.

UPDATE avec un exemple simple: Vous pouvez ajouter ceci à functions.php ou à un plugin personnalisé pour ajouter votre champ à plusieurs environnements par programmation .. puis vous appelez get_field_object () avec une clé field_key commune tous les environnements

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',
                ),
            ),
        ),
    ));

}
4
locomo

La façon dont fonctionne ACF doit vraiment utiliser la clé.

from ( http://www.advancedcustomfields.com/resources/get_field_object/ )

"Vous pouvez et devriez utiliser la clé $ field_key 100% du temps.

Le problème lié à l'utilisation de $ field_name est que, si la référence n'existe pas déjà, ACF ne pourra pas trouver l'objet de champ et ne pourra pas enregistrer la valeur. Cette situation se produirait si vous aviez utilisé du code pour insérer une publication.

En outre, il est plus efficace d'utiliser la clé field_key comme premier paramètre de la fonction update_field, car elle contourne la recherche de référence. "

3
Nigel Fish

Il n'y a aucun moyen de fiable de récupérer la clé en utilisant le nom, car le nom est une métadonnée, et donc ouverte à changer, alors que la clé (du moins sans modification manuelle de la base de données) ne l'est pas.

Toutefois, cette fonction fonctionnera avec la version la plus récente d’ACF, avec quelques mises en garde. ACF crée des groupes de champs dans les publications en tant que type de publication personnalisé, mais toutes les données relatives aux champs eux-mêmes sont conservées dans la table 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%';
    ");

}

Un avertissement: parce que le nom du champ est stocké dans un tableau, pour le trouver via SQL, vous devez vous appuyer sur une recherche générique, ouverte aux erreurs. Tant que tous vos champs ont des noms entièrement différents, tout va bien, mais si, par exemple, vous avez un champ appelé "ferme" et un autre appelé "fermier", ceci provoquera une erreur car il trouvera les deux champs.

Le seul moyen fiable de mettre à jour les champs est de coder manuellement la clé, bien que ce soit plutôt maladroit, ce qui m'a amené ici au début.

2
Sinister Beard

Avait le même problème, a également fini par utiliser la clé qui m'a conduit à une autre impasse sans aucun moyen normal d'obtenir une valeur clé, mais heureusement rencontré cela.

Extrait de - 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);
}

Où acf_updateValue simule comment ACF procède lui-même lorsque vous enregistrez manuellement. Puisque seul update_field n'est pas suffisant pour les colonnes ACF

0
Jiro Matchonson