カスタム分類法を添付した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を追加しようとしましたが、うまくいきません。
新しい投稿は私のカスタム投稿タイプで生成されますが、映画カテゴリを割り当てることはできません。
何か考えてください。
キャッチするコードはどこで$_POST
データを処理しますか?テンプレートファイルにありますか。それともフックで実行される関数にありますか?後者の場合、そしてtaxonomy_exists()
がここで提案しているようにfalse
を返しているのであれば(http://wordpress.stackexchange.com/questions/45798/wp-insert-post-and-custom-taxonomy#comment58402_45810) register_taxonomy
が実行される可能性がある前に再確認してください。フォーム処理関数がinit:10
以降のものにフックされていることを確認してください。
使用する必要はありません。
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()はマイグレーション、フロントエンド提出などの使用例に適しています
isset()
を使用することで、カスタム投稿タイプにwp_insert_post()
を使用できるようになりました。
if ( !isset( $id ) ) {
$id = wp_insert_post( $new, true );
}