WP插入帖子和自定义分类

时间:2012-03-16 作者:KodeFor.Me

我在WordPress中创建了一个自定义的帖子类型,并附带了一个自定义的分类法。

使用wp\\u insert\\u post()从网站的“发件人”结尾处获取帖子收集日期。

这是我的自定义后期注册代码:

$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);
两者都是在初始化操作时激发的。

现在,当最终用户从前端提交表单时,我执行该代码:

$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、术语名称和术语Slug,但没有效果。

新帖子是在我的自定义帖子类型中生成的,但我无法指定电影类别。

有什么想法吗?

3 个回复
最合适的回答,由SO网友:Boone Gorges 整理而成

捕捉进程的代码在哪里$_POST 数据是否在模板文件中?或者它是在钩子上运行的函数中?如果是后者,如果taxonomy_exists() 正在返回false 正如你在这里所建议的(http://wordpress.stackexchange.com/questions/45798/wp-insert-post-and-custom-taxonomy#comment58402_45810),很可能您之前检查过register_taxonomy 有机会跑了。确保表单处理函数连接到的时间晚于init:10.

SO网友:Stephen Harris

您不需要使用:

wp_set_object_terms($new_film_id, $_POST[\'category\'], \'film_category\', true);
and 这个tax_input 数组值。后者应足够了(请参见尾语)。

如果$_POST[\'category\'] 包含术语ID,您需要将它们转换为整数,以便它们不会被解释为slug。

也如果$_POST[\'category\'] 是一个数组,然后使用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\\u insert\\u post()将检查tax\\u输入的权限,如果用户未登录,则会失败。对于非典型的后期插入,这是一个错误的选择,显式wp\\u set\\u object\\u terms()更适合于迁移、前端提交等用例

SO网友:Emilio

我发现使用isset() 允许我使用wp_insert_post() 在自定义帖子类型上:

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

结束

相关推荐