it-swarm.com.de

Wie erhalte ich den Feldschlüssel Advanced Custom Fields aus der WordPress-Datenbank?

Ich verwende erweiterte benutzerdefinierte Felder mit Post-Typ. Ich habe einige ausgewählte benutzerdefinierte Felder und möchte alle Beschriftungsoptionen für jedes Feld anzeigen.

Ich habe es auf diese Weise versucht.

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

A

var_dump ($ Feld)

es scheint leer zu sein:

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

Der einzige Weg, es voll zu bekommen, ist, dass:

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

Aber ich habe 3 Umgebungen und möchte den Feldschlüssel nicht fest codieren.

Gibt es eine Lösung? Danke im Voraus.

17
user1432966

Hier ist eine modifizierte Version der Antwort, die von @BFDatabaseAdmin bereitgestellt wird und mit dem genauen Meta_Wert in "LIKE" übereinstimmt.

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

Ich habe versucht, dies selbst zu tun, also habe ich Nachforschungen angestellt. Es scheint, dass jedes Feld und jede Feldgruppe für ACF in der Datenbank wp_posts als benutzerdefinierte Beitragstypen gespeichert sind. Felder sind 'ACF-Feld' und Gruppen sind 'ACF-Feld-Gruppe'.

Ich konnte diese Funktion verwenden, um den Feldschlüssel abzurufen und update_field ($ field_key, $ value) für Posts zu verwenden, für die das Feld noch nicht vorhanden war.

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

Dann konnte ich verwenden:

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

Um das Feld für Beiträge zu aktualisieren, für die es bereits vorhanden war, oder fügen Sie das Feld und dessen Schlüsselreferenz für Beiträge hinzu, für die das Feld noch nicht vorhanden ist.

6
aaron.cimolini

Ich werfe eine weitere Option in den Mix. Ich denke, die vorhandenen Antworten sind gut, aber wenn Sie nicht die übergeordnete Gruppe betrachten, erhalten Sie niemals einen zuverlässigen Feldschlüssel, da der Feldname in mehreren Gruppen vorhanden sein kann. 

Nehmen wir beispielsweise an, Sie haben zwei benutzerdefinierte Gruppen - eine für den Posttyp books und eine für den benutzerdefinierten Posttyp movies . Beide Gruppen haben ein Feld namens Titel hinzugefügt. 

In der Datenbank werden beide mit post_except = 'title' und post_type = 'acf-field' gespeichert. Zwei Einträge mit demselben post_except, also wird jede Abfrage, die only on post_except verwendet, falsch, als Platzhalter oder nicht. 

Jede Abfrage, die sich auf die Post-ID stützt, ist ebenfalls nicht großartig, da ein Posting möglicherweise nicht immer vorhanden ist. 

Sie müssen also eine Kombination aus Feld und Gruppe übergeben, um den Feldschlüssel aus dem Namen zu erhalten. Dieser Ausschnitt funktioniert gut für mich:

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

Gibt den Feldschlüssel aus Name und Gruppe zurück oder null, wenn keiner vorhanden ist. 

Verwendungszweck:

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 bietet einige einfache Möglichkeiten, mehrere Umgebungen synchron zu halten. Sie können Ihre Felder mit PHP oder einer lokalen JSON-Datei registrieren. Dadurch können Sie get_field_object () mit einem einzigen Feldschlüssel in mehreren Umgebungen verwenden. Sehen:

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

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

Normalerweise mache ich meine ACF-Entwicklung mit der Benutzeroberfläche und exportiere dann alle meine Feldgruppen als PHP, um sie in mehreren Umgebungen bereitzustellen.

UPDATE mit einem einfachen Beispiel: Sie können dies zu functions.php oder einem benutzerdefinierten Plugin hinzufügen, um Ihr Feld programmgesteuert in mehrere Umgebungen einzufügen alle Umgebungen

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

So wie ACF funktioniert, sollten Sie den Schlüssel wirklich verwenden.

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

Msgstr "Sie können und sollten den $ field_key zu 100% verwenden.

Das Problem bei der Verwendung von $ field_name besteht darin, dass ACF das Feldobjekt nicht finden und den Wert nicht speichern kann, wenn die Referenz noch nicht vorhanden ist. Diese Situation würde auftreten, wenn Sie zum Einfügen eines Beitrags Code verwendet hätten.

Es ist auch effizienter, field_key als ersten Parameter in der Funktion update_field zu verwenden, da es die Referenzsuche umgeht. "

3
Nigel Fish

Es gibt keine Möglichkeit, zuverlässig den Schlüssel über den Namen abzurufen, da der Name aus Metadaten besteht und daher offen ist, um geändert zu werden, während der Schlüssel (zumindest ohne manuelle Bearbeitung der Datenbank) nicht ist.

Diese Funktion funktioniert jedoch mit der neuesten Version von ACF und einigen Vorbehalten. ACF erstellt Feldgruppen in Beiträgen als benutzerdefinierten Beitragstyp von ACF. Alle Daten zu den Feldern selbst werden jedoch in der Tabelle post_meta gespeichert.

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

}

Eine Warnung:Da der Feldname als Teil eines Arrays gespeichert wird, müssen Sie sich bei der Suche über SQL auf eine Platzhaltersuche verlassen, die fehleranfällig ist. Solange alle Ihre Felder völlig unterschiedliche Namen haben, ist das in Ordnung, aber wenn Sie beispielsweise ein Feld namens "farm" und ein anderes "farmer" haben, wird dies zu einem Fehler führen, da beide Felder gefunden werden.

Die einzige zuverlässige Methode zum Aktualisieren von Feldern besteht darin, den Schlüssel manuell zu codieren, obwohl dies zugegebenermaßen umständlich ist, was mich hier anfangs veranlasst hat.

2
Sinister Beard

Hatte dasselbe Problem, endete auch mit Schlüssel, der mich gerade zu einer anderen Sackgasse führte, ohne dass es einen normalen Weg gab, den Schlüsselwert zu erhalten.

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

Dabei simuliert acf_updateValue, wie es von ACF beim manuellen Speichern ausgeführt wird. Da nur update_field für ACF-Spalten nicht ausreicht

0
Jiro Matchonson