0

我正在使用 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();
    }

我从其他帖子中了解到 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');
    }

完美运行。

有人会知道发生了什么吗?

谢谢!

4

1 回答 1

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();
}
于 2014-01-10T00:54:04.723 回答