tax_input non funziona con wp_insert_post
Sto utilizzando wp_insert_post e tutti i campi funzionano tranne tax_input. C'è qualcosa di sbagliato nel mio codice?
$customtax = array(
'product_link' => $link, // Link del prodotto
'product_price' => $price, // Prezzo del prodotto
'product_description' => $desc // Descrizione del prodotto
);
$my_post = array(
'post_title' => $title, // Titolo del post
'post_content' => $content, // Contenuto del post
'post_type' => 'products', // Tipo di post personalizzato
'tax_input' => $customtax // Tassonomie personalizzate
);
Grazie in anticipo

La ragione più comune è che esegui questo codice senza un contesto utente (cron, ecc.). All'interno del contesto di wp_insert_post()
WordPress verificherà se l'utente ha i permessi per una tassonomia. Nessun utente significa nessun permesso e quindi nessun termine assegnato.
La soluzione alternativa è creare prima l'articolo, poi assegnare i termini. Quando i termini sono assegnati esplicitamente tramite un metodo API (come wp_set_object_terms()
) il controllo dei permessi non viene eseguito.

Quindi la soluzione alternativa è usare wp_insert_post() senza tax_input e poi, una volta completato, utilizzare wp_set_object_terms()? Ma cosa succede se non è possibile? Ad esempio, un plugin che permette di filtrare gli argomenti per wp_insert_post() ma non ha un hook per quando l'operazione è completata. Questa risposta potrebbe funzionare ma sembra tutt'altro che ideale. C'è qualcosa di strano riguardo a wp_insert_post() e 'tax_input'. Sicuramente esiste una soluzione pulita e definitiva.

Grazie! Mi stavo strappando i capelli chiedendomi perché funzionasse per me (loggato) e non per gli utenti (non loggati). (Sto cercando di aggiungere un CPT dopo l'invio di un modulo.) Probabilmente dovrebbe essere menzionato nella documentazione, perché non è affatto ovvio.

Come hai detto nel commento che il plugin gestisce i filtri e non ha hook, penso che il plugin debba comunque avere l'hook wp_insert_post. Altrimenti come inserisci il post? Rispondo dopo così tanto tempo perché ho affrontato lo stesso problema e ho trovato l'unica soluzione possibile.
$new_id = wp_insert_post($post_arr, true);
$status = wp_set_object_terms($new_id, $term_id, 'location');
dove location è lo slug del termine. Un giorno qualcuno troverà questo codice utile...

Quando si utilizza tax_input per l'inserimento di un post, assicurati di usare l'ID della tassonomia, poiché sembra che gli slug o i nomi vengano ignorati
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'products',
'tax_input' => array('myTax', array(4,458,11478)),
);

La domanda è vecchia, ma ho comunque impiegato un bel po' di tempo per capire che wp_insert_post mostra questo comportamento quando viene utilizzato all'interno di un'azione cron.
Inserire il post e poi utilizzare wp_set_object_terms è un buon workaround, tuttavia, impostare l'utente corrente prima di inserire il post ha funzionato anche per me
$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);

Come ha detto @Rarst, WordPress verifica durante la funzione wp_insert_post() se l'utente corrente ha il permesso di aggiungere termini di tassonomia. Puoi vedere questo controllo anche nel file post.php alla riga 3352:
if ( current_user_can( $taxonomy_obj->cap->assign_terms ) ) {
wp_set_post_terms( $post_ID, $tags, $taxonomy );
}
Se stai eseguendo il codice wp_insert_post senza avere un utente autenticato, puoi impostare un utente corrente utilizzando il metodo wp_set_current_user().
$user = get_user_by('ID', $user_id);
if( $user ){
wp_set_current_user( $user_id, $user->user_login );
}

Forse la funzione wp_insert_post()
è cambiata, o forse nessuno ha controllato il suo codice, ma la risposta al giorno d'oggi è:
$customtax = array(
'myTax' => array(1,2,3),
);
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'products',
'tax_input' => $customtax
);
Dove 1,2,3 sono gli ID dei termini della tassonomia.
E sì, l'utente corrente dovrebbe essere in grado di assegnare i termini, altrimenti prova a usare la funzione wp_set_object_terms()
dopo wp_insert_post()
.
