首先,我会注意到,只使用用户名登录听起来像是一个不安全的解决方案。
您不应在init
行动挂钩。从签出页面向操作挂钩添加表单显示功能(例如。woocommerce_before_checkout_form
) 或overwrite the checkout template 在活动主题中插入表单。
if ( ! is_user_logged_in() )
{
?>
<form method="post" action="<?php echo esc_attr( admin_url(\'admin-post.php\') ); ?>">
<input type="hidden" name="action" value="custsign" />
<?php wp_nonce_field( \'customer_signin\' ); ?>
<input type="text" class="woocommerce-Input woocommerce-Input--text input-text"
name="username" id="username" autocomplete="username"
value="<?php echo ( ! empty( $_POST[\'username\'] ) ) ? esc_attr( wp_unslash( $_POST[\'username\'] ) ) : \'\'; ?>" />
<button type="submit" class="woocommerce-Button button woocommerce-form-login__submit"
name="login" value="<?php esc_attr_e( \'Log in\', \'woocommerce\' ); ?>"><?php esc_html_e( \'Log in\', \'woocommerce\' ); ?></button>
</form>
<?php
}
在中处理表单(数据验证、登录、重定向)
admin_post_nopriv_{action}
行动挂钩。建议在表单中添加nonce。
add_action( \'admin_post_nopriv_custsign\', \'customer_login\');
function customer_login()
{
$return_url = wc_get_checkout_url();
if ( !isset( $_POST[\'username\'] ) || empty($_POST[\'username\']) )
wp_redirect( $return_url );
$nonce = wp_verify_nonce( $_POST[\'_wpnonce\'], \'customer_signin\' );
if ( false === $nonce )
{
// invalid nonce
wp_redirect( $return_url );
}
else {
$uname = sanitize_user( $_POST[\'username\'], true );
$uid = username_exists( $uname );
//
// your permission checking code
//
if ( $uid !== false )
wp_set_auth_cookie( $uid );
}
// back to order
wp_redirect( $return_url );
}
通过将“nonce”添加到表单中(该表单由未标记的用户发送),您可能需要使用
nonce_user_logged_out
验证工作的行动挂钩。将一个函数附加到此挂钩,该函数返回一个值而不是用户ID。由于Woocommerce,计算nonce时未标记用户的ID在
admin_post_nopriv_{$action}
和显示表单。
add_filter ( \'nonce_user_logged_out\', \'unlogged_user_nonce\', 20, 2 );
function unlogged_user_nonce( $uid, $action )
{
if ( \'customer_signin\' == $action)
{
// generate returned value, for example:
//
// $uid = hash( \'sha1\', $action );
//
}
return $uid;
}