WP_TRANSITION_POST_STATUS不会更改帖子的状态

时间:2018-07-14 作者:Amirition

由于某种原因,每次wordpress加载时,我都必须取消发布某些帖子。这是我的代码:

function af_change_post_status() {
    $notpayed_posts = new WP_Query( array(
        \'meta_key\'                  =>  \'_payment\',
        \'meta_value\'                =>  \'0\'
    ) );

    foreach ($notpayed_posts as $notpayed_post) {
        wp_transition_post_status( \'draft\', $notpayed_post->post_status, $notpayed_post);
    }
}
add_action( \'init\', \'af_change_post_status\' );
查询是正确的,它返回了我想要的帖子,但是wp_transition_post_status 功能不工作,我不知道为什么?

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

此函数包含对状态转换后操作挂钩的do\\u action()调用。函数名称中单词的顺序可能会令人困惑–it does not change the status of posts, it only calls actions that can be hooked into by plugin developers.

https://codex.wordpress.org/Function_Reference/wp_transition_post_status

你想要的是wp_update_post, 您还使用WP_Query 错误:

```$notpayed\\u posts=新的WP\\u查询(数组(\'meta\\u key\'=>\'u payment\',\'meta\\u value\'=>\'0\');

while ($notpayed_posts->have_posts()) {
    $notpayed_posts->the_post();
    wp_update_post( array(
        \'ID\' => get_the_ID(),
        \'post_status\' => \'draft\'
    ));
}
wp_reset_postdata();
此外,请记住,您的查询是一个昂贵/非常慢的post meta查询,post meta不是为搜索或查询您要查找的帖子而构建的。考虑一个分类术语。

之后,你也不会更改meta,因此如果有10篇文章匹配,那么每次页面加载都会尝试更新10篇文章,即使它们已经更新了!或者使用update_post_meta 或者在查询中检查post状态,例如。

$notpayed_posts = new WP_Query( array(
    \'post_status\'               =>  \'publish\',
    \'meta_key\'                  =>  \'_payment\',
    \'meta_value\'                =>  \'0\'
) );
此外,使用cron作业,不要在每次加载页面时使用init hook,这对性能非常有害,并且与页面缓存不兼容

SO网友:Krzysiek Dróżdż

这是一个非常简单的错误。您使用WP_Query 获取帖子,但你尝试使用它WP_Query 对象作为数组,但此类不实现迭代器AFAIR。

function af_change_post_status() {
    $notpayed_posts = new WP_Query( array(
        \'meta_key\'                  =>  \'_payment\',
        \'meta_value\'                =>  \'0\'
    ) );

    foreach ($notpayed_posts->posts as $notpayed_post) {
        wp_transition_post_status( \'draft\', $notpayed_post->post_status, $notpayed_post);
    }
}
add_action( \'init\', \'af_change_post_status\' );
如果您的查询正确的话,这应该会更好。

结束