web-dev-qa-db-fra.com

Comment changer le statut de l'article en vrac

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

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

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.

2
birgire

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 );
    }
}
1
Nabil Kadimi

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

    }

}
0
user1551496

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';
0
Unnikrishnan R