web-dev-qa-db-ja.com

WP 投稿とカスタム分類の挿入

カスタム分類法を添付したWordPressでカスタム投稿タイプを作成しました。

Wp_insert_post()を使用して、Webサイトの終わりからのポスト収集日。

これは私のカスタム投稿登録コードです。

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

これが私のカスタム分類登録コードです。

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

どちらもinitアクションで起動します。

そして今、エンドユーザーがフロントエンドからフォームを送信するとき、私はそのコードを実行します:

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

私のフロントエンドフォームでは、私は映画のカテゴリーを含む「カテゴリー」選択フィールドを持っています。オプションの値に用語ID、用語Name、用語Slugを追加しようとしましたが、うまくいきません。

新しい投稿は私のカスタム投稿タイプで生成されますが、映画カテゴリを割り当てることはできません。

何か考えてください。

5
Merianos Nikos

キャッチするコードはどこで$_POSTデータを処理しますか?テンプレートファイルにありますか。それともフックで実行される関数にありますか?後者の場合、そしてtaxonomy_exists()がここで提案しているようにfalseを返しているのであれば(http://wordpress.stackexchange.com/questions/45798/wp-insert-post-and-custom-taxonomy#comment58402_45810) register_taxonomyが実行される可能性がある前に再確認してください。フォーム処理関数がinit:10以降のものにフックされていることを確認してください。

2
Boone Gorges

使用する必要はありません。

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

および tax_input配列値。の 後者 前の (最後のコメントをご覧ください) で十分です。

$_POST['category']にIDという用語が含まれている場合は、スラッグとして解釈されないように、それらを整数としてキャストする必要があります。

$_POST['category'] array の場合もarray($_POST['category'])を使用すると問題が発生します。試してください:

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

リマーク

強調表示する必要があると私が思うコメントでは、Rarstが良い指摘をしています。

wp_insert_post()はtax_inputの許可をチェックし、ユーザがログインしていない場合は失敗します。非典型的な投稿挿入には不適切な選択です。明示的なwp_set_object_terms()はマイグレーション、フロントエンド提出などの使用例に適しています

3
Stephen Harris

isset()を使用することで、カスタム投稿タイプにwp_insert_post()を使用できるようになりました。

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