【问题标题】:wp_update_post make custom field values disappear (Wordpress)wp_update_post 使自定义字段值消失(Wordpress)
【发布时间】:2025-12-21 12:40:12
【问题描述】:

我正在尝试通过 wp_update_post 函数更新我的一篇帖子中的帖子内容。我在这里阅读了文档:http://codex.wordpress.org/Function_Reference/wp_update_post

如果我做对了,我只需要发送帖子 ID 和我想要更新的帖子内容 - 就像在示例中一样 - 这应该是唯一会改变的事情。虽然我附加到这篇文章的自定义字段消失了,但很奇怪。

我传递了以下代码:

if(isset($_POST['submit'])){
    $the_post = array();
    $the_post['ID'] = $_POST['id'];
    $the_post['post_content'] = $_POST['recension'];

    // Update the post into the database
    wp_update_post( $the_post );
}

这是怎么发生的,我该如何解决?

【问题讨论】:

    标签: wordpress custom-fields


    【解决方案1】:

    这是因为在更新帖子时使用了 *wp_insert_post* 函数,并且有“save_post”(1) 动作挂钩,通常用于保存自定义字段数据。

    添加/更新帖子元的标准方法是这样的:

    $post_meta['_mymeta'] = $_POST['_mymeta'];
    
    // Add values of $events_meta as custom fields
    
    foreach ($events_meta as $key => $value) { // Cycle through the $post_meta array!
        if( $post->post_type == 'revision' ) return; // Don't store custom data twice
        if($value && $value != get_post_meta($post->ID, $key, TRUE)) { // If the custom field already has a value
            update_post_meta($post->ID, $key, $value);
        } elseif($value && get_post_meta($post_id, $key, TRUE) == "") { // If the custom field doesn't have a value
            add_post_meta($post->ID, $key, $value, TRUE);
        }
        if(!$value) delete_post_meta($post->ID, $key, get_post_meta($post->ID, $key, TRUE)); // Delete if blank
    }
    

    ...如您所见,它正在检查 *$_POST* 数据,如果它为空或未设置,它会使用空数据更新您的元值或将其完全删除。

    我想您应该使用database update function 或其他一些API 函数来更新帖子字段...例如,这段代码将更新您的帖子菜单顺序:

    $wpdb->update( $wpdb->posts, array( 'menu_order' => 5 ), array( 'ID' => $post->ID ) );
    

    (1) 每当创建或更新帖子或页面时运行,这可能来自导入、帖子/页面编辑表单、xmlrpc 或通过电子邮件发布。操作函数参数:帖子 ID。

    【讨论】:

    • 我认为您的解决方案可能是我更新现有帖子所需要的。我所做的是将变量的值回显到自定义字段中。挑战在于该值显示在编辑屏幕中,但在我更新帖子之前不会在前端生效。我有 1,800 多个帖子,手动更新每个帖子都需要很长时间。您的解决方案之一可以帮助我更新我现有的帖子吗?虽然我不想删除空字段。感谢您对此的任何帮助。
    • 我希望在创建或导入帖子等时运行该功能。如果您有任何想法,请告诉我。谢谢。
    【解决方案2】:

    为避免这种行为,请将 false 设置为第三个参数。 它会停用“插入后挂钩”。

    【讨论】: