J'ai environ 2300 + post dans mon blog est-il possible de changer le statut de publier en brouillon à la fois?
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 );
}
Oui, il est possible de boucler toutes les publications et de changer leur statut en brouillon.
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 );
}
}
Voici un moyen avec WP-CLI:
Nous pouvons lister les published posts (ids) avec:
wp post list --post_status=publish --post_type=post --format=ids
Nous pouvons mettre à jour un message dont l'ID est égal à 123 dans draft status avec:
wp post update 123 --post_status=draft
Nous pouvons combiner ces deux commandes pour modifier en bloc tout published posts en draft , avec:
wp post list --post-status=publish --post_type=post --format=ids \
| xargs -d ' ' -I % wp post update % --post_status=draft
où nous avons défini la variable xargs
delimiter sur ' '
pour qu'elle corresponde au format ids
.
Alternativement, nous pouvons utiliser:
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;
Remarque: n'oubliez pas de sauvegarder avant de tester.
Voici son code avec commentaires explicatifs:
<?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 );
}
}
La solution de @Nabil Kadimi ne fonctionne pas (pour moi). J'ai une erreur de 500. Voici mon code mis à jour.
Aucune garantie! Assurez-vous de créer une sauvegarde 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 );
}
}
vous pouvez modifier le statut de tous les messages directement depuis la base de données.
UPDATE wp_posts SET post_status = 'draft' WHERE post_status = 'publish';