web-dev-qa-db-ja.com

'user_meta'に基づいてすべてのユーザーと投稿を削除する方法?

私はそれが機関(WPユーザー)、トレーナー(WPユーザー)、研修生(WPユーザー)、コース(カスタム投稿)と通知(カスタム投稿)を持っている小さなワードプレスアプリケーションを開発しました。すべてのアプリケーションは正常に動作していますが、私が研究所を削除した場合、すべての情報はトレーナー、研修生、通知およびコースのようにその機関に属します。 'institute'ユーザーを作成している間、私はファーストネーム、ラストネーム 'wp_users'、 'institute name'などの関連情報をすべて 'wp_usermeta'にキー 'inistitute_name'と共に 'user meta'として保管しています。以下のような表は私のコードです:

  $user_data = array(
            'ID' => '',
            'user_pass' => '',
            'user_login' => $first_name,
            'user_email' => $user_email,
            'first_name' => $first_name,
            'last_name' => $last_name,
            'role' => 'admin'//get_option('default_option')
        );
        $random_password = wp_generate_password(8,false);
        $user_id = wp_insert_user( $user_data );
        update_user_meta( $user_id, 'inistitute_name',$insititute_name );

Trainer(or)Traineeを作成している間、私のコードは以下のようになります。

  $user_data = array(
               'ID' => '',
               'user_pass' => '',
               'user_login' => $first_name,
               'user_email' => $trainer_email,
               'first_name' => $first_name,
               'last_name' => $last_name,
               'role' => 'trainer'
         ); 
        $random_password = wp_generate_password(8,false);
        $user_id = wp_insert_user( $user_data );
        update_user_meta( $user_id, 'inistitute_name',$this->institute_name[0] );
        wp_set_password($random_password, $user_id);

コースを作成している間、私のコードは以下のようになります。

  $user_ID = get_current_user_id();
  $institute_name = get_user_meta($user_ID, 'inistitute_name', true);
  $post = array(
            'post_title'    => $title,
            'post_content'  => $description,
            'post_status'   => 'publish', 
            'post_type' => "courses"  
        );
  $id = wp_insert_post($post);
  update_post_meta( $id, 'inistitute_name', $institute_name );

研究所 'abcd'が削除された場合、その研究所に関連する 'トレーナー'、 '研修生'、 'コース'、 '通知'などのすべての情報も 'user_meta'フィールドに基づいて削除する必要があるとします。削除することは可能ですか? (または)私は何か間違いをしましたか?誰が私が間違っていたことを私に言うことができますか?

更新:

  add_action( 'delete_user', 'cyb_delete_institute_info' );
function cyb_delete_institute_info( $id ) {

$user = get_userdata( $id );

if( ! empty( $user ) && in_array( "admin", (array) $user->roles ) ) {

    // Deleted user is admin, check `institute_name` meta field
    $institute_name = get_user_meta( $id, 'inistitute_name', true );

    if( ! empty( $institute_name ) ) {
        // Deleted user is an admin and has `institute_name` meta,
        // so, it is a "Institute" user

        // Get posts to delete
        $posts_args = array(
            'post_type' => 'notifications',
            'meta_query' => array(
                'key'   => 'inistitute_name',
                'value' => $institute_name
            ),
        );

global $wpdb;
$querystr = "DELETE FROM $wpdb->wp_dxwe_posts LEFT JOIN $wpdb->wp_dxwe_postmeta ON $wpdb->wp_dxwe_postmeta.post_id = $wpdb->posts.ID WHERE $wpdb->wp_dxwe_postmeta.meta_key = 'inistitute_name' AND 
        $wpdb->wp_dxwe_postmeta.meta_value = '$institute_name' AND $wpdb->wp_dxwe_posts.post_type = 'courses' ";
$wpdb->query( $querystr );

        $posts_args2 = array(
            'post_type' => 'courses',
            'meta_query' => array(
                'key'   => 'inistitute_name',
                'value' => $institute_name
            ),
        );

        $query = new WP_Query( $posts_args );
        $query2 = new WP_Query( $posts_args2 );
        $posts_to_delete = $query->get_posts();
        $posts_to_delete2 = $query2->get_posts();

        foreach( $posts_to_delete as $post ) {
            wp_delete_post( $post->ID );
        }

        foreach( $posts_to_delete2 as $post ) {
            wp_delete_post( $post->ID );
        }

        // Get users to delete
        $users_args = array(
            'role__in'       => array( 'trainer', 'trainee' ),
            'meta_query' => array(
                'key'   => 'inistitute_name',
                'value' => $institute_name
            ),
        );
        $query = new WP_User_Query( $users_args );
        $users_to_delete = $query->get_results();

        foreach( $users_to_delete as $user ) {
            wp_delete_user( $user->ID );
        }

    }

}
}

カスタムのpost_typeを別々に削除するために2つの別々のWP_Queryを書いていましたが、どちらもうまくいきませんでした。同じ結果だけ通知が正しく削除されますが、他の教育機関向けコースも削除されます。

1
Prasad Patel

"institute"はユーザーであり、それが削除されたときに何らかのアクションを実行したいので、 delete_user アクションを使用できます(削除された情報が必要なので)ユーザー、deleted_userは動作しないかもしれません、これについてはよくわかりませんがdelete_userは確かに動作するはずです)。そのフックでは、inistitute_nameメタフィールドに基づいてすべてのユーザーと投稿を取得し、それらを削除することができます。

あなたのコードを見ると、 "Institute"ユーザータイプはユーザーロール(あなたがadminを割り当てている)とユーザーメタinistitute_nameによって識別することができます。そのため、delete_userアクションでは、削除されたユーザーがadminであるかどうか、およびinstitute_nameが割り当てられているかどうかを確認できます。

add_action( 'delete_user', 'cyb_delete_institute_info' );
function cyb_delete_institute_info( $id ) {

    $user = get_userdata( $id );

    if( ! empty( $user ) && in_array( "admin", (array) $user->roles ) ) {

        // Deleted user is admin, check `inistitute_name` meta field
        $institute_name = get_user_meta( $id, 'inistitute_name', true );

        if( ! empty( $institute_name ) ) {
            // Deleted user is an admin and has `institute_name` meta,
            // so, it is a "Institute" user

            // Get posts to delete
            $posts_args = array(
                'post_type' => array( 'courses', 'notifications' )
                'meta_query' => array(
                    'key'   => 'inistitute_name',
                    'value' => $institute_name
                ),
            );

            $query = new WP_Query( $posts_args );
            $posts_to_delete = $query->get_posts();

            foreach( $posts_to_delete as $post ) {
                wp_delete_post( $post->ID );
            }


            // Get users to delete
            $users_args = array(
                'role__in'       => array( 'trainer', 'trainee' ),
                'meta_query' => array(
                    'key'   => 'inistitute_name',
                    'value' => $institute_name
                ),
            );
            $query = new WP_User_Query( $users_args );
            $users_to_delete = $query->get_results();

            foreach( $users_to_delete as $user ) {
                wp_delete_user( $user->ID );
            }

        }

    }
}

注:テストされていません。ここにサンプルコードとして記述されています。

1
cybmeta