Wordpress:使用 wp_insert_post() 填充自定义帖子类型字段

Posted

技术标签:

【中文标题】Wordpress:使用 wp_insert_post() 填充自定义帖子类型字段【英文标题】:Wordpress: Using wp_insert_post() to fill custom post type fields 【发布时间】:2015-11-04 19:20:45 【问题描述】:

我创建了一个自定义帖子类型wrestling,并使用高级自定义字段创建了相应的自定义字段。现在,我希望用户在前端填写此自定义表单,以便在提交时,数据将在仪表板的自定义帖子类型中自动更新。为此,我创建了一个自定义页面并为其分配了一个自定义模板,其中包含所需的表单。用户应该填写四个 html 表单字段,分别命名为 namevenuemain_eventfee

我使用高级自定义字段创建的自定义表单字段分别命名为promotion_namevenuemain_event_price。现在,为了将用户在前端输入的数据填充到仪表板的自定义帖子类型字段中,我尝试使用wp_insert_post()函数如下:

$post_information = array(
        'promotion_name' => $_POST['name'],
        'venue' => $_POST['venue'],
        'main_event_' => $_POST['main_event'],
        'price' => $_POST['fee'],
        'post_type' => 'wrestling',
    );

    wp_insert_post( $post_information );

但是,在用户提交表单后,我的自定义帖子类型中确实出现了一个新条目(no_title),但自定义表单字段仍然为空(见下图:)

我确定这是因为我没有正确使用 wp_insert_post() 来更新自定义帖子类型。我真的很感谢这里的一些帮助。谢谢。

PS:这就是我在functions.php 中定义我的自定义帖子类型的方式:

<?php 
function wrestling_show_type()

    register_post_type('wrestling',
                    array('labels' => array('name' => 'Wrestling Shows', 'singular_name' => 'Wrestling Show'),
                        'public' => true,
                        'has_archive' => true,
                        'rewrite' => array('slug' => 'wrestling')));

    flush_rewrite_rules();

add_action('init', 'wrestling_show_type');
?>

【问题讨论】:

【参考方案1】:

如果您使用过 ACF,则应使用其 API 与字段进行交互。有一种名为update_field() 的方法可以完全满足您的需求。该方法需要 3 个参数:

update_field($field_key, $value, $post_id)

$field_key 是 ACF 为您创建的每个字段提供的 ID。这张图片取自他们自己的文档,向您展示了如何获取它:

编辑: $field_key 也将接受字段名称。

$value$post_id 非常简单,它们代表您要设置字段的值,以及您要更新的帖子。

在你的情况下,你应该做一些事情来检索这个$post_id。幸运的是,这就是 wp_insert_post() 返回的内容。所以,你可以这样做:

$post_information = array(
    //'promotion_name' => $_POST['name'],
    'post_type' => 'wrestling'
);

$postID = wp_insert_post( $post_information ); //here's the catch

有了 ID,事情就简单了,只需为您要更新的每个字段调用 update_field()

update_field('whatever_field_key_for_venue_field', $_POST['venue'], $postID);
update_field('whatever_field_key_for_main_event_field', $_POST['main_event'], $postID);
update_field('whatever_field_key_for_fee_field', $_POST['fee'], $postID);

所以基本上你要做的是先创建帖子,然后用值更新它。

我在functions.php 文件中做了这种事情,而且效果很好。从我所见,我认为您正在某种模板文件中使用此例程。我认为它会正常工作,您只需确保 ACF 插件已激活即可。

编辑:

我忘记了promotion_name 字段。我在$post_information 中评论了这一行,因为它不起作用。您应该改用update_field(),就像其他 3 个一样。

update_field('whatever_field_key_for_promotion_name_field', $_POST['name'], $postID);

【讨论】:

我设法使用add_post_meta() 函数更新了我的表单字段,我认为这与update_field() 函数完全相似,对吧? 我认为它最终会这样做,但我会坚持使用插件 API,因为它与插件创建的字段更一致。如果您有不同类型的字段,例如 WYSIWYG 编辑器或子字段,使用 add_post_meta() 可能会变得非常棘手,那么为什么不让插件为您完成这项工作呢? 哦,好吧,我会尝试修改我的代码,这次改用update_field() 方法。谢谢。 是的,如果您发现任何问题,请告诉我 您好,但是如果您在 localhost 上开发然后发布到生产环境,生产环境中的相同字段会有不同的密钥吗?那么'update_field'会崩溃吗?

以上是关于Wordpress:使用 wp_insert_post() 填充自定义帖子类型字段的主要内容,如果未能解决你的问题,请参考以下文章

wordpress 评价|wordpress 好用吗?完整评价与介绍

什么是WordPress?

wordpress是啥

我们可以使用 WordPress 或将 WordPress 与 ASP.NET 集成吗?

Wordpress 使用 Wordpress 将 ajax 值传递到特定页面

wordpress留言插件哪个好?怎么使用?下图是怎么做到的?