web-dev-qa-db-fra.com

WP Les URL d'action des formulaires de connexion s'affichent sous forme de jolies URL dans le navigateur (ex avec Restore Password)

Je voudrais utiliser la fonctionnalité WP native login/enregistrer/restaurer le mot de passe/.., mais afficher de jolies URL au lieu de wp-login.php

J'ai examiné le code principal et remarqué que la plupart des formulaires liés à la connexion ont une URL d'action codée en dur. Par exemple, le formulaire de mot de passe de restauration contient l'URL d'action suivante

<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">

Ainsi, lorsque je clique sur le bouton "Réinitialiser le mot de passe", les informations sont soumises au fichier wp-login.php avec les variables d’action, de clé et de requête de connexion spécifiées.

Si info ne réussit pas la validation, le formulaire est à nouveau affiché et l'URL du navigateur est celle spécifiée dans l'action du formulaire. Dans ce cas, il s'agit de http://example.com/wp-login.php?action=resetpass&key=xyz&login=zyx.

Je voudrais que ce soit http://example.com/password-restore?action=resetpass&key=xyz&login=zyx

Pour que cela fonctionne, j'ai essayé la solution suivante. Cependant, je me retrouve dans la boucle de redirection.

Étape 1. L'URL du mot de passe de restauration initial est http://example.com/wp-login.php?action=rp&key=xyz&login=zyx. Pour que ce soit joli, j'ai ajouté une règle de réécriture:

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

Ainsi, l'URL initiale pour restaurer le formulaire fonctionne.

Étape 2. Toutefois, lorsque je soumets un mot de passe ne correspondant pas, le formulaire est à nouveau affiché et l’URL est désormais http://example.com/wp-login.php?action=resetpass&key=xyz&login=zyx. Notez que cette action a changé.

Voici où je suis pile. J'aimerais afficher cette URL aussi jolie. J'ai essayé la solution suivante en essayant de rediriger wp-login.php vers une jolie URL:

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

Cependant, avec cela, je me retrouve dans la boucle de redirection.

Est-il possible de rendre les URL jolies dans la barre d'adresse du navigateur lorsque la page est atteinte via l'URL d'action d'un formulaire?.

J'apprécierais vraiment tous les conseils.

Merci beaucoup, Dasha

3
dashaluna

Étape 2. Cependant, lorsque je soumets un mot de passe ne correspondant pas, le formulaire est à nouveau affiché et l’URL est maintenant http://example.com/wp-login.php?action=resetpass&key=xyz&login = zyx . Notez que cette action a changé.

Lorsque j'essaie avec une clé non valide, je suis redirigé vers http://example.com/wp-login.php?action=lostpassword&error=invalidkey .

Quoi qu’il en soit, la boucle infinie se produit parce que vous êtes dans la condition in_array( $action, array('rp', 'resetpass') ) reste vraie pour l’URL vers laquelle vous redirigez, de sorte que vous vous retrouvez dans une boucle de redirection.

La solution consiste à vérifier que l'URL demandée diffère de l'URL de redirection:

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