如何仅对结账页面执行init或WooCommerce_init

时间:2020-01-03 作者:Iqbal

我正在为我自己的项目做额外的功能。

function devsol_customer_login() { 
if ( is_checkout() ) {  ?>
<form method="post">
    <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
    $user_phone = sanitize_text_field( $_POST[\'username\'] );
    if ( $user = get_user_by( \'login\', $user_phone) ) {
        $user_id = $user->ID;
        $user_roles = $user->roles;
        $user_role = array_shift($user_roles);
        if ( $user_role === \'customer\') {
        echo \'Yes Customer\';
            if ( apply_filters( \'woocommerce_registration_auth_new_customer\', true, $user_id ) ) {  
                wc_set_customer_auth_cookie( $user_id );
                }   
            }
        }   
    echo \'Home\';
    }
}
add_action(\'woocommerce_init\', \'devsol_customer_login\');
但该函数未在签出页面上执行。有人能帮忙吗

1 个回复
SO网友:nmr

首先,我会注意到,只使用用户名登录听起来像是一个不安全的解决方案。

您不应在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;
}