使用最新版本的WooCommerce,我试图将丢失的密码表单显示在几个不同的页面上。问题是,从woocommerce > templates > myaccount > form-lost-password.php
复制默认表单并将代码放在另一页上是行不通的。
以下是表单的默认代码:
<form method="post" class="lost_reset_password">
<?php if( 'lost_password' == $args['form'] ) : ?>
<p><?php echo apply_filters( 'woocommerce_lost_password_message', __( 'Lost your password? Please enter your username or email address. You will receive a link to create a new password via email.', 'woocommerce' ) ); ?></p>
<p class="form-row form-row-first"><label for="user_login"><?php _e( 'Username or email', 'woocommerce' ); ?></label> <input class="input-text" type="text" name="user_login" id="user_login" /></p>
<?php else : ?>
<p><?php echo apply_filters( 'woocommerce_reset_password_message', __( 'Enter a new password below.', 'woocommerce') ); ?></p>
<p class="form-row form-row-first">
<label for="password_1"><?php _e( 'New password', 'woocommerce' ); ?> <span class="required">*</span></label>
<input type="password" class="input-text" name="password_1" id="password_1" />
</p>
<p class="form-row form-row-last">
<label for="password_2"><?php _e( 'Re-enter new password', 'woocommerce' ); ?> <span class="required">*</span></label>
<input type="password" class="input-text" name="password_2" id="password_2" />
</p>
<input type="hidden" name="reset_key" value="<?php echo isset( $args['key'] ) ? $args['key'] : ''; ?>" />
<input type="hidden" name="reset_login" value="<?php echo isset( $args['login'] ) ? $args['login'] : ''; ?>" />
<?php endif; ?>
<div class="clear"></div>
<p class="form-row">
<input type="hidden" name="wc_reset_password" value="true" />
<input type="submit" class="button" value="<?php echo 'lost_password' == $args['form'] ? __( 'Reset Password', 'woocommerce' ) : __( 'Save', 'woocommerce' ); ?>" />
</p>
<?php wp_nonce_field( $args['form'] ); ?>
</form>
以下是我正在使用的内容:
<form method="post" class="lost_reset_password">
<h2 id="reset-h2">Recover your password</h2>
<p id="reset-p">Please enter your email address below to receive a link where you can create a new password</p>
<input class="input-text reset-email-password" type="text" name="user_login" id="user_login" placeholder="Enter your email"/>
<input type="hidden" name="wc_reset_password" value="true" />
<input type="submit" class="button submit-button custom-reset" value="<?php _e( 'Reset Password', 'woocommerce' ); ?>" />
<a href="#" id="reset-back">Back</a>
<?php wp_nonce_field( $args['form'] ); ?>
</form>
请注意,我删除了else
部分,因为我只想要用户提交的表单来获取一封电子邮件,其中包含重置密码的链接(显然会将您带到我的代码中)去除)。
我唯一能想到为什么这不起作用的原因是因为我错过了<?php do_action( 'woocommerce_login_form_end' ); ?>
这样的行为,但我不知道我需要采取什么行动。丢失密码是。
很想得到一些帮助,所以请告诉我是否需要提供其他任何东西,谢谢!
答案 0 :(得分:11)
尝试将此行代码插入到您希望表单显示的模板文件中:
wc_get_template( 'myaccount/form-lost-password.php', array( 'form' => 'lost_password' ) );
答案 1 :(得分:3)
这可能是一个古老的问题,我遇到了同样的问题,但是被接受的答案只会显示丢失的密码表格。提交您的电子邮件地址后,它将返回到my-account/lost-password
中的默认表单。
对于我来说,我想删除默认的lost password
页面或端点并使用我的自定义页面,但我仍想使用默认表单。
因此,要在另一页中完整显示lost password form
,confirmation message
和new password form
;
1:删除密码丢失的端点。
转到WooCoommerce
> Settings
> Advanced
,然后滚动到Account endpoints
,您会看到Lost password
。只需删除其值并保存设置即可。
2:将默认密码丢失的URL更改为新的密码丢失页面。
将以下挂钩添加到您的functions.php
中,注意/password-recovery
,并根据新的丢失的密码页面的提示进行更改。.
function wdm_lostpassword_url() {
return site_url( '/password-recovery' );
}
add_filter( 'lostpassword_url', 'wdm_lostpassword_url', 10, 0 );
3:设置成功更改密码后重定向用户的位置。
就我而言,我想将用户重定向到sign-in
页,并添加一条通知消息,告知他/她成功更改了密码。使用下面的钩子根据您的情况进行更改,但是无论您设置的是哪个URL,请确保像在new-password-created=true
一样在URL的末尾添加查询"/sign-in/?new-password-created=true"
。 / p>
function woocommerce_new_pass_redirect( $user ) {
wc_add_notice( __( 'Your password has been changed successfully! Please login to continue.', 'woocommerce' ), 'success' );
wp_redirect( home_url() . "/sign-in/?new-password-created=true" );
exit;
}
add_action( 'woocommerce_customer_reset_password', 'woocommerce_new_pass_redirect' );
4:为“丢失的密码”表单创建一个简码。
这就是魔术发生的地方,请使用以下代码创建lost password form
的简码。仍使用WooCoommerce的默认形式。
//Create shortcode for lost password form [lost_password_form]
function wc_custom_lost_password_form( $atts ) {
if ( !empty( $_COOKIE[ "csx-reset-link-set" ] ) && isset( $_COOKIE[ "csx-reset-link-set" ] ) && $_COOKIE[ "csx-reset-link-set" ] === "true" ) { // WPCS: input var ok, CSRF ok.
return wc_get_template( 'myaccount/lost-password-confirmation.php' );
} elseif ( !empty( $_SESSION[ "csx-show-reset-form" ] ) && isset( $_SESSION[ "csx-show-reset-form" ] ) && $_SESSION[ "csx-show-reset-form" ] === "true" ) {
$rp_id = $_SESSION[ "csx-id" ];
$rp_key = $_SESSION[ "csx-key" ];
if ( isset( $_COOKIE[ 'wp-resetpass-' . COOKIEHASH ] ) && 0 < strpos( $_COOKIE[ 'wp-resetpass-' . COOKIEHASH ], ':' ) ) { // @codingStandardsIgnoreLine
list( $rp_id, $rp_key ) = array_map( 'wc_clean', explode( ':', wp_unslash( $_COOKIE[ 'wp-resetpass-' . COOKIEHASH ] ), 2 ) ); // @codingStandardsIgnoreLine
$userdata = get_userdata( absint( $rp_id ) );
$rp_login = $userdata ? $userdata->user_login : '';
$user = WC_Shortcode_My_Account::check_password_reset_key( $rp_key, $rp_login );
// Reset key / login is correct, display reset password form with hidden key / login values.
if ( is_object( $user ) ) {
return wc_get_template(
'myaccount/form-reset-password.php',
array(
'key' => $rp_key,
'login' => $rp_login,
)
);
}
}
}
// Show lost password form by default.
return wc_get_template(
'myaccount/form-lost-password.php',
array(
'form' => 'lost_password',
)
);
}
add_shortcode( 'lost_password_form', 'wc_custom_lost_password_form' );
//Handling query
function csx_process_query() {
if ( isset( $_GET[ 'reset-link-sent' ] ) && $_GET[ 'reset-link-sent' ] === "true" ) {
setcookie( 'csx-reset-link-set', "true", time() + ( 300 * 1 ), "/" ); //Allow to submit email for reset after 5 minutes only.
unset( $_SESSION[ "csx-show-reset-form" ] );
}
if ( isset( $_GET[ 'show-reset-form' ] ) && $_GET[ 'show-reset-form' ] === "true" ||
isset( $_GET[ 'key' ] ) && isset( $_GET[ 'id' ] ) ) {
$_SESSION[ "csx-show-reset-form" ] = "true";
setcookie( 'csx-reset-link-set', "", time() - 3600, "/" );
}
//Set session and cookie if key and id are existed
if ( isset( $_GET[ 'key' ] ) && isset( $_GET[ 'id' ] ) ) {
$_SESSION[ "csx-key" ] = $_GET[ 'key' ];
$_SESSION[ "csx-id" ] = $_GET[ 'id' ];
$value = sprintf( "%s:%s", wp_unslash( $_GET[ 'id' ] ), wp_unslash( $_GET[ 'key' ] ) );
WC_Shortcode_My_Account::set_reset_password_cookie( $value );
}
//Unset session and cookie after successfully changed the password.
if ( isset( $_GET[ 'new-password-created' ] ) && $_GET[ 'new-password-created' ] === "true" ) {
setcookie( 'wp-resetpass-' . COOKIEHASH, "", time() - 3600 );
unset( $_SESSION[ "csx-show-reset-form" ] );
unset( $_SESSION[ "csx-reset-link-set" ] );
unset( $_SESSION[ "csx-id" ] );
unset( $_SESSION[ "csx-key" ] );
}
}
add_action( 'init', 'csx_process_query' );
//Redirect to custom lost password on request
function csx_redirections() {
if ( isset( $_GET[ 'reset-link-sent' ] ) || isset( $_GET[ 'show-reset-form' ] ) ||
isset( $_GET[ 'key' ] ) && isset( $_GET[ 'id' ] ) ) {
wp_redirect( home_url() . '/password-recovery' );
exit;
}
}
add_action( 'template_redirect', 'csx_redirections' );
您现在可以使用ShortCode [lost_password_form]
,只需将其放入页面中即可显示该表格。请注意,您需要更改password-recovery
的标签。
5:更改用户请求丢失密码时发送给用户的电子邮件中的URL。
覆盖位于woocommerce/templates/emails/customer-reset-password.php
和woocommerce/templates/emails/plain/customer-reset-password.php
的{{3}}。
这是纯电子邮件的示例;
<?php
/**
* Customer Reset Password email
*
* This template can be overridden by copying it to yourtheme/woocommerce/emails/plain/customer-reset-password.php.
*
* HOWEVER, on occasion WooCommerce will need to update template files and you
* (the theme developer) will need to copy the new files to your theme to
* maintain compatibility. We try to do this as little as possible, but it does
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates/Emails/Plain
* @version 3.7.0
*/
defined( 'ABSPATH' ) || exit;
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n";
echo esc_html( wp_strip_all_tags( $email_heading ) );
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
/* translators: %s: Customer username */
echo sprintf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $user_login ) ) . "\n\n";
/* translators: %s: Store name */
echo sprintf( esc_html__( 'Someone has requested a new password for the following account on %s:', 'woocommerce' ), esc_html( wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) ) ) . "\n\n";
/* translators: %s: Customer username */
echo sprintf( esc_html__( 'Username: %s', 'woocommerce' ), esc_html( $user_login ) ) . "\n\n";
echo esc_html__( 'If you didn\'t make this request, just ignore this email. If you\'d like to proceed:', 'woocommerce' ) . "\n\n";
echo esc_url( add_query_arg( array( 'key' => $reset_key, 'id' => $user_id ), home_url().'/your-custom-url/' ) ) . "\n\n"; // phpcs:ignore
echo "\n\n----------------------------------------\n\n";
/**
* Show user-defined additional content - this is set in each email's settings.
*/
if ( $additional_content ) {
echo esc_html( wp_strip_all_tags( wptexturize( $additional_content ) ) );
echo "\n\n----------------------------------------\n\n";
}
用于非普通电子邮件;
<?php
/**
* Customer Reset Password email
*
* This template can be overridden by copying it to yourtheme/woocommerce/emails/customer-reset-password.php.
*
* HOWEVER, on occasion WooCommerce will need to update template files and you
* (the theme developer) will need to copy the new files to your theme to
* maintain compatibility. We try to do this as little as possible, but it does
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates/Emails
* @version 4.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
?>
<?php do_action( 'woocommerce_email_header', $email_heading, $email ); ?>
<?php /* translators: %s: Customer username */ ?>
<p><?php printf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $user_login ) ); ?></p>
<?php /* translators: %s: Store name */ ?>
<p><?php printf( esc_html__( 'Someone has requested a new password for the following account on %s:', 'woocommerce' ), esc_html( wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) ) ); ?></p>
<?php /* translators: %s: Customer username */ ?>
<p><?php printf( esc_html__( 'Username: %s', 'woocommerce' ), esc_html( $user_login ) ); ?></p>
<p><?php esc_html_e( 'If you didn\'t make this request, just ignore this email. If you\'d like to proceed:', 'woocommerce' ); ?></p>
<p>
<a class="link" href="<?php
echo esc_url( add_query_arg( array( 'key' => $reset_key, 'id' => $user_id ), home_url()."/your-custom-url/" ) ); ?>"><?php // phpcs:ignore ?>
<?php esc_html_e( 'Click here to reset your password', 'woocommerce' ); ?>
</a>
</p>
<?php
/**
* Show user-defined additional content - this is set in each email's settings.
*/
if ( $additional_content ) {
echo wp_kses_post( wpautop( wptexturize( $additional_content ) ) );
}
do_action( 'woocommerce_email_footer', $email );
只需将URL更改为您的页面即可。请注意,您需要同时使用普通电子邮件和非普通电子邮件。