как удалить всех пользователей и сообщений на основе 'user_meta'?

Я разработал небольшое приложение для WordPress, в котором у него есть институты (пользователь wp), тренеры (пользователь wp), стажеры (пользователь wp), курсы (пользовательская почта) и уведомления (пользовательский пост). Все приложения работают нормально, но если я удалю институт, вся информация принадлежит этому институту, например, тренеры, стажеры, уведомления и курсы также должны быть удалены. В то время как я создавал пользователя «института», я сохраняю всю связанную с ней информацию, такую ​​как имя, фамилия в таблице wordpress «wp_users» и «имя института» хранится как «пользовательская мета» с ключом «inistitute_name» в 'wp_usermeta' таблица, как показано ниже, – это мой код:

$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 (или) 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 ); } } } } 

Я писал два отдельных WP_Query для удаления отдельно созданных post_type, но не работал. тот же результат только уведомления удаляются правильно, но для курсов других курсов института также удаляются.

Solutions Collecting From Web of "как удалить всех пользователей и сообщений на основе 'user_meta'?"

Поскольку «институт» является пользователем, и вы хотите выполнить некоторые действия при его удалении, вы можете использовать действие delete_user (так как нам нужна информация о удаленном пользователе, deleted_user может не работать, не уверен в этом, но delete_user должен работать точно) , В этом случае вы можете получить всех пользователей и сообщений на inistitute_name мета-поля inistitute_name и удалить их.

Увидев ваш код, пользовательский тип «Институт» может быть идентифицирован ролью пользователя (вы определяете admin ) и пользователем meta inistitute_name . Таким образом, в действии delete_user вы можете проверить, был ли удаленный пользователь и администратором, и если у него назначено имя 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 ); } } } } 

Примечание: не проверено, просто написано здесь как пример кода.