Wie können registrierte Benutzer ihre Benutzerrolle über das Frontend ändern?

Von Zeit zu Zeit möchte ich meinen registrierten Benutzern die Möglichkeit geben, ihre Benutzerrolle kostenlos selbst zu aktualisieren. Ich habe das versucht, indem ich ein kleines Plugin geschrieben habe, aber leider kann ich das HTML-Formular nicht anzeigen, wenn ich den Shortcode benutze, und kann daher nicht testen, ob es funktioniert oder nicht. Ich wäre wirklich dankbar für jede Hilfe.

function upgrade_to_premium() { if( is_user_logged_in() ) { if( is_page( 'upgrade-to-premium' ) ) { $current_user = wp_get_current_user(); if( $current_user->roles[0] == "subscriber" || $current_user->roles[0] == "premium" ) { $user_id = $current_user->id; $role = $current_user->roles[0]; if( $_POST['role']){ if( $_POST['role'] == $role ) { echo "Sorry, you are already a " . $role . "!"; } else { $role = $_POST['role']; $userdata = array(); $userdata['ID'] = $user_id; $userdata['role'] = $role; wp_update_user($userdata); echo "Your user type has been changed! You are now a " . $role . "!"; } } ?> 
Please select a role:
Subscriber Premium
<?php } } } } add_shortcode( 'upgrade_to_premium', 'upgrade_to_premium' );

Solutions Collecting From Web of "Wie können registrierte Benutzer ihre Benutzerrolle über das Frontend ändern?"

Ich habe den Code ein wenig bearbeitet und das funktioniert auf meinem localhost. Probieren Sie es aus und lassen Sie mich wissen, ob es den Job macht.

Seien Sie jedoch vorsichtig, wenn Sie Ihre eigene Admin-Rolle bearbeiten. Oder fügen Sie eine andere Bedingung ein, um zu verhindern, dass Ihre Admin-Rolle im Falle eines Benutzererrorss aktualisiert wird.

Edit: hinzugefügt ob_start () dank Mark Kaplun. Shortcodes müssen zurückgegeben werden und nicht wiederholt werden.

 add_shortcode( 'upgrade_to_premium', 'upgrade_to_premium' ); function upgrade_to_premium() { // Stop if user is not logged in. if ( ! is_user_logged_in() ) return; ob_start(); ?> 
Please select a role:
< ?php // Do not process anything if it's not $_POST if ( ! isset( $_POST['role'] ) ) return; // Never trust user input. $role = sanitize_key( $_POST['role'] ); if ( ! in_array( $role, array( 'subscriber', 'premium' ) ) ) return; // Get the user object $user = new WP_User( get_current_user_id() ); $index = key( $user->roles ); $user_role = $user->roles[ $index ]; // User already got that user if ( $user_role == $role ) { echo sprintf( __( 'You already have %s role.' ), $role ); } else { // update user role $user->set_role( $role ); echo sprintf( __( 'Your role was changed to %s.' ), $role ); } $output = ob_get_contents(); ob_end_clean(); return $output; }