如何更改批量发布状态

时间:2016-10-29 作者:Firefog

我的博客中有大约2300多篇帖子,是否可以一次将状态从发布更改为草稿?

add_action(\'publish_post\', \'check_publish_post\', 10, 2);

function check_publish_post ($post_id, $post) {

    $query = array(
        \'ID\' => $post_id,
        \'post_status\' => \'draft\',
    );
    wp_update_post( $query, true );
}

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

是的,可以循环所有发布帖子并将其帖子状态更改为草稿。

add_action(\'admin_init\',\'wpse_244394\');

function wpse_244394(){
    $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 );  
    }
}

SO网友:birgire

Here\'s a way with WP-CLI:

我们可以列出已发布的帖子(ID):

wp post list --post_status=publish --post_type=post --format=ids 
我们可以通过以下方式将ID为123的帖子更新为草稿状态:

wp post update 123 --post_status=draft
我们可以将这两个命令组合起来,将所有已发布的帖子批量更改为草稿,使用:

wp post list --post-status=publish --post_type=post --format=ids \\
| xargs -d \' \' -I % wp post update % --post_status=draft
我们在哪里设置xargs 分隔符\' \' 匹配ids 总体安排

或者,我们可以使用:

for post_id in $(wp post list --post_status=publish --post_type=post --format=ids); \\ 
do wp post update $post_id --post_status=draft; done;
注意:请记住在测试前备份。

SO网友:Nabil Kadimi

她的是您的代码,带有解释性注释:

<?php

/**
 * Unpublish all posts (set post_status to draft).
 *
 * This code is run only once in a lifetime. 
 */
add_action( \'init\', \'wpse_244394\' );
function wpse_244394(){

    /**
     * Make sure this code is run ever once.
     */
    if ( get_option( \'wpse_244394\' ) ) {
        return;
    }
    update_option( \'wpse_244394\', 1 );


    /**
     * Get pubkushed posts.
     */
    $posts = get_posts( [
        \'post_status\' => \'publish\',
        \'post_type\' => \'post\',
        \'numberposts\' => -1,
    ] );

    /**
     * Unpublish.
     */
    foreach ( $posts as $post ) {
        $post[\'post_status\'] = \'draft\';
        wp_update_post( $post );
    }
}

SO网友:Unnikrishnan R

您可以直接从数据库更改所有post状态。

UPDATE wp_posts SET post_status = \'draft\' WHERE post_status = \'publish\';

SO网友:user1551496

纳比尔·卡迪米的解决方案(对我来说)不起作用。我犯了500个错误。这里是我的更新代码。

No guarantee! Be sure to create SQL Backup!

/**
 * Unpublish all posts (set post_status to draft).
 *
 * This code is run only once in a lifetime. 
 */
add_action( \'init\', \'wpse_244394\' );
function wpse_244394(){

    /**
     * Make sure this code is run ever once.
     */
    if ( get_option( \'wpse_244394\' ) ) {
        return;
    }
    update_option( \'wpse_244394\', 1 );


    /**
     * Get published posts.
     */

     $args = array(
        \'post_type\'      => \'post\',
        \'post_status\'    => \'publish\',
        \'posts_per_page\' => -1
    );
    $posts = get_posts( $args );


    /**
     * Unpublish.
     */
    foreach ( $posts as $post ) {
      $my_post = array(
      \'ID\'           => $post->ID,
      \'post_status\'    => \'draft\',
    );

    // Update the post into the database
      wp_update_post( $my_post );

    }

}

相关推荐

GET_POSTS查询大约需要40秒来执行

我在get\\u帖子中有一个元查询,它需要花很长时间才能完成。它工作得很好,但只是时间太长了。我有一个名为event. 在每个event 发布后,有自定义元数据:post\\U sort\\U日期(事件日期YmdHis 格式,用于排序)我需要做的是获取下一个事件,该事件相对于$year 和$month 变量。所以如果$year = 2021 和$month = 10 (2021 10月)然后应该在2021 11月或之后找到第一个事件。我下面的查询很好,但很慢。执行大约需要40秒,我不知道为什么。$next