tax_input nu funcționează în wp_insert_post - Soluții
Folosesc wp_insert_post și toate câmpurile funcționează, cu excepția tax_input. Este ceva greșit în codul meu?
$customtax = array(
'product_link' => $link,
'product_price' => $price,
'product_description' => $desc );
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'products',
'tax_input' => $customtax
);
Mulțumesc anticipat

Motivul cel mai frecvent este că executați acest cod fără contextul utilizatorului (cron, etc.). În contextul funcției wp_insert_post()
, WordPress va verifica dacă utilizatorul are permisiuni pentru o taxonomie. Lipsa utilizatorului înseamnă lipsa permisiunilor, ceea ce duce la neatribuirea termenilor.
Soluția este să creați mai întâi articolul, apoi să atribuiți termenii acestuia. Când termenii sunt atribuiți explicit prin metode API (cum ar fi wp_set_object_terms()
), verificarea permisiunilor nu este efectuată.

Deci soluția alternativă este să folosești wp_insert_post() fără tax_input și apoi, odată ce acesta este finalizat, să folosești wp_set_object_terms()? Dar dacă acest lucru nu este posibil? De exemplu, un plugin care îți permite să filtrezi argumentele pentru wp_insert_post(), dar nu are niciun hook pentru momentul în care acesta este finalizat. Acest răspuns ar putea funcționa, dar nu pare ideal. Există ceva ciudat în legătură cu wp_insert_post() și 'tax_input'. Cu siguranță, există o soluție curată și corectă.

Mulțumesc! Îmi smulgeam părul din cap întrebându-mă de ce funcționa pentru mine (autentificat), dar nu și pentru utilizatori (neautentificați). (Încerc să adaug un cpt după trimiterea unui formular.) Ar trebui probabil menționat în documentație, pentru că nu este deloc evident.

După cum ai menționat în comentariu că plugin-ul va face filtrele și nu are hook, cred că plugin-ul trebuie să aibă hook-ul wp_insert_post oricum. Altfel, cum inserezi postul?
Răspund la această întrebare după atât de mult timp pentru că am întâmpinat aceeași problemă și am găsit singura soluție posibilă.
$new_id = wp_insert_post($post_arr, true);
$status = wp_set_object_terms($new_id, $term_id, 'location');
Aici, "location" este slug-ul termenului. Poate într-o zi, cineva va găsi acest lucru util..

Când utilizați tax_input pentru inserarea postărilor, asigurați-vă că folosiți ID-ul de taxonomie al termenului, deoarece se pare că slug-urile sau numele sunt ignorate
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'products',
'tax_input' => array('myTax', array(4,458,11478)),
);

Întrebarea este veche, dar tot am petrecut destul de mult timp să înțeleg că inserarea postării (wp_insert_post) arată acest comportament atunci când este folosită în interiorul acțiunii cron.
Inserarea postării și apoi wp_set_object_terms este o soluție bună, totuși, setarea utilizatorului curent înainte de inserarea postării a funcționat și pentru mine
$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);

După cum a menționat @Rarst, WordPress verifică în timpul funcției wp_insert_post() dacă utilizatorul curent are permisiunea de a adăuga termeni de taxonomie. Puteți vedea acest lucru și în post.php Linia:3352
if ( current_user_can( $taxonomy_obj->cap->assign_terms ) ) {
wp_set_post_terms( $post_ID, $tags, $taxonomy );
}
Dacă rulați codul wp_insert_post fără a avea un utilizator autentificat, puteți seta un utilizator curent folosind metoda wp_set_current_user().
$user = get_user_by('ID', $user_id);
if( $user ){
wp_set_current_user( $user_id, $user->user_login );
}

Poate funcția wp_insert_post()
s-a schimbat, sau poate nimeni nu s-a uitat în codul ei, dar răspunsul în prezent este:
$customtax = array(
'myTax' => array(1,2,3),
);
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'products',
'tax_input' => $customtax
);
Unde 1,2,3 sunt ID-urile termenilor taxonomiei.
Și da, utilizatorul curent ar trebui să poată atribui termeni, altfel încercați să folosiți funcția wp_set_object_terms()
după wp_insert_post()
.
