web-dev-qa-db-fra.com

WP insérer taxonomie post et custom

J'ai créé un type de message personnalisé dans mon WordPress associé à une taxonomie personnalisée.

La date de collecte à partir de la fin du site Web en utilisant wp_insert_post ().

Ceci est mon code d'enregistrement personnalisé:

$labels = array(
        'name' => 'Films',
        'singular_name' => 'Film',
        'add_new' => 'Add new',
        'add_new_item' => 'Add new film',
        'edit_item' => 'Edit film',
        'new_item' => 'New film',
        'all_items' => 'All films',
        'view_item' => 'View film',
        'search_items' => 'Search films',
        'not_found' =>  'No films found',
        'not_found_in_trash' => 'No films found in Trash', 
        'parent_item_colon' => '',
        'menu_name' => 'Films'
    );

    $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);

Et voici mon code d'enregistrement de taxonomie personnalisée:

$labels = array(
        'name' => 'Category',
        'singular_name' => 'Film',
        'search_items' =>  'Search Categories',
        'all_items' => 'All Categories',
        'parent_item' => 'Parent Category',
        'parent_item_colon' => 'Parent Category:',
        'edit_item' => 'Edit Category', 
        'update_item' => 'Update Category',
        'add_new_item' => 'Add New Category',
        'new_item_name' => 'New Category Name',
        'menu_name' => 'Category'
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => true,
        'rewrite' => false,
        'capabilities' => array('manage_terms') 
    );

    register_taxonomy('film_category', array('film'), $args);

les deux sont tirés sur l'action init.

Et maintenant, lorsque l'utilisateur final soumet le formulaire à partir du serveur, j'exécute ce code:

$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);

Dans mon formulaire frontal, le champ de sélection "catégorie" contient les catégories de film. J'ai essayé d'ajouter des valeurs d'options les termes ID, les termes Nom et les termes Slug mais cela ne fonctionne pas.

le nouveau message est généré dans mon type de message personnalisé, mais je ne peux pas attribuer les catégories de film.

Une idée s'il vous plaît?

5
Merianos Nikos

Où se trouve le code qui intercepte un processus qui traite les données $_POST? Est-ce dans un fichier modèle? Ou est-ce dans une fonction qui est exécutée sur un crochet? Si c'est ce dernier cas, et si taxonomy_exists() renvoie false comme vous le suggérez ici (http://wordpress.stackexchange.com/questions/45798/wp-insert-post-and-custom-taxonomy#comment58402_45810), il est possible que vous ' vérifier à nouveau avant que register_taxonomy ait eu la chance de s'exécuter. Assurez-vous que votre fonction de traitement de formulaire est associée à quelque chose postérieur à init:10.

2
Boone Gorges

Vous ne devriez pas avoir besoin d'utiliser:

wp_set_object_terms($new_film_id, $_POST['category'], 'film_category', true);

et la valeur du tableau tax_input. le dernier former (Voir la remarque finale) devrait suffire.

Si $_POST['category'] contient les identificateurs de terme, vous devrez les convertir en tant qu'entiers afin qu'ils ne soient pas interprétés comme des slugs.

De même, si $_POST['category'] est un array , l'utilisation de array($_POST['category']) sera alors à l'origine des problèmes. Essayer:

 //Cas as array
 $terms = isset($_POST['category']) ? (array) $_POST['category'] : array();

 //Cast array values as integers if $_POST['category'] contains IDs
 $terms = array_map('intval',$terms);

 $post = array(
      //other arguments

      'tax_input' => array(
            'film_category' => $terms,
        )
    );

    $new_film_id = wp_insert_post($post);

Remarque

Rarst souligne bien les commentaires qui méritent d’être soulignés:

wp_insert_post () recherchera l'autorisation pour tax_input et échouera si l'utilisateur n'est pas connecté. C'est un mauvais choix pour les insertions de publication non typiques. Explicite wp_set_object_terms () est préférable pour les cas d'utilisation tels que les migrations, les soumissions frontales, etc.

3
Stephen Harris

J'ai découvert que l'utilisation de isset() m'autorisait à utiliser wp_insert_post() sur des types de publication personnalisés:

if ( !isset( $id ) ) {
    $id = wp_insert_post( $new, true ); 
}
1
Emilio