为什么wp_UPDATE_POST()不更新POST_STATUS字段?

时间:2012-10-08 作者:moraleida

我正在使用此位从前端插入/更新自定义帖子类型。日期是从自定义jquery日期选择器设置的。

    if (strtotime($date) < strtotime(\'tomorrow\')) {
            $newpostdata[\'post_status\'] = \'publish\';
    } elseif (strtotime($date) > strtotime(\'today\')) {
            $newpostdata[\'post_status\'] = \'future\';
            $newpostdata[\'post_date\'] = date(\'Y-m-d H:i:s\', strtotime($date));
    }

    if (\'insert\' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif (\'edit\' == $operation) {
        $newpostdata[\'ID\'] = $post_id;
        $err = wp_update_post($newpostdata);
    }
This works 首次发布帖子时,请将其正确设置为publishfuture, 有正确的日期。

This doesn\'t work 编辑同一篇文章时,无论是从publishfuture 反之亦然。其他所有内容都已正确更新,但post状态/future\\u日期除外。

UPDATE Oct. 9th 我开始觉得这可能是个bug,so i started a conversation at the wp-hackers mailing list, 关于这个。链接上有一些新的安装测试结果。

<小时>

OTHER FAILED ATTEMPTS:

我试着离开post_status 决定wp_insert_post() 使用:

elseif (\'edit\' == $operation) {
        $newpostdata[\'post_status\'] = \'\';
        $newpostdata[\'ID\'] = $post_id;
        $err = wp_update_post($newpostdata);
    }
这会将post状态设置为draft 在维护请求的日期时。

我也试过打电话wp_transition_post_status() 再次(在wp\\u insert\\u post()中调用一次):

elseif (\'edit\' == $operation) {
        $newpostdata[\'ID\'] = $post_id;
        $err = wp_update_post($newpostdata);
        wp_transition_post_status($old_status, $status, $post_id);
    }
但这似乎也不起作用。

我的想法快用完了。有什么线索吗?

6 个回复
最合适的回答,由SO网友:moraleida 整理而成

答案再简单不过了。

正如Otto 在wp黑客列表中,问题是我没有设置post_date_gmt 使用时wp_update_post().

最终代码如下所示:

if ( $post_date < strtotime( "tomorrow" ) ) {
        $status = \'publish\';    
        $newpostdata[\'post_status\'] = $status;
        $newpostdata[\'post_date\'] = date( \'Y-m-d H:i:s\',  $post_date );

        // Also pass \'post_date_gmt\' so that WP plays nice with dates
        $newpostdata[\'post_date_gmt\'] = gmdate( \'Y-m-d H:i:s\', $post_date );

    } elseif ( $post_date > strtotime( \'today\' ) ) {
        $status = \'future\';    
        $newpostdata[\'post_status\'] = $status;
        $newpostdata[\'post_date\'] = date( \'Y-m-d H:i:s\', $post_date );

        // Also pass \'post_date_gmt\' so that WP plays nice with dates
        $newpostdata[\'post_date_gmt\'] = gmdate( \'Y-m-d H:i:s\', $post_date );
    }

    if (\'insert\' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif (\'edit\' == $operation) {
        $newpostdata[\'ID\'] = $post_id;
        $err = wp_update_post($newpostdata);
    }

SO网友:mindlogixtech

我还使用wp_update_post() , 但它在WordPress 3.9上运行不好post_status 清空并删除所有自定义字段。因此,我使用wpdb 班我希望这对你们所有人都有用:

$wpdb->query( 
    $wpdb->prepare( 
        "UPDATE $wpdb->posts SET post_status = \'draft\' WHERE ID = %d", 
        $post_id 
    )
);    
这在我的localhost和hosting上都很好。

SO网友:Sethmatics

我们一直在更新帖子状态,下面是一个示例,说明我们如何允许用户(在构建的前端编辑器上)通过将广告更改为草稿来“暂停”广告:

if ($action == \'pause\') {
        $my_post = array();
        $my_post[\'ID\'] = $aid;
        $my_post[\'post_status\'] = \'draft\';
        wp_update_post($my_post);
        $action_msg = __(\'Ad has been paused\', \'mytheme\');
}

SO网友:Nayem Majhar

$newpostdata[\'post\\u date\']=日期(\'Y-m-d H:i:s\',$post\\u date);

这将返回php 1970的第一个起始日期,使用strotime将字符串转换为时间

$newpostdata[\'post\\u date\']=日期(\'Y-m-d H:i:s\',strotime(\'post\\u date));

SO网友:William Ode

您需要添加"edit_date" => true在wp\\u update\\u post数组中

SO网友:rambillo

这不是OP的问题,但作为其他人研究类似问题的重要参考点wp_update_post() 不更新post_status ...

正如上面的评论中提到的@adrianthedev,请注意自定义帖子状态的最大长度是20个字符。

https://developer.wordpress.org/reference/functions/register_post_status/#comment-3927

当超过20个字符时,您可以使用register_post_status(), 但当前无法将帖子设置为与一起使用wp_update_post(), 至少从WordPress v5开始。5.1

结束

相关推荐