WP inserare post și taxonomie personalizată
Am creat un tip de postare personalizat în WordPress asociat cu o taxonomie personalizată.
Postarea colectează date din partea frontală a site-ului folosind wp_insert_post().
Acesta este codul meu de înregistrare a postării personalizate:
$labels = array(
'name' => 'Filme',
'singular_name' => 'Film',
'add_new' => 'Adaugă nou',
'add_new_item' => 'Adaugă film nou',
'edit_item' => 'Editează film',
'new_item' => 'Film nou',
'all_items' => 'Toate filmele',
'view_item' => 'Vezi film',
'search_items' => 'Caută filme',
'not_found' => 'Nu s-au găsit filme',
'not_found_in_trash' => 'Nu s-au găsit filme în Coșul de gunoi',
'parent_item_colon' => '',
'menu_name' => 'Filme'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'taxonomies' => array('film_category'),
'supports' => array(
'title',
'editor'
)
);
register_post_type('film', $args);
Și acesta este codul meu de înregistrare a taxonomiei personalizate:
$labels = array(
'name' => 'Categorii',
'singular_name' => 'Film',
'search_items' => 'Caută categorii',
'all_items' => 'Toate categoriile',
'parent_item' => 'Categoria părinte',
'parent_item_colon' => 'Categoria părinte:',
'edit_item' => 'Editează categoria',
'update_item' => 'Actualizează categoria',
'add_new_item' => 'Adaugă categorie nouă',
'new_item_name' => 'Numele noii categorii',
'menu_name' => 'Categorie'
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'rewrite' => false,
'capabilities' => array('manage_terms')
);
register_taxonomy('film_category', array('film'), $args);
Ambele sunt declanșate la acțiunea init.
Când utilizatorul trimite formularul din partea frontală, execut acest cod:
$post = array(
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_author' => 2,
'post_content' => $_POST['synopsis'],
'post_name' => sanitize_title($_POST['title']),
'post_status' => 'private',
'post_title' => $_POST['title'],
'post_type' => 'film',
'tax_input' => array(
'film_category' => array(
$_POST['category']
)
)
);
$new_film_id = wp_insert_post($post);
wp_set_object_terms($new_film_id, $_POST['category'], 'film_category', true);
În formularul meu din partea frontală am un câmp select "category" care conține categoriile de filme. Am încercat să adaug în valorile opțiunilor ID-ul termenilor, Numele termenilor și Slug-ul termenilor, dar nu funcționează.
Postarea nouă este generată în tipul meu de postare personalizată, dar nu pot atribui categoriile de filme.
Vreo idee, vă rog?

Nu ar trebui să fie nevoie să folosești:
wp_set_object_terms($new_film_id, $_POST['category'], 'film_category', true);
și valoarea matricei tax_input
. Ultima Prima (vezi observația finală) ar trebui să fie suficientă.
Dacă $_POST['category']
conține ID-urile termenilor, va trebui să le convertești în numere întregi pentru a nu fi interpretate ca slug-uri.
De asemenea, dacă $_POST['category']
este o matrice, atunci folosirea array($_POST['category'])
va cauza probleme. Încearcă:
//Conversie în matrice
$terms = isset($_POST['category']) ? (array) $_POST['category'] : array();
//Convertirea valorilor matricei în numere întregi dacă $_POST['category'] conține ID-uri
$terms = array_map('intval',$terms);
$post = array(
//alte argumente
'tax_input' => array(
'film_category' => $terms,
)
);
$new_film_id = wp_insert_post($post);
Observație
Rarst subliniază un aspect important în comentarii care merită evidențiat:
wp_insert_post() va verifica permisiunile pentru tax_input și va eșua dacă utilizatorul nu este autentificat. Nu este o alegere bună pentru inserări de postări netipice, wp_set_object_terms() explicit este mai potrivit pentru cazuri de utilizare precum migrări, trimiteri din front-end, etc.

Bună Stephen Harris. Mulțumesc mult pentru ajutor, dar din păcate încă nu funcționează. Nu știu cu adevărat care este problema. Am eliminat wp_set_object_terms și folosesc doar metoda ta. Ai vreo altă idee? Cu stimă, Merianos Nikos

Rețineți că wp_insert_post()
va verifica permisiunile pentru tax_input
și va eșua dacă utilizatorul nu este autentificat. Nu este o alegere bună pentru inserări de postări non-tipice, wp_set_object_terms()
explicit este mai potrivit pentru cazuri de utilizare precum migrații, trimiteri din front-end, etc.

După o căutare profundă, am observat că taxonomia pare să nu existe. Am afișat $wp_taxonomies și taxonomia există în acea variabilă globală. Dar taxonomy_exists returnează false :(

Unde se află codul care preia și procesează datele din $_POST
? Este într-un fișier de tip template? Sau este într-o funcție care rulează pe un hook? Dacă este al doilea caz, și dacă taxonomy_exists()
returnează false
așa cum sugerezi aici (http://wordpress.stackexchange.com/questions/45798/wp-insert-post-and-custom-taxonomy#comment58402_45810), este posibil să verifici înainte ca register_taxonomy
să aibă șansa să ruleze. Asigură-te că funcția ta de procesare a formularului este conectată la ceva care rulează după init:10
.
