it-swarm.com.de

wie lösche ich alle Benutzer und Beiträge, die auf 'user_meta' basieren?

Ich habe eine kleine WordPress-Anwendung entwickelt, in der es Institute (WP-Benutzer), Trainer (WP-Benutzer), Auszubildende (WP-Benutzer), Kurse (benutzerdefiniertes Posting) und Benachrichtigungen (benutzerdefiniertes Posting) gibt. Die gesamte Anwendung funktioniert einwandfrei, aber wenn ich ein Institut lösche, gehören alle Informationen zu diesem Institut, z. B. Trainer, Auszubildende, Benachrichtigungen und Kurse, sollten ebenfalls gelöscht werden. Während ich den Benutzer 'institute' erstellt habe, speichere ich alle zugehörigen Informationen wie Vorname, Nachname in der WordPress-Tabelle 'wp_users' und 'institute name' als 'user meta' mit dem Schlüssel 'inistitute_name' in 'wp_usermeta'. Tabelle wie unten ist mein 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 );

Beim Erstellen von Trainer (oder) Trainee ist mein Code wie folgt:

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

Beim Erstellen von Kursen ist mein Code wie folgt:

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

Angenommen, wenn ein Institut 'abcd' gelöscht wird, sollten alle Informationen wie 'Trainer', 'Auszubildender', 'Kurse' und 'Benachrichtigungen', die diesem Institut zugeordnet sind, ebenfalls auf der Grundlage eines 'user_meta'-Felds gelöscht werden. Ist es möglich zu löschen? (oder) habe ich einen Fehler gemacht? Kann mir jemand sagen, was ich falsch gemacht habe?

Aktualisieren:

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

    }

}
}

Ich habe 2 separate WP_Query's geschrieben, um benutzerdefinierte post_types separat zu löschen, aber es funktioniert auch nicht. Das gleiche Ergebnis führt nur dazu, dass Benachrichtigungen korrekt gelöscht werden, aber bei Kursen, die andere Institutskurse betreffen, werden diese ebenfalls gelöscht.

1
Prasad Patel

Da "institute" ein Benutzer ist und Sie einige Aktionen ausführen möchten, wenn er gelöscht wird, können Sie delete_user action verwenden (da wir Informationen über den gelöschten Benutzer benötigen, funktioniert deleted_user möglicherweise nicht, nicht sicher, aber delete_user sollte sicher arbeiten). In diesem Hook können Sie alle Benutzer und Beiträge basierend auf dem Metafeld inistitute_name abrufen und löschen.

Wenn Sie Ihren Code sehen, kann der Benutzertyp "Institut" anhand der Benutzerrolle (Sie weisen admin zu) und des Benutzermetas inistitute_name identifiziert werden. In der Aktion delete_user können Sie also überprüfen, ob der gelöschte Benutzer ein Administrator ist und ob ihm institute_name zugewiesen wurde. In diesem Fall ist der gelöschte Benutzer ein "Institut" und Sie können alle anderen zugeordneten Benutzer und Beiträge abrufen.

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

        }

    }
}

Hinweis: nicht getestet, hier nur als Beispielcode geschrieben.

1
cybmeta