tax_input no funciona en wp_insert_post
Estoy usando wp_insert_post y todos los campos funcionan excepto tax_input. ¿Hay algo mal en mi código?
$customtax = array(
'product_link' => $link, // Enlace del producto
'product_price' => $price, // Precio del producto
'product_description' => $desc ); // Descripción del producto
$my_post = array(
'post_title' => $title, // Título del post
'post_content' => $content, // Contenido del post
'post_type' => 'products', // Tipo de post
'tax_input' => $customtax // Entradas de taxonomía
);
Gracias de antemano

La razón más común es que ejecutes este código sin contexto de usuario (cron, etc). Dentro del contexto de wp_insert_post()
, WordPress verificará si el usuario tiene permisos para una taxonomía. Sin usuario equivale a sin permisos, lo que resulta en que no se asignen términos.
La solución es crear primero el post y luego asignarle los términos. Cuando los términos se asignan explícitamente mediante un método API (como wp_set_object_terms()
), no se realiza la verificación de permisos.

Entonces, la solución alternativa es usar wp_insert_post() sin el tax_input y luego, una vez completado, usar wp_set_object_terms()? Pero ¿qué pasa si eso no es posible? Por ejemplo, un plugin que te permite filtrar los argumentos para wp_insert_post() pero no tiene un hook para cuando eso se complete. Esta respuesta podría funcionar pero se siente lejos de ser ideal. Hay algo peculiar acerca de wp_insert_post() y 'tax_input'. Definitivamente, debería haber una solución limpia y definitiva.

¡Gracias! Me estaba arrancando los pelos preguntándome por qué funcionaba para mí (logueado) y no para los usuarios (no logueados). (Estoy intentando añadir un CPT después de un envío de formulario). Probablemente debería mencionarse en la documentación, porque no es nada obvio.

Como mencionaste en el comentario que el plugin manejará los filtros y no tiene hook, creo que el plugin debería tener el hook wp_insert_post de todas formas. De lo contrario, ¿cómo insertarías el post? Respondo esto después de tanto tiempo porque me enfrenté al mismo problema y encontré la única solución.
$new_id = wp_insert_post($post_arr, true);
$status = wp_set_object_terms($new_id, $term_id, 'location');
Aquí "location" es el slug del término. Algún día esto le será útil a alguien...

Al usar tax_input para la inserción de posts, asegúrate de usar el ID de la taxonomía del término, ya que los slugs o nombres parecen ser descartados
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'products',
'tax_input' => array('myTax', array(4,458,11478)),
);

La pregunta es antigua, pero aún así pasé bastante tiempo para darme cuenta de que insertar un post (wp_insert_post) muestra este comportamiento cuando se usa dentro de una acción cron.
Insertar el post y luego usar wp_set_object_terms es una buena solución alternativa, sin embargo, establecer el usuario actual antes de insertar el post también funcionó para mí
$user_id = 1;
$user = get_user_by( 'id', $user_id );
wp_set_current_user( $user_id, $user->user_login);
$new_id = wp_insert_post($my_post);

Como mencionó @Rarst, WordPress verifica durante wp_insert_post() si el usuario actual tiene permiso para agregar términos de taxonomía. También puedes verlo en post.php Línea:3352
if ( current_user_can( $taxonomy_obj->cap->assign_terms ) ) {
wp_set_post_terms( $post_ID, $tags, $taxonomy );
}
Si estás ejecutando el código wp_insert_post sin tener un usuario conectado, puedes establecer un usuario actual utilizando el método wp_set_current_user().
$user = get_user_by('ID', $user_id);
if( $user ){
wp_set_current_user( $user_id, $user->user_login );
}

Quizás la función wp_insert_post()
ha cambiado, o tal vez nadie ha revisado su código, pero la respuesta actualmente es:
$customtax = array(
'myTax' => array(1,2,3),
);
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'products',
'tax_input' => $customtax
);
Donde 1,2,3 son los IDs de los términos de la taxonomía.
Y sí, el usuario actual debe tener permisos para asignar términos, de lo contrario intenta usar la función wp_set_object_terms()
después de wp_insert_post()
.
