web-dev-qa-db-de.com

Herabstufung des Benutzers von einer Rolle, die die Nacherstellung ermöglicht

Ich bin Administrator eines Blogs mit mehreren Autoren. Ich implementiere ein Überwachungssystem, bei dem ich einen Benutzer von einem "Autor" (mit dieser Rolle kann er einen benutzerdefinierten Beitrag verfassen) auf die "Leser" -Rolle zurückstufen muss, wenn ich denke, dass es sich um ein Spam-Konto handelt, oder wenn dies der Fall ist Website-Regeln zu brechen.

Wie kann ich nach dem Ändern der Rolle über den Administratorbildschirm festlegen, dass alle von ihnen erstellten Beiträge automatisch gelöscht werden, ohne dass ich scrollen und sie selbst suchen muss?

Danke vielmals

BEARBEITEN mit Hilfe der folgenden Antworten :

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

Ich habe wp_trash_post verwendet, um die Ereignisse zu verwerfen, da das Hinzufügen von 'false' zu wp_delete_post für mich nicht funktioniert hat.

1
Adzay

Sie können dem Hook set_user_role Aktionen hinzufügen:

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

Referenz

set_user_role hook - Codex

set_user_role Haken in WP Trac

wp_delete_post() - Codex

2
Pat J

Benutzerrollen werden durch das WP_User-Objekt geändert, das die Funktion set_role () auslöst. Am Ende dieser Funktion in Zeile 815 von wp-includes /abilities.php gibt es eine Aktion, mit der Sie sich verbinden können: do_action( 'set_user_role', $this->ID, $role );

Also können Sie in Ihrer functions.php oder in einem Plugin diese Daten erfassen, wenn der Hook nach dem Update der Benutzerfähigkeit ausgelöst wird, und alle Posts eines Benutzers mit wp_delete_post löschen.

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

Jetzt sei vorsichtig, denn wie es ist, löscht dieses Snippet den Beitrag für immer. Wenn Sie es einfach in den Papierkorb verschieben möchten, ändern Sie den zweiten Parameter oder wp_delete_post in false.

1
Andrew Bartel