在特定日期之间批量取消发布帖子(例如,从2017年4月及更早)?

时间:2018-10-24 作者:Michael Teller

我需要在特定的时间范围内(也就是说,他们不希望所有的帖子都在特定的日期内)取消发布(即设置为草稿)。

在这种情况下,日期基本上是2017年4月或更早的任何帖子,应设置为草稿。

这是我开始的脚本,作为我的基础,以及我目前采取的方法。我在这个文件“wp includes/plugin.php”中添加了一个“add action”选项我如何针对日期范围内的任何帖子?

    add_action(\'admin_ini\',\'custom_function\');

    function custom_function(){
    $args = array(\'post_type\'=> \'post\',
         \'post_status\' => \'publish\',
         \'posts_per_page\'=>-1
    );
    $published_posts = get_posts($args);

    foreach($published_posts as $post_to_draft){
       $query = array(
        \'ID\' => $post_to_draft->ID,
        \'post_status\' => \'draft\',
       );
       wp_update_post( $query, true );
    }
}

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

通过将2个命令链接在一起,可以在不使用WP CLI编写任何代码的情况下执行此操作:

从2017年4月或更早日期检索所有帖子的命令更新所有帖子并将post\\u状态设置为draft

在2017年4月之前检索所有帖子

我们可以使用wp post list 要做到这一点,我们需要将它们作为post ID传递给下一个命令。More details on this command here.

例如,我们可以获取2017年的所有帖子,如下所示:

wp post list --year="2017" --format=ids
四月的所有帖子如下:

wp post list --year="2017" --month="4" --format=ids
这样,我们可以在2017年的每个月以及之前的每一年运行此命令,并将结果传递到下一个命令

将帖子设置为草稿,我们可以使用wp post update 123 其中123是要更改的帖子的ID

wp post update 123 --post_status="draft"
将两者结合在一起,让我们把2016年的所有职位都定为草案:

wp post update $(wp post list --year="2016" --format=ids) --post_status="draft"
2015年:

wp post update $(wp post list --year="2015" --format=ids) --post_status="draft"
2014年:

wp post update $(wp post list --year="2014" --format=ids) --post_status="draft"

一般说明您将希望通过WP CLI执行此操作,在每个admin_init 钩子会减慢速度,如果它不能在时间限制之前完成它所做的事情,你的站点将永远不会加载WP Admin查询,这些查询对你的站点来说是有害的,并且会破坏你的数据库,或者触发内存不足警告。始终以100或更少的数量批量获取帖子。您始终可以运行第二个和第三个查询,只是不要同时获取它们,永远不要在中修改文件wp-includeswp-admin. WP更新时,您的所有更改都将被覆盖。这是灾难的秘诀。2012年,一家网站因发布客户数据而遭到黑客攻击,公司因此被罚款数百万美元,因为他们修改了WP Core而不是使用主题和插件,然后无法更新以获得新的安全补丁,并认为这没什么大不了的WP_Query 而不是get_posts, 默认情况下,它使用缓存,更接近真实的后期循环缩进,并获得一个编辑器来为您缩进,它将解决整个类别的错误和错误。您问了一个XY问题,您提出了一个问题的解决方案,但不知道如何实现它,还问了如何实现解决方案。你应该问一下如何解决这个问题,如果你问了,一整张可能的答案列表可能已经贴出来了,但现在还不能。E、 g.使用pre_get_posts 在2017年4月之前隐藏帖子(这解决了你的问题,但不是你想要的)

结束