Come inserire post e tassonomia personalizzata in WordPress
Ho creato un custom post type in WordPress associato a una tassonomia personalizzata.
Il post raccoglie i dati dal front-end del sito web utilizzando wp_insert_post().
Questo è il mio codice di registrazione del Custom post:
$labels = array(
'name' => 'Film',
'singular_name' => 'Film',
'add_new' => 'Aggiungi nuovo',
'add_new_item' => 'Aggiungi nuovo film',
'edit_item' => 'Modifica film',
'new_item' => 'Nuovo film',
'all_items' => 'Tutti i film',
'view_item' => 'Visualizza film',
'search_items' => 'Cerca film',
'not_found' => 'Nessun film trovato',
'not_found_in_trash' => 'Nessun film trovato nel cestino',
'parent_item_colon' => '',
'menu_name' => 'Film'
);
$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);
E questo è il mio codice di registrazione della Tassonomia personalizzata:
$labels = array(
'name' => 'Categorie',
'singular_name' => 'Film',
'search_items' => 'Cerca Categorie',
'all_items' => 'Tutte le Categorie',
'parent_item' => 'Categoria Genitore',
'parent_item_colon' => 'Categoria Genitore:',
'edit_item' => 'Modifica Categoria',
'update_item' => 'Aggiorna Categoria',
'add_new_item' => 'Aggiungi Nuova Categoria',
'new_item_name' => 'Nome Nuova Categoria',
'menu_name' => 'Categoria'
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'rewrite' => false,
'capabilities' => array('manage_terms')
);
register_taxonomy('film_category', array('film'), $args);
Entrambi vengono eseguiti sull'azione init.
E ora quando l'utente finale invia il modulo dal front-end eseguo questo codice:
$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);
Nel mio modulo front-end ho il campo select "category" che contiene le categorie dei film. Ho provato ad aggiungere come valori delle opzioni l'ID dei termini, il nome dei termini e lo slug dei termini ma non funziona.
Il nuovo post viene generato nel mio custom post type, ma non riesco ad assegnare le categorie dei film.
Qualche idea per favore?

Non dovresti aver bisogno di utilizzare:
wp_set_object_terms($new_film_id, $_POST['category'], 'film_category', true);
e il valore dell'array tax_input
. Il secondo primo (vedi nota finale) dovrebbe essere sufficiente.
Se $_POST['category']
contiene gli ID dei termini, dovrai convertirli in interi in modo che non vengano interpretati come slug.
Inoltre, se $_POST['category']
è un array, allora usare array($_POST['category'])
causerà problemi. Prova invece:
//Converti in array
$terms = isset($_POST['category']) ? (array) $_POST['category'] : array();
//Converti i valori dell'array in interi se $_POST['category'] contiene ID
$terms = array_map('intval',$terms);
$post = array(
//altri argomenti
'tax_input' => array(
'film_category' => $terms,
)
);
$new_film_id = wp_insert_post($post);
Nota
Rarst fa un'osservazione importante nei commenti che merita di essere evidenziata:
wp_insert_post() verificherà i permessi per tax_input e fallirà se l'utente non è loggato. Non è la scelta migliore per inserimenti di post non tipici, wp_set_object_terms() esplicito è meglio per casi d'uso come migrazioni, invii da front-end, ecc.

Ciao Stephen Harris. Grazie mille per il tuo aiuto, ma purtroppo ancora non funziona. Non capisco davvero cosa non vada. Ho rimosso il wp_set_object_terms e uso solo il tuo metodo. Hai qualche altra idea? Cordiali saluti, Merianos Nikos

Nota che wp_insert_post()
verificherà i permessi per tax_input
e fallirà se l'utente non è loggato. Non è la scelta migliore per inserimenti di post non tipici, wp_set_object_terms()
esplicito è meglio per casi d'uso come migrazioni, invii da front-end, ecc.

Dopo una ricerca approfondita, ho notato che sembra che la tassonomia non esista. Ho stampato $wp_taxonomies e la tassonomia esiste in quella variabile globale. Ma taxonomy_exists restituisce false :(

Dove si trova il codice che intercetta ed elabora i dati $_POST
? È in un file template? O è in una funzione eseguita su un hook? Se è quest'ultimo caso, e se taxonomy_exists()
restituisce false
come suggerisci qui (http://wordpress.stackexchange.com/questions/45798/wp-insert-post-and-custom-taxonomy#comment58402_45810), è possibile che tu stia verificando prima che register_taxonomy
abbia avuto la possibilità di essere eseguito. Assicurati che la tua funzione di elaborazione del form sia agganciata a qualcosa di successivo a init:10
.
