私はそれが機関(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を書いていましたが、どちらもうまくいきませんでした。同じ結果だけ通知が正しく削除されますが、他の教育機関向けコースも削除されます。
"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 );
}
}
}
}
注:テストされていません。ここにサンプルコードとして記述されています。