Câmpuri personalizate avansate update_field pentru tipul de câmp: Taxonomie
Am nevoie să inserez un post prin wp_insert_post și apoi să adaug post_meta relevante - totuși, administrația WP a fost personalizată cu excelentul ACF.
Știu că pot folosi add_post_meta în acest fel:
add_post_meta( $post_id, 'q_key_type', $q_key_type );
Totuși, pentru a face ACF fericit, este necesar să folosești și funcția "update_field" - astfel:
update_field( "field_52c737a413e07", $q_key_type, $post_id );
Această metodă funcționează bine, dar nu reușesc să înregistrez corect un obiect de tip Taxonomie - pot salva valoarea folosind add_post_meta - când vizualizez noul post, acesta nu recunoaște Taxonomia - valoarea este goală, dar în tabelul postmeta valoarea este stocată corect - ceea ce lipsește este recunoașterea corectă a câmpului.
Pot salva corect câmpuri de tip "Text" și "Utilizator" folosind aceste două metode.
Aici este o imagine cu două rânduri din tabelul post_meta - primele două sunt create de acf - ultimele două manual - par să fie formatate identic:
Am găsit doar o altă referință la același nume de câmp în tabelul post_meta - conține un array cu următoarele date - care pare a fi configurația câmpului pentru acf:
Array (
[key] => field_52c737a413e07
[label] => Tip
[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
)
Deci, întrebarea este - unde mai salvează ACF datele de taxonomie - nu găsesc nimic în tabelele de termeni?

Trebuie să adaug ambele post_meta:
add_post_meta( $insert_q_key_id, 'q_key_type', (int)$q_key_type ); // Tipul Q Key
Și pentru ACF:
update_field( "field_52c737a413e07", (int)$q_key_type, $insert_q_key_id ); // Tipul Q Key
Iar restul răspunsului "ar trebui" să fie acoperit de wp_set_object_terms:
wp_set_object_terms( $insert_q_key_id, (int)$q_key_type, 'q_key_type', true );
Cu toate acestea, această funcție nu este complet disponibilă în momentul în care am nevoie de ea - așa că soluția a fost să creez o înlocuire simplă pentru această funcție:
/**
* înlocuitor simplu pentru wp_set_object_terms, deoarece nu este disponibil în timpul apelului API
*
* @since 0.4
* @global Object $wpdb
* @param integer $object_id
* @param integer $tt_id
* @return Mixed Integer pentru rândul inserat la succes | 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;
}
// dacă nu ##
return false;
}
Pe care o pot apela folosind o instanță de clasă statică (deoarece metoda face parte dintr-o clasă separată în cazul meu...):
Q_Key::q_wp_set_object_terms ( $insert_q_key_id, (int)$q_key_type );

Am descoperit că funcția update_field()
face exact ce am nevoie, nu știu dacă a fost actualizată pentru a face asta. Singurul lucru la care trebuie să fii atent este dacă ai un câmp de tip selectie simplă (dropdown) sau unul care permite selecții multiple - în cazul selecțiilor multiple, trebuie să transmiți un array cu ID-uri de taxonomii.
Exemplu:
$field_key = 'field_xxxxxxxxxxxxxx'; //cheia câmpului tău de taxonomie
$idarray = array("$termid->term_id"); //folosește un array pentru a trimite mai multe ID-uri de termeni. Observă că term_id este între ghilimele, deoarece trebuie să fie string
$postid = ''; //ID-ul postului tău
update_field($field_key, $idarray, $postid);
Funcția update_field()
se va ocupa de serializare automat în funcție de setările câmpului, așa că nu trebuie să te îngrijorezi de altceva.
Am folosit această metodă pentru a actualiza atât câmpuri de taxonomie unice, cât și multiple pe același post, și am testat că pot apoi să interoghez aceste rezultate folosind metodele recomandate de ACF, deci datele sunt introduse corect.
EDIT: un lucru important de reținut - observă că am transformat term_id într-un string prin includerea lui între ghilimele - ACF stochează ID-urile ca string-uri în array-uri serializate, așa că acest lucru este esențial, altfel metodele sugerate de ei pentru interogarea acestor date nu vor funcționa (și când vei edita câmpul prin wp-admin în viitor, acesta va fi convertit înapoi într-un string oricum).

Asigurați-vă că prefixați ID-ul termenului din taxonomia personalizată atunci când utilizați funcția update_field()
.
Exemplu:
$post_id = "event_4"; // event (taxonomie personalizată) ID-ul termenului = 4
update_field( 'my_field', 'my_value', $post_id );
Documentația excelentă a ACF abordează acest lucru în secțiunea 'Actualizarea unei valori din obiecte diferite': https://www.advancedcustomfields.com/resources/update_field/
ACF se ocupă de toate aspectele legate de crearea și sincronizarea câmpurilor personalizate. Nu este nevoie să recreați asta manual cu add_post_meta()
etc.
Am pierdut ore bune în această capcană, chiar mi-ar fi prins bine o notificare RTFM! la fiecare 10 minute. ♂️
