web-dev-qa-db-ja.com

投稿の作成を許可する役割からユーザーを格下げ

私は複数著者のブログの管理者です。私はそれがスパムアカウントであると思う場合、または彼らがそうである場合、私が '作者'(この役割は彼らがカスタム投稿をすることを可能にする)から 'reader'役割にユーザを格下げすることを要求する監視システムを実装していますウェブサイトの規則を破る。

管理画面を使用して役割を変更した後、自分で作成した投稿をスクロールして自分で見つけなくても自動的に削除するにはどうすればよいですか。

どうもありがとう

下記の回答からのアドバイスを使用して編集してください

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

Wp_delete_postに 'false'を追加してもうまく機能しないため、wp_trash_postを使用してイベントを破棄しました。

1
Adzay

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

参照

set_user_role フック - Codex

set_user_role フック_ WP Trac

wp_delete_post() - コーデックス

2
Pat J

ユーザーの役割は、set_role()関数を起動するWP_Userオブジェクトによって変更されます。 wp-includes/capabilities.phpの815行目のその関数の終わりにはフックするアクションがあります:do_action( 'set_user_role', $this->ID, $role );

ですから、functions.phpやプラグインで、ユーザー機能の更新後にフックが起動したときにそのデータを取得し、 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);
        }
    }
}

さて、このスニペットは透過的に投稿を削除するので注意してください。ゴミ箱に移動するだけの場合は、2番目のパラメータまたはwp_delete_postをfalseに変更します。

1
Andrew Bartel