tax_input no funciona en wp_insert_post

29 nov 2015, 19:35:09
Vistas: 14.7K
Votos: 10

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

0
Todas las respuestas a la pregunta 7
2
28

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.

29 nov 2015 20:35:00
Comentarios

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.

Chief Alchemist Chief Alchemist
28 dic 2016 18:13:08

¡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.

Studocwho Studocwho
19 sept 2024 22:40:51
0
11

Resulta que tax_input no funciona si un usuario no tiene los permisos necesarios para trabajar con una taxonomía personalizada:

wp-includes/post.php (wp_insert_post): Descripción de la imagen aquí

Así que, o bien añades los permisos correctos o usas wp_set_object_terms()

27 nov 2017 15:18:57
0

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...

21 mar 2019 21:19:27
0

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)),
);
6 oct 2016 16:46:36
1

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);
26 abr 2020 04:55:12
Comentarios

Esto no funcionó para mí

Thiago Dias Thiago Dias
8 nov 2023 00:50:22
0

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 );

    }
20 jun 2019 10:16:52
0

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().

28 jun 2023 15:03:21