1

I have developed a small wordpress application where It has Institutes(wp user), Trainers(wp user), Trainees(wp user), courses(custom post) and notifications(custom post). All the application is working fine but If I delete an institute all the information belongs to that institute like Trainers, Trainee, notifications & courses should also be deleted. While I was creating the 'institute' user I am storing the all the related info like first name, last name in wordpress table 'wp_users' and 'institute name' is storing as 'user meta' with key 'inistitute_name' in 'wp_usermeta' table like below is my 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 );

While creating Trainer (or) Trainee my code is like below:

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

While creating courses my code is like below:

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

Suppose let us say if a institute 'abcd' is deleted then all the information like 'trainer', 'trainee', 'courses' & 'notifications' associated with that institute should also be deleted based on a 'user_meta' field. Is it possible to delete? (or) did I do any mistake? can anyone tell me what was I doing wrong?

Update:

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

    }

}
}

I was writing 2 separate WP_Query's to delete custom post_type's separately but din't work either. same result only notifications deleting correctly but for courses other institute courses also getting deleted.

  • Is "institute" a user role? – cybmeta Dec 16 '16 at 9:24
  • @cybmeta, No 'institute' is not a user role but for all institutes who were created will have a user role 'admin' as shown above in my code. – Prasad Patel Dec 16 '16 at 9:32
  • So, what is the difference between user types "Institute", "trainers", and so on. In posts you work with post types, in users what do you use if not roles? How do you identify a "Institute" user type? – cybmeta Dec 16 '16 at 9:34
  • The difference b/w 'Institute' & 'trainers' is that 'Institute' user will have a role 'admin' where as 'trainer' will have a user role 'trainer'. – Prasad Patel Dec 16 '16 at 9:39
  • And the difference between Institute and other admins is the institute_name meta field? I think you should assign "institute" a user role as well, but that is another question; working on an answer. – cybmeta Dec 16 '16 at 9:42
1

Because "institute" is a user and you want to perform some actions when it is deleted, you could use delete_user action (as we need information of the deleted user, deleted_user may not work, not sure about this but delete_user should work for sure). In that hook you can get all users and posts based on inistitute_name meta field and delete them.

Seeing your code, "Institute" user type can be identified by user role (you assing admin) and user meta inistitute_name. So, in delete_user action you can check if the deleted user is and admin and if it has institute_name assigned, in that case, the deleted user is a "institute" and you can get all other associated users and posts.

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: not tested, just written here as sample code.

  • I am trying your solution, testing the application now it will take time since as this is total application level testing. – Prasad Patel Dec 16 '16 at 11:30
  • I tried& tested your solution by deleting an institute, result is that all 'trainers', 'trainee' & 'notifications' deleted perfectly but 'courses' are deleting more i.e. not only beloved 'institute' courses but also other 'institute' courses getting deleted. can u plz once again check ur answer. – Prasad Patel Dec 18 '16 at 21:20
  • may be 'compare' field for 'meta_query' is missing in '$posts_args' array that is why it is deleting all other institute courses. – Prasad Patel Dec 19 '16 at 6:01
  • It is not missing, default value for compare argument is =, so the code should work for courses just like it works for the other custom post types. Can you try to make some debug and check the value of inistitute_name filed for the courses being deleted? – cybmeta Dec 19 '16 at 6:50
  • I did debug on 'inistitute_name' field for the courses being deleted & before deleting also. it is correct as I gave my institute name. Also checked for other institute courses they have their different insitute_name which they belongs to. Everything looking fine, I don't know whats going wrong! – Prasad Patel Dec 19 '16 at 7:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.