Adjuntar datos de taxonomía a una entrada con wp_insert_post
Estoy tratando de implementar un sistema de publicación desde el frontend que muestra datos de taxonomía en varios campos desplegables. Cada uno de los desplegables se nombra usando el argumento "name" $arg
en wp_dropdown_categories()
.
wp_dropdown_categories( array(
'taxonomy' => 'location',
'hide_empty' => 0,
'orderby' => 'name',
'order' => 'ASC',
'name' => 'location',
) );
Como puedes ver, la taxonomía es "location" y el nombre del select también es "location".
Luego agrego las variables para cada uno de los desplegables de taxonomía junto con post_title, post_content, etc:
$title = trim( $_POST['wpuf_post_title'] );
$content = trim( $_POST['wpuf_post_content'] );
$tags = wpuf_clean_tags( $_POST['wpuf_post_tags'] );
$customcategory = trim( $_POST['customcategory'] );
$cat = trim( $_POST['cat'] );
$location = trim( $_POST['location'] );
$sale_rental = trim( $_POST['sale_rental'] );
$price = trim( $_POST['price'] );
Finalmente, agrego la información extra en un array listo para ser enviado por wp_insert_post()
. Estoy bastante confundido sobre si estoy haciendo lo correcto al agregar tax_input
en el array como se muestra a continuación, ya que esto es lo que entiendo del codex que necesito hacer.
'tax-input' => array(
$location,
$sale_rental,
$price
),
De modo que todo termina viéndose así:
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => $post_status,
'post_author' => $userdata->ID,
'post_category' => array( $_POST['cat'] ),
'post_type' => $customcategory,
'tags_input' => $tags,
'tax_input' => array(
$location,
$sale_rental,
$price
),
);
$post_id = wp_insert_post( $my_post );
Sin embargo, cuando envío la nueva entrada, todos los datos estándar de la entrada (y también mi tipo de entrada personalizado) se insertan correctamente, pero las taxonomías no. Obviamente estoy haciendo algo mal, ¿pero qué?

Usa wp_set_object_terms
después de tener el ID del post para cada taxonomía:
...
$post_id = wp_insert_post( $my_post );
wp_set_object_terms( $post_id, $location, 'location' );
wp_set_object_terms( $post_id, $sale_rental, 'sale_rental' );
wp_set_object_terms( $post_id, $price, 'price' );

Simplemente no sé dónde estaría sin tu ayuda, funcionó a la primera... muchas gracias Bainternet. Marcado como respondido

Puedes hacerlo usando wp_insert_post, pero debes especificar también la taxonomía en tax_input
, por lo que debería verse así:
$item['tax_input'] = array (
'location' => implode( ',', $location ),
'sale_rental' => implode( ',', $sale_rental ),
'price' => implode( ',', $price ),
)
Yo uso implode()
para que $location
pueda ser un array con múltiples términos.
Además, ten en cuenta que esto solo funciona para taxonomías no jerárquicas. Para taxonomías jerárquicas debes proporcionar un array en lugar de una cadena.

Origen del problema
Después de investigar un poco sobre este tema, me sugirieron que revisara los internos (lo cual hice). Como estaba importando publicaciones desde un feed externo como tipo de publicación personalizada, simplemente establecí el usuario como -1
(en lugar de agregar un usuario bot). El problema con el que me encontré fue que wp_insert_post()
con un tax_input
configurado, verifica internamente la capacidad del usuario, la cual obviamente no tiene un usuario que no existe.
SysBot al rescate
La solución entonces fue que escribí el plugin SysBot. De esta manera, podía simplemente asignar el usuario SysBot (que tiene el rol de editor) a esa nueva publicación y todo funcionó como se esperaba.
