Advanced Custom Fields: actualizar campo de tipo Taxonomía con update_field
Necesito insertar una publicación mediante wp_insert_post y luego agregar los post_meta relevantes. Sin embargo, el administrador de WP ha sido personalizado con el excelente plugin ACF.
Sé que puedo usar add_post_meta de esta manera:
add_post_meta( $post_id, 'q_key_type', $q_key_type );
Sin embargo, para que ACF funcione correctamente, también es necesario usar la función "update_field" así:
update_field( "field_52c737a413e07", $q_key_type, $post_id );
Este método funciona bien, pero no puedo hacer que un objeto de Taxonomía se registre correctamente. Puedo guardar el valor usando add_post_meta, pero cuando veo la nueva publicación no reconoce la Taxonomía. El valor aparece vacío, aunque en la tabla postmeta el valor se almacena correctamente. Lo que falta es el reconocimiento correcto del campo.
Puedo guardar campos de tipo "Texto" y "Usuario" correctamente usando estos dos métodos.
Aquí hay una imagen de dos filas en la tabla post_meta - las primeras dos son creadas por ACF y las últimas dos manualmente - parecen estar formateadas idénticamente:
Solo puedo encontrar una referencia más al mismo nombre de campo en la tabla post_meta - contiene un array con los siguientes datos - que parecen ser la configuración del campo para 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
)
Entonces, la pregunta es: ¿dónde más está guardando ACF los datos de taxonomía? No encuentro nada en las tablas de términos.

Necesito agregar ambos post_meta:
add_post_meta( $insert_q_key_id, 'q_key_type', (int)$q_key_type ); // Tipo de Q Key
Y para ACF:
update_field( "field_52c737a413e07", (int)$q_key_type, $insert_q_key_id ); // Tipo de Q Key
Y el resto de la respuesta "debería" estar cubierto por wp_set_object_terms:
wp_set_object_terms( $insert_q_key_id, (int)$q_key_type, 'q_key_type', true );
Sin embargo, esta función no está completamente disponible en el momento que la necesito, así que la solución fue crear un reemplazo simple para esta función:
/**
* Reemplazo simple de wp_set_object_terms ya que no está disponible durante la llamada API
*
* @since 0.4
* @global Object $wpdb
* @param integer $object_id
* @param integer $tt_id
* @return Mixed Entero de la fila insertada en éxito | 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;
}
// si no ##
return false;
}
Que puedo llamar usando una instancia de clase estática (ya que el método es parte de una clase separada en mi caso...):
Q_Key::q_wp_set_object_terms ( $insert_q_key_id, (int)$q_key_type );

He descubierto que la función update_field()
realmente hace el trabajo por mí, no sé si se ha actualizado desde entonces para que eso suceda. Lo único que debes tener en cuenta es si tienes un campo de selección única (select) o uno que permita múltiples selecciones; básicamente, necesitas pasar una matriz de IDs de taxonomía si es múltiple.
Por ejemplo:
$field_key = 'field_xxxxxxxxxxxxxx'; //la clave del campo de tu campo de taxonomía elegido
$idarray = array("$termid->term_id"); //usa una matriz para pasar múltiples IDs de términos. Nota que el term_id está entre comillas, ya que debe ser una cadena
$postid = ''; //tu ID de publicación
update_field($field_key, $idarray, $postid);
La función update_field()
manejará la serialización por ti automáticamente según la configuración del campo, así que no tienes que preocuparte por nada más.
He utilizado este método para actualizar campos de taxonomía tanto individuales como múltiples en el mismo registro de publicación, y he comprobado que luego puedo consultar esos resultados utilizando las formas recomendadas por ACF, por lo que definitivamente está ingresando los datos correctamente.
EDIT: algo a tener en cuenta, notarás que he convertido el term_id en una cadena envolviéndolo entre comillas: ACF almacena los IDs como cadenas en matrices serializadas, por lo que esto es esencial o las formas sugeridas para consultar estos datos no funcionarán (y cuando vayas a editar el campo a través de wp-admin en el futuro, lo cambiará de nuevo a una cadena de todos modos).

Asegúrate de prefijar el ID del término de tu taxonomía personalizada cuando uses la función update_field()
.
Ejemplo:
$post_id = "evento_4"; // event (taxonomía personalizada) ID del término = 4
update_field( 'mi_campo', 'mi_valor', $post_id );
La excelente documentación de ACF habla sobre esto en la sección 'Actualizar un valor desde diferentes objetos': https://www.advancedcustomfields.com/resources/update_field/
ACF maneja todo lo relacionado con la creación y sincronización de campos personalizados. No necesitas recrearlo tú mismo con add_post_meta()
etc.
Perdí horas en este agujero de conejo, realmente necesitaría una notificación RTFM! cada 10 minutos. ♂️
