WordPress自定义字段在wp_update_post上丢失,有一个扭曲

时间:2013-04-29 14:46:20

标签: wordpress custom-fields

我使用wp_update_post以编程方式将标题和标签添加到前端的帖子中。我在这个过程中遇到了自定义字段的头发撕裂问题:在最初创建帖子时创建并填充的两个自定义字段之一的值已删除,而另一个完全正常。

这是我用来创建帖子的代码的一部分:

// Set the post ID so that we know the post was created successfully
$post_id = wp_insert_post(
    array(
        'comment_status'=>  'closed',
        'ping_status'   =>  'closed',
        'post_author'   =>  $author_id,
        'post_name'     =>  $slug,
        'post_status'   =>  'publish',
        'post_type'     =>  'custom'
    )
);

// If the post was created properly
if($post_id) {

    // Add meta/custom field data to post
    add_post_meta($post_id, 'custom_random_id', $randomId);
    add_post_meta($post_id, 'viewcount', '1');

然后,这是我用来更新标题和标签的代码:

// Continue if untampered
if($new_hashed_value == $_POST['hash']) {

    $updatePost = array();
    $updatePost['ID'] = $post_id;
    $updatePost['post_title'] = $title;
    $updatePost['tags_input'] = $tags;

    if(wp_update_post($updatePost)) {

        totallyUnrelatedStuff();
    }

我从other posts了解到wp_update_post可能会删除值 - 但在这种情况下,自定义字段' custom_random_id '始终完好无损,' viewcount '总是删除它的值。

我已尝试改变它以便:

if(wp_update_post($updatePost)) {

        update_post_meta($post_id, 'viewcount', '1');
    }

甚至:

if(wp_update_post($updatePost)) {
        delete_post_meta($post_id, 'viewcount');                                    
        add_post_meta($post_id, 'viewcount', '1');
    }

viewcount 字段的值继续被删除。

此外,只是向我扔另一把扳手,

if(wp_update_post($updatePost)) {
        delete_post_meta($post_id, 'viewcount');                                    
        add_post_meta($post_id, 'new_field', 'new_value');
    }

完美无缺。

有人知道发生了什么吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

我有类似的事情发生。

wp_update_post调用操作save_post。由于您使用的是自定义帖子类型,因此您可能需要在save_post操作上运行自定义功能以保存元数据。

问题是,当您调用wp_update_post自定义功能以保存元数据时,将这些值设置为空白,因为它找不到所查找的数据(通常位于$_POST)。

您需要添加一些额外的检查,以查看您的save_post动作函数是否应该运行,在某种程度上,测试是否从Wordpress的“编辑”屏幕调用,或者从前面调用结束形式。

就我而言,这解决了这个问题:

function save_metadata($postid) {   
    global $post;  
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return false;
    if ( !current_user_can( 'edit_page', $post->ID ) ) return false;
    if ( empty($post->ID) || get_post_type( $post->ID ) != 'post_type_here' ) return false;
    if ( !is_admin() ) return false;

    updateMyMetas();
}