WP登录表单操作URL在浏览器中显示为漂亮的URL(例如,带有恢复密码)

时间:2013-05-03 作者:dashaluna

我想使用WP本机登录/注册/还原密码/。。功能,但显示漂亮的URL,而不是wp登录。php

我一直在查看核心代码,注意到大多数与登录相关的表单都有硬编码的操作URL。例如,还原密码表单具有以下操作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">
因此,当我单击“重置密码”按钮时,信息将提交给wp登录。包含指定操作、键和登录查询变量的php文件。

如果信息未通过验证,则会重新显示表单,浏览器中的URL是表单操作中指定的URL,因此在本例中是http://example.com/wp-login.php?action=resetpass&key=xyz&login=zyx.

我希望是这样http://example.com/password-restore?action=resetpass&key=xyz&login=zyx

为了实现这一点,我尝试了以下解决方案。然而,我最终进入了重定向循环。

Step 1. 初始还原密码URL为http://example.com/wp-login.php?action=rp&key=xyz&login=zyx. 为了使其美观,我添加了一个重写规则:

add_action( \'init\', \'pretty_login_urls\' );
function pretty_login_urls() {
    add_rewrite_rule( \'password-restore?([^/]+)/?$\', "wp-login.php?$1", \'top\' );
}
因此,恢复表单的初始URL正在工作。

Step 2. 但是,当我提交一个不匹配的密码时,表单会重新显示,URL现在是http://example.com/wp-login.php?action=resetpass&key=xyz&login=zyx. 请注意,该操作已更改。

这就是我要说的stack。我想把那个URL显示得很漂亮。我尝试了以下解决方案,试图重定向wp-login.php 到一个漂亮的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;
    }
}
然而,这样我就进入了重定向循环。

当通过表单的动作URL访问页面时,是否有一种方法可以使URL在浏览器地址栏中显示得漂亮。

如果有任何提示,我将不胜感激。

非常感谢,Dasha

1 个回复
SO网友:Stephen Harris

第2步。但是,当我提交一个不匹配的密码时,表单会重新显示,URL现在是http://example.com/wp-login.php?action=resetpass&key=xyz&login=zyx. 请注意,该操作已更改。

当我尝试使用无效密钥执行此操作时,会被重定向到http://example.com/wp-login.php?action=lostpassword&error=invalidkey.

无论如何,无限循环正在发生,因为你是条件in_array( $action, array(\'rp\', \'resetpass\') ) 对于要重定向到的url保持为true,因此最终会进入重定向循环。

解决方案是检查请求的url是否与重定向url不同:

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

结束