advanced custom fields update_field per il tipo di campo: Tassonomia
Devo inserire un post tramite wp_insert_post e poi aggiungere i relativi post_meta - tuttavia, l'admin di WP è stato personalizzato con l'ottimo ACF.
So che posso aggiungere post_meta in questo modo:
add_post_meta( $post_id, 'q_key_type', $q_key_type );
Tuttavia, per far funzionare correttamente ACF, è necessario utilizzare anche la funzione "update_field" - in questo modo:
update_field( "field_52c737a413e07", $q_key_type, $post_id );
Questo metodo funziona bene, ma non riesco a far registrare correttamente un oggetto Tassonomia - posso salvare il valore usando add_post_meta, ma quando visualizzo il nuovo post non riconosce la Tassonomia - il valore appare vuoto, anche se nella tabella postmeta il valore è salvato correttamente - manca il riconoscimento corretto del campo.
Riesco a salvare correttamente campi di tipo "Testo" e "Utente" usando questi due metodi.
Ecco un'immagine di due righe nella tabella post_meta - le prime due sono create da acf - le ultime due manualmente - appaiono formattate in modo identico:
Ho trovato solo un altro riferimento allo stesso nome di campo nella tabella post_meta - contiene un array con i seguenti dati - che sembrano essere la configurazione del campo per acf:
Array (
[key] => field_52c737a413e07
[label] => Tipo
[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
)
Quindi, la domanda è - dove altro sta salvando ACF i dati della tassonomia - non trovo nulla nelle tabelle dei termini?

Devo aggiungere entrambi i post_meta:
add_post_meta( $insert_q_key_id, 'q_key_type', (int)$q_key_type ); // Tipo di Q Key
E per ACF:
update_field( "field_52c737a413e07", (int)$q_key_type, $insert_q_key_id ); // Tipo di Q Key
E il resto della risposta "dovrebbe" essere coperto da wp_set_object_terms:
wp_set_object_terms( $insert_q_key_id, (int)$q_key_type, 'q_key_type', true );
Tuttavia, questa funzione non è completamente disponibile nel momento in cui ne ho bisogno - quindi la soluzione è stata creare un semplice sostituto per questa funzione:
/**
* semplice sostituto di wp_set_object_terms poiché non disponibile durante la chiamata API
*
* @since 0.4
* @global Object $wpdb
* @param integer $object_id
* @param integer $tt_id
* @return Mixed Intero della riga inserita in caso di successo | Booleano 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;
}
// se non ##
return false;
}
Che posso chiamare usando un'istanza di classe statica (poiché il metodo fa parte di una classe separata nel mio caso...):
Q_Key::q_wp_set_object_terms ( $insert_q_key_id, (int)$q_key_type );

Ho scoperto che la funzione update_field()
fa effettivamente al caso mio, non so se sia stata aggiornata da allora per renderlo possibile. L'unica cosa a cui devi prestare attenzione è se hai un campo a scelta singola (select) o uno che consente selezione multipla - nel caso di selezione multipla devi passare un array di ID tassonomici, fondamentalmente.
Ad esempio:
$field_key = 'field_xxxxxxxxxxxxxx'; //la chiave del campo della tua tassonomia scelta
$idarray = array("$termid->term_id"); //usa un array per passare più ID di termini. Nota che il term_id è tra virgolette, poiché deve essere una stringa
$postid = ''; //il tuo ID del post
update_field($field_key, $idarray, $postid);
La funzione update_field()
gestirà automaticamente la serializzazione in base alle impostazioni del campo, quindi non devi preoccuparti di altro.
Ho usato questo metodo per aggiornare sia campi tassonomici singoli che multipli sullo stesso record di post, e ho verificato che posso poi interrogare quei risultati utilizzando i metodi raccomandati da ACF, quindi i dati vengono inseriti correttamente.
MODIFICA: una cosa da tenere a mente, noterai che ho convertito il term_id in una stringa racchiudendolo tra virgolette - ACF memorizza gli ID come stringhe negli array serializzati, quindi questo è essenziale altrimenti i loro metodi suggeriti per interrogare questi dati non funzioneranno (e quando andrai a modificare il campo tramite wp-admin in futuro, lo cambierà comunque in una stringa).

Assicurati di prefissare l'ID del termine della tua tassonomia personalizzata quando usi la funzione update_field()
.
Esempio:
$post_id = "event_4"; // event (tassonomia personalizzata) ID del termine = 4
update_field( 'my_field', 'my_value', $post_id );
La fantastica documentazione di ACF ne parla nella sezione 'Aggiornare un valore da oggetti diversi': https://www.advancedcustomfields.com/resources/update_field/
ACF gestisce tutta la parte relativa alla creazione e sincronizzazione dei campi personalizzati. Non c'è bisogno di ricrearla manualmente con add_post_meta()
ecc.
Ho perso ore in questo tunnel senza uscita, avrei davvero bisogno di una notifica RTFM! ogni 10 minuti. ♂️
