web-dev-qa-db-fra.com

champs personnalisés avancés update_field pour le type de champ: Taxonomie

J'ai besoin d'insérer un message via wp_insert_post, puis d'ajouter un post_meta pertinent. Cependant, l'administrateur WP a été personnalisé avec l'excellent ACF.

Je sais que je peux add_post_meta de cette façon:

add_post_meta( $post_id, 'q_key_type', $q_key_type );

Cependant, pour rendre ACF heureux, il est également nécessaire d’utiliser la fonction " update_field " - comme ceci:

update_field( "field_52c737a413e07", $q_key_type, $post_id );

Cette méthode fonctionne bien, mais je ne parviens pas à enregistrer correctement un objet Taxonomy. Je peux obtenir la valeur à enregistrer à l'aide de add_post_meta. Lorsque je visualise le nouveau message, il ne reconnaît pas la taxonomie. La valeur est vide, mais dans le postmeta table la valeur est stockée correctement - ce qui manque, c’est la reconnaissance de champ correcte.

Je peux enregistrer des champs de type "Texte" et "Utilisateur" correctement en utilisant ces deux méthodes.

Voici une image de deux lignes dans la table post_meta - les deux premières sont créées par acf - les deux dernières manuellement - elles semblent être formatées de manière identique:

enter image description here

Je ne peux trouver qu'une autre référence au même nom de champ dans la table post_meta - elle contient un tableau avec les données suivantes - ce qui semble être le champ configuré pour acf:

Array (
    [key] => field_52c737a413e07
    [label] => Type
    [name] => q_key_type
    [type] => taxonomy
    [instructions] => 
    [required] => 0
    [taxonomy] => q_key_type
    [field_type] => select
    [allow_null] => 0
    [load_save_terms] => 1
    [return_format] => object
    [conditional_logic] => Array (
        [status] => 0
        [rules] => Array (
            [0] => Array (
                [field] => null
                [operator] => ==
                [value] => 
            )
        )
        [allorany] => all
    )
[order_no] => 3
)

Donc, la question est la suivante: où ACF conserve-t-il les données de taxonomie dans un autre lieu? Je ne trouve rien dans les tableaux de termes?

3
Q Studio

J'ai besoin d'ajouter les deux post_meta:

add_post_meta( $insert_q_key_id, 'q_key_type', (int)$q_key_type ); // Q Key Type

Et pour ACF:

update_field( "field_52c737a413e07", (int)$q_key_type, $insert_q_key_id ); // Q Key Type

Et le reste de la réponse "devrait" être couvert par wp_set_object_terms:

wp_set_object_terms( $insert_q_key_id, (int)$q_key_type, 'q_key_type', true );

Cependant, cette fonction n’est pas entièrement disponible au moment où j’en ai besoin - la réponse a donc été de créer un simple remplacement pour cette fonction:

     /**
     * simple wp_set_object_terms replacement as not available during API call
     * 
     * @since       0.4
     * @global      Object      $wpdb
     * @param       integer     $object_id
     * @param       integer     $tt_id
     * @return      Mixed       Integer of inserted row on success | Boolean false
     */
    public function q_wp_set_object_terms( $object_id = null, $tt_id = null )
    {

        if ( ! $object_id || ! $tt_id ) { return false; }

        global $wpdb; 

        if ( $wpdb->insert( $wpdb->term_relationships, array( 'object_id' => (int)$object_id, 'term_taxonomy_id' => (int)$tt_id ) ) ) {

            return $wpdb->insert_id;

        }

        // if not ##
        return false;

    }

Que je peux appeler en utilisant une instance de classe statique (car la méthode fait partie d'une classe séparée dans mon cas ...):

Q_Key::q_wp_set_object_terms ( $insert_q_key_id, (int)$q_key_type );
3
Q Studio

J'ai trouvé que la fonction update_field() fait réellement le travail pour moi, je ne sais pas si elle a été mise à jour depuis pour que cela se produise. Tout ce que vous devez surveiller, c’est que si vous avez un champ à choix unique (sélection) ou un champ autorisant des sélections multiples, vous devez passer par un tableau d’ID de taxonomie, s’il s’agit de multiples.

Par exemple:

$field_key = 'field_xxxxxxxxxxxxxx';   //the field key of your chosen taxonomy field
$idarray = array("$termid->term_id");  //use an array to pass it multiple term IDs. Note that the term_id is in quotes, as it needs to be a string
$postid = '';                          //your post ID

update_field($field_key, $idarray, $postid);

La fonction update_field() gérera automatiquement la sérialisation en fonction des paramètres sur le terrain, de sorte que vous n’aurez plus à vous soucier de rien.

J'ai utilisé cette méthode pour mettre à jour des champs de taxonomie uniques et multiples sur le même enregistrement de publication et j'ai vérifié que je pouvais ensuite interroger ces résultats à l'aide des méthodes recommandées par ACF. Il est donc essentiel que les données soient correctement enregistrées. .

EDIT: une chose à garder à l'esprit, vous remarquerez que j'ai transformé le term_id en une chaîne en l'enveloppant entre guillemets - ACF stocke les identifiants sous forme de chaînes dans des tableaux sérialisés. Il est donc essentiel ou leur propose d'interroger ces données. ne fonctionnera pas (et quand vous finirez le champ par le biais de wp-admin à l'avenir, cela le changera de toute façon).

0
boboshady