Как изменить статус массового сообщения

У меня есть 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 ); } 

Solutions Collecting From Web of "Как изменить статус массового сообщения"

Да, можно зациклировать все публикации и изменить статус сообщения на черновик.

 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 ); } } 

У вас код с пояснительными комментариями:

 <?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 ); } } 

Вот путь с WP-CLI:

Мы можем перечислить опубликованные сообщения (ids) с помощью:

 wp post list --post_status=publish --post_type=post --format=ids 

Мы можем обновить сообщение с идентификатором 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; 

Примечание. Не забудьте выполнить резервное копирование перед тестированием.

вы можете изменить весь статус сообщения непосредственно из базы данных.

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

Решение от @Nabil Kadimi не работает (для меня). У меня ошибка 500. Здесь мой обновленный код.

Без гарантии! Обязательно создайте резервную копию SQL!

 /** * 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 ); } }