web-dev-qa-db-fra.com

comment supprimer tous les utilisateurs et les messages basés sur 'user_meta'?

J'ai développé une petite application wordpress où il y a des instituts (utilisateur wp), des formateurs (utilisateur wp), des stagiaires (utilisateur wp), des cours (message personnalisé) et des notifications (message personnalisé). Toute l'application fonctionne correctement, mais si je supprime un institut, toutes les informations appartenant à cet institut, telles que les formateurs, les stagiaires, les notifications et les cours, doivent également être supprimées. Pendant que je créais l'utilisateur 'institute', je stockais toutes les informations associées telles que prénom, nom dans la table wordpress 'wp_users' et 'nom d'institut', en tant que 'méta utilisateur' avec la clé 'inistitute_name' dans 'wp_usermeta' tableau comme ci-dessous est mon code:

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

En créant Trainer (ou) Trainee, mon code est le suivant:

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

Lors de la création de cours, mon code est comme ci-dessous:

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

Supposons que si un institut 'abcd' est supprimé, toutes les informations telles que 'formateur', 'stagiaire', 'cours' & 'notifications' associées à cet institut doivent également être supprimées sur la base du champ 'user_meta'. Est-il possible de supprimer? (ou) ai-je commis une erreur? Quelqu'un peut-il me dire ce que je faisais mal?

Mettre à jour:

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

    }

}
}

J'écrivais 2 WP_Query séparés pour supprimer les post_types personnalisés séparément mais cela ne fonctionnait pas non plus. le même résultat ne fait que supprimer les notifications correctement, mais pour les cours, les autres cours de l'institut sont également supprimés.

1
Prasad Patel

Etant donné que "institute" est un utilisateur et que vous souhaitez effectuer certaines actions lorsqu’il est supprimé, vous pouvez utiliser delete_user action (car nous avons besoin des informations de l’utilisateur supprimé, deleted_user peut ne pas fonctionner, vous en êtes sûr, mais delete_user devrait travailler à coup sûr). Dans ce crochet, vous pouvez obtenir tous les utilisateurs et publications basés sur le champ méta inistitute_name et les supprimer.

En voyant votre code, le type d'utilisateur "Institut" peut être identifié par le rôle de l'utilisateur (vous notifiez admin) et la méta de l'utilisateur inistitute_name. Ainsi, dans l'action delete_user, vous pouvez vérifier si l'utilisateur supprimé est un administrateur et si institute_name lui a été attribué. Dans ce cas, l'utilisateur supprimé est un "institut" et vous pouvez obtenir tous les autres utilisateurs et publications associés.

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

        }

    }
}

Note: non testé, juste écrit ici comme exemple de code.

1
cybmeta