Atașarea datelor taxonomiei la postare cu wp_insert_post
Încerc să implementez un sistem de postare frontend care afișează date taxonomice în mai multe câmpuri dropdown select. Fiecare dintre dropdown-uri este denumit folosind argumentul "name" $arg
în wp_dropdown_categories()
.
wp_dropdown_categories( array(
'taxonomy' => 'location',
'hide_empty' => 0,
'orderby' => 'name',
'order' => 'ASC',
'name' => 'location',
) );
După cum puteți vedea, taxonomia este "location" și numele select-ului este de asemenea "location".
Apoi adaug variabilele pentru fiecare dintre dropdown-urile taxonomiei împreună cu 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'] );
În final, adaug informațiile suplimentare într-un array pregătit pentru a fi trimis prin wp_insert_post()
. Sunt destul de blocat în privința faptului dacă fac lucrul corect adăugând tax_input
în array ca mai jos, deoarece asta am înțeles din codex că trebuie să fac.
'tax-input' => array(
$location,
$sale_rental,
$price
),
Astfel încât totul ajunge să arate așa:
$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 );
Cu toate acestea, când trimit noua postare, toate datele standard ale postării (și tipul meu personalizat de postare) sunt introduse corect, dar taxonomiile nu. În mod evident fac ceva greșit, dar ce anume?

Folosește wp_set_object_terms
după ce ai ID-ul postării pentru fiecare taxonomie:
...
$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' );

Pur și simplu nu știu unde aș fi fără ajutorul tău, a funcționat din prima... mulțumesc mult Bainternet. Marcat ca răspuns

Poți face acest lucru folosind wp_insert_post, dar trebuie să specifici și taxonomia în tax_input
, deci ar trebui să arate astfel:
$item['tax_input'] = array (
'location' => implode( ',', $location ),
'sale_rental' => implode( ',', $sale_rental ),
'price' => implode( ',', $price ),
)
Folosesc implode()
astfel încât $location
să poată fi un array cu mai mulți termeni.
De asemenea, reține că acest lucru funcționează doar pentru taxonomii neierarhice. Pentru taxonomii ierarhice, trebuie să furnizezi un array în loc de un string.

Sursa problemei
După ce am cercetat acest subiect, mi s-a sugerat să verific internalele (ceea ce am și făcut). Pe măsură ce importam postări dintr-un flux extern ca tip de postare personalizat, am setat pur și simplu utilizatorul la -1
(în loc să adaug un utilizator robot). Problema cu care m-am confruntat a fost că wp_insert_post()
cu un tax_input
setat, verifică intern o capabilitate de utilizator, pe care un utilizator inexistent evident nu o are.
SysBot vine în ajutor
Soluția a fost atunci că am scris pluginul SysBot. În acest fel, puteam pur și simplu să atașez utilizatorul SysBot (care are rolul de editor) la acea postare nou creată și totul a funcționat așa cum era de așteptat.
