如何验证woocommerce注册表单的同意条款复选框?

时间:2015-10-14 10:14:23

标签: php wordpress forms checkbox woocommerce

我在使用woocommerce注册表时遇到了一些问题。我想添加一个同意实际有用的术语复选框。

我添加了显示form-login.php复选框的代码(来自templates / my account文件夹)。

我尝试从includes文件夹修改wc-user-functions.php和class-wc-form-handler.php中的代码,现在它无法识别用户何时选中该框。无论我是否勾选方框,它都会给我每次请接受条款错误。

有谁知道我的错误在哪里?

form-login.php添加了代码

<p class="form-row form-row-wide">
            <label for="accept_terms" class="inline"><span class="required"></span></label>
            <input name="accept_terms" type="checkbox" id="accept_terms" value="empty";/> 
            <?php _e( 'Am citit si sunt de acord cu' ); ?> <a href="<?php echo "http://................." ?>"><?php _e( 'termenii si conditiile', 'woocommerce' ); ?></a>
        </p>

wc-user-functions.php添加了代码

// Check the accept terms
if ( empty( $accept_terms ) )  {
    return new WP_Error( 'registration-error-accept-terms', __( 'Please accept terms', 'woocommerce' ) );
} 

wc-class-form-handler.php修改后的代码

public static function process_registration() {
    if ( ! empty( $_POST['register'] ) && isset( $_POST['_wpnonce'] ) && wp_verify_nonce( $_POST['_wpnonce'], 'woocommerce-register' ) ) {
        $username = 'no' === get_option( 'woocommerce_registration_generate_username' ) ? $_POST['username'] : '';
        $password = 'no' === get_option( 'woocommerce_registration_generate_password' ) ? $_POST['password'] : '';
        $email    = $_POST['email'];
    $accept_terms = $_POST['accept_terms'];

        try {
            $validation_error = new WP_Error();
            $validation_error = apply_filters( 'woocommerce_process_registration_errors', $validation_error, $username, $password, $email, $accept_terms);

            if ( $validation_error->get_error_code() ) {
                throw new Exception( $validation_error->get_error_message() );
            }

            // Anti-spam trap
            if ( ! empty( $_POST['email_2'] ) ) {
                throw new Exception( __( 'Anti-spam field was filled in.', 'woocommerce' ) );
            }

            $new_customer = wc_create_new_customer( sanitize_email( $email ), wc_clean( $username ), $password);

            if ( is_wp_error( $new_customer ) ) {
                throw new Exception( $new_customer->get_error_message() );
            }

            if ( apply_filters( 'woocommerce_registration_auth_new_customer', true, $new_customer ) ) {
                wc_set_customer_auth_cookie( $new_customer );
            }

            wp_safe_redirect( apply_filters( 'woocommerce_registration_redirect', wp_get_referer() ? wp_get_referer() : wc_get_page_permalink( 'myaccount' ) ) );
            exit;

        } catch ( Exception $e ) {
            wc_add_notice( '<strong>' . __( 'Error', 'woocommerce' ) . ':</strong> ' . $e->getMessage(), 'error' );
        }
    }
}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

首先,您不应编辑核心WooCommerce文件。您将自己锁定到代码中,永远无法更新,这很糟糕。并且真的没有必要和WooCommerce充斥着钩子和过滤器,允许您从自己的主题/插件进行修改。以下内容应放在您的主题functions.php中,或者最好放入自己的自定义插件中。

第一部分将添加术语复选框。如果您希望显示与结帐页面完全相同的字词字段,则可以使用相同的模板。

function so_33122634_add_field_to_registration(){
    wc_get_template( 'checkout/terms.php' );
}
add_action( 'woocommerce_register_form', 'so_33122634_add_field_to_registration' );

然后在woocommerce_process_registration_errors我们可以检查$_POST并抛出异常(如果不存在)。 WooCommerce将收集所有异常并显示相应的错误消息。

function so_33122634_validation_registration( $errors, $username, $password, $email ){
    if ( empty( $_POST['terms'] ) ) {
        throw new Exception( __( 'You must accept the terms and conditions in order to register.', 'text-domain' ) );
    }
    return $errors;
}
add_action( 'woocommerce_process_registration_errors', 'so_33122634_validation_registration', 10, 4 );