Associare i dati della tassonomia al post con wp_insert_post
Sto cercando di implementare un sistema di pubblicazione frontend che mostra i dati della tassonomia in diversi campi select dropdown. Ciascuno dei dropdown viene nominato utilizzando l'argomento "name" $arg
in wp_dropdown_categories()
.
wp_dropdown_categories( array(
'taxonomy' => 'location',
'hide_empty' => 0,
'orderby' => 'name',
'order' => 'ASC',
'name' => 'location',
) );
Come puoi vedere la tassonomia è "location" e anche il nome del select è "location".
Successivamente aggiungo le variabili per ciascuno dei dropdown delle tassonomie insieme a post_title, post_content ecc:
$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'] );
Infine aggiungo le informazioni extra in un array pronto per essere inviato da wp_insert_post()
. Sono abbastanza incerto se sto facendo la cosa giusta aggiungendo tax_input
nell'array come mostrato sotto, dato che questo è ciò che ho capito dal codex che devo fare.
'tax-input' => array(
$location,
$sale_rental,
$price
),
Così che alla fine appare tutto in questo modo:
$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 );
Tuttavia, quando invio il nuovo post, tutti i dati standard del post (e anche il mio custom post type) vengono inseriti correttamente ma le tassonomie no. Ovviamente sto facendo qualcosa di sbagliato, ma cosa?

Utilizza wp_set_object_terms
dopo aver ottenuto l'ID del post per ciascuna tassonomia:
...
$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' );

Non so proprio dove sarei finito senza il tuo aiuto, ha funzionato al primo colpo... mille grazie Bainternet. Contrassegnato come risolto

Puoi farlo utilizzando wp_insert_post, ma devi specificare anche la tassonomia in tax_input
, quindi dovrebbe apparire così:
$item['tax_input'] = array (
'location' => implode( ',', $location ),
'sale_rental' => implode( ',', $sale_rental ),
'price' => implode( ',', $price ),
)
Uso implode()
in modo che $location
possa essere un array con più termini.
Inoltre, nota che questo funziona solo per tassonomie non gerarchiche. Per tassonomie gerarchiche devi fornire un array invece di una stringa.

Origine del problema
Dopo alcune ricerche su questo argomento, mi è stato suggerito di controllare gli interni (cosa che ho fatto). Durante l'importazione di articoli da un feed esterno come custom post type, avevo semplicemente impostato l'utente a -1
(invece di aggiungere un utente bot). Il problema in cui mi sono imbattuto era che wp_insert_post()
con un tax_input
impostato, controlla internamente una capability dell'utente, che ovviamente un utente inesistente non possiede.
SysBot come soluzione
La soluzione è stata scrivere il plugin SysBot. In questo modo ho potuto semplicemente associare l'utente SysBot (che ha il ruolo di editor) al nuovo articolo creato e tutto ha funzionato come previsto.
