web-dev-qa-db-fra.com

Rétrograder l'utilisateur du rôle qui permet la post-création

Je suis un administrateur d'un blog multi-auteurs. J'implémente un système de surveillance qui exige que je rétrograde un utilisateur d'un "auteur" (ce rôle lui permet de créer une publication personnalisée) et le ramène au "lecteur" si je pense que c'est un compte spam ou s'ils le sont. enfreindre les règles du site.

Après avoir modifié leur rôle à l'aide de l'écran d'administrateur, comment puis-je supprimer automatiquement tous les messages qu'ils ont publiés, sans avoir à les faire défiler et à les trouver moi-même?

Merci beaucoup

EDIT en utilisant les conseils des réponses ci-dessous :

add_action( 'set_user_role', 'wpse98904_remove_demoted_user_posts', 10, 2 );
function wpse98904_remove_demoted_user_posts( $demoted_author_id, $role ) {
 // In here you'd search for all the posts by the user

 $args = array(
            'numberposts' => -1,
            'author' => $demoted_author_id,
            'post_type' => 'custom_post',
            // So if your custom post type is named 'xyz_book', then use:
            // 'post_type' => 'xyz_book',
 );
 $demoted_author_posts = get_posts( $args );
 foreach( $demoted_author_posts as $p ) {
     // delete the post (actually Trash it)
     if($role == 'subscriber') {
     wp_trash_post( $p->ID);
     // To force the deletion (ie, bypass the Trash):
     // wp_delete_post( $p->ID, true );
     }
 }
}

J'ai utilisé wp_trash_post pour supprimer les événements, car l'ajout de 'false' à wp_delete_post n'a pas fonctionné pour moi.

1
Adzay

Vous pouvez ajouter des actions au hook set_user_role :

add_action( 'set_user_role', 'wpse98904_remove_demoted_user_posts', 10, 2 );
function wpse98904_remove_demoted_user_posts( $demoted_author_id, $role ) {
     if( 'subscriber' == $role ) {
         // In here you'd search for all the posts by the user
         $args = array(
                'numberposts' => -1,
                'author' => $demoted_author_id,
                'post_type' => '{your custom post type name}',
                // So if your custom post type is named 'xyz_book', then use:
                // 'post_type' => 'xyz_book',
         );
         $demoted_author_posts = get_posts( $args );
         foreach( $demoted_author_posts as $p ) {
             // delete the post (actually Trash it)
             wp_delete_post( $p->ID );
             // To force the deletion (ie, bypass the Trash):
             // wp_delete_post( $p->ID, true );
         }
     }
}

Référence

set_user_role hook - Codex

set_user_role accrocher dans WP Trac

wp_delete_post() - Codex

2
Pat J

Les rôles des utilisateurs sont modifiés par l'objet WP_User qui déclenche la fonction set_role (). À la fin de cette fonction, à la ligne 815 de wp-includes/capacités.php, il y a une action à connecter à: do_action( 'set_user_role', $this->ID, $role );

Ainsi, dans votre functions.php ou dans un plug-in, vous pouvez récupérer ces données lorsque le hook se déclenche après la mise à jour des capacités de l'utilisateur et supprimer toutes les publications d'un utilisateur avec wp_delete_post .

add_action('set_user_role','myfunc',10,2);
function myfunc($user_id,$role) {
    if($role == 'subscriber') { // or whatever you want
        $posts = get_posts('numberposts=-1&author='.$user_id);
        foreach($posts as $post) {
            wp_delete_post($post->ID,true);
        }
    }
}

Maintenant, soyez prudent, car tel quel, cet extrait supprimera définitivement le message. Si vous souhaitez simplement le déplacer dans la corbeille, définissez le deuxième paramètre ou wp_delete_post sur false.

1
Andrew Bartel