it-swarm.com.de

WP Aktions-URLs für Anmeldeformulare werden im Browser als hübsche URLs angezeigt (z. B. mit Kennwort wiederherstellen)

Ich möchte die WP native Login/Register/Restore Password/.. -Funktion verwenden, aber statt wp-login.php hübsche URLs anzeigen

Ich habe mir den Kerncode angesehen und festgestellt, dass die meisten Anmeldeformulare eine fest codierte Aktions-URL haben. Das Wiederherstellungskennwortformular hat beispielsweise die folgende Aktions-URL

<form name="resetpassform" id="resetpassform" action="<?php echo esc_url( site_url( 'wp-login.php?action=resetpass&key=' . urlencode( $_GET['key'] ) . '&login=' . urlencode( $_GET['login'] ), 'login_post' ) ); ?>" method="post">

Wenn ich also auf die Schaltfläche "Kennwort zurücksetzen" klicke, werden die Informationen mit den angegebenen Variablen für Aktion, Schlüssel und Anmeldeabfrage an die Datei "wp-login.php" gesendet.

Wenn die Informationen die Validierung nicht bestehen, wird das Formular erneut angezeigt und die URL im Browser ist diejenige, die in der Aktion des Formulars angegeben ist. In diesem Fall ist es also http://example.com/wp-login.php?action=resetpass&key=xyz&login=zyx.

Ich möchte, dass es http://example.com/password-restore?action=resetpass&key=xyz&login=zyx ist

Damit dies funktioniert, habe ich die folgende Lösung ausprobiert. Ich lande jedoch in der Umleitungsschleife.

Schritt 1. Die ursprüngliche URL für das Wiederherstellungskennwort lautet http://example.com/wp-login.php?action=rp&key=xyz&login=zyx. Um es hübsch zu machen, habe ich eine Umschreiberegel hinzugefügt:

add_action( 'init', 'pretty_login_urls' );
function pretty_login_urls() {
    add_rewrite_rule( 'password-restore?([^/]+)/?$', "wp-login.php?$1", 'top' );
}

Die ursprüngliche URL zum Wiederherstellen des Formulars funktioniert also.

Schritt 2. Wenn ich jedoch ein nicht übereinstimmendes Kennwort übermittle, wird das Formular erneut angezeigt und die URL lautet jetzt http://example.com/wp-login.php?action=resetpass&key=xyz&login=zyx. Beachten Sie, dass sich diese Aktion geändert hat.

Hier bin ich stapelbar. Ich möchte diese URL als hübsch anzeigen. Ich habe die folgende Lösung ausprobiert, um wp-login.php zu einer hübschen URL umzuleiten:

add_action( 'login_init', 'pretty_login_urls_form_action_fix' );
function pretty_login_urls_form_action_fix(){

    $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
    if( in_array( $action, array('rp', 'resetpass') ) ){

        $url = home_url( '/password-restore?action='. $action .'&key=' . urlencode( $_GET['key'] ) . '&login=' . urlencode( $_GET['login'] ), 'login_post' );
        wp_redirect( $url );
        exit;
    }
}

Damit lande ich jedoch in der Umleitungsschleife.

Gibt es eine Möglichkeit, die URLs in der Adressleiste des Browsers hübsch darzustellen, wenn die Seite über die Aktions-URL eines Formulars erreicht wird?.

Ich würde mich über Tipps sehr freuen.

Vielen Dank, Dasha

3
dashaluna

Schritt 2. Wenn ich jedoch ein nicht übereinstimmendes Kennwort übermittle, wird das Formular erneut angezeigt und die URL lautet jetzt http://example.com/wp-login.php?action=resetpass&key=xyz&login = Zyx . Beachten Sie, dass sich diese Aktion geändert hat.

Wenn ich dies mit einem ungültigen Schlüssel versuche, werde ich zu http://example.com/wp-login.php?action=lostpassword&error=invalidkey weitergeleitet.

Auf jeden Fall tritt die Endlosschleife auf, weil Sie die Bedingung in_array( $action, array('rp', 'resetpass') ) für die URL haben, zu der Sie umleiten, sodass Sie in eine Umleitungsschleife geraten.

Die Lösung besteht darin, zu überprüfen, ob die angeforderte URL von der Weiterleitungs-URL abweicht:

function pretty_login_urls_form_action_fix(){

    $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
    if( in_array( $action, array('rp', 'resetpass') ) ){

        $requested_url  = is_ssl() ? 'https://' : 'http://';
        $requested_url .= $_SERVER['HTTP_Host'];
        $requested_url .= $_SERVER['REQUEST_URI'];

        $redirect_url = home_url( '/password-restore?action='. $action .'&key=' . urlencode( $_GET['key'] ) . '&login=' . urlencode( $_GET['login'] ), 'login_post' );

        if( $redirect_url !== $requested_url ){         
            wp_redirect( $redirect_url );
            exit;
        }
    }
}
1
Stephen Harris