Come inserire post e tassonomia personalizzata in WordPress

16 mar 2012, 13:42:34
Visualizzazioni: 16K
Voti: 5

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?

2
Commenti

Avevi verificato che $_POST['category'] contenesse dati validi in quel punto? Avevi provato il tuo codice in modalità dry run con dati di test, senza la parte front-end?

Rarst Rarst
16 mar 2012 13:53:29

Controllo i miei dati con print_r un passo dopo l'assegnazione e ci sono i dati corretti.

KodeFor.Me KodeFor.Me
16 mar 2012 13:57:17
Tutte le risposte alla domanda 3
4

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.

16 mar 2012 15:04:09
Commenti

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

KodeFor.Me KodeFor.Me
16 mar 2012 15:26:09

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.

Rarst Rarst
16 mar 2012 15:33:13

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 :(

KodeFor.Me KodeFor.Me
16 mar 2012 15:51:49

@Rarst penso che dovresti pubblicarlo come risposta separata. Molto bello.

Christine Cooper Christine Cooper
8 ago 2015 16:47:17
1

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.

16 mar 2012 15:58:28
Commenti

Boone Gorges !!!! Sei semplicemente perfetto !!!!!! Ha funzionato per me. Fino ad ora chiamavo la funzione che salva i miei dati immediatamente, e ora ho agganciato quella funzione all'hook init e ha funzionato !! :) Grazie mille :)

KodeFor.Me KodeFor.Me
16 mar 2012 16:06:48
1

Ho scoperto che utilizzando isset() mi ha permesso di usare wp_insert_post() sui custom post types:

if ( !isset( $id ) ) {
    $id = wp_insert_post( $new, true ); 
}
10 mar 2015 21:58:19
Commenti

Per favore spiega perché questa risposta risolve la domanda.

kaiser kaiser
11 mar 2015 02:05:55