wordpress - 在 WooCommerce 注册表单中添加第二个复选框
问题描述
如何在 WooCommerce 用户的注册表单中添加第二个复选框?
在 WooCommerce 的“我的帐户”页面上,您可以选择登录或注册(这就是我需要帮助的地方)。
我已经建立了一个复选框来接受隐私政策(就在用户、电子邮件和密码框的下方)。
这是我通过这篇文章实现的钩子
add_action( 'woocommerce_register_form', function () {
woocommerce_form_field( 'politica_privacidad_registro', array(
'type' => 'checkbox',
'class' => array('form-row rgpd'),
'label_class' => array('woocommerce-form__label woocommerce-form__label-for-checkbox checkbox'),
'input_class' => array('woocommerce-form__input woocommerce-form__input-checkbox input-checkbox'),
'required' => true,
'label' => 'He leído y acepto la política de privacidad',
));
}, 10);
add_filter( 'woocommerce_registration_errors', function ( $errores, $usuario, $email ) {
if ( ! (int) isset( $_POST['politica_privacidad_registro'] ) ) {
$errores->add( 'politica_privacidad_registro_error', 'Tienes que aceptar nuestra política de privacidad' );
}
return $errores;
}, 10, 3);
但我需要另一个复选框,以便他们接受网络上的另一个必要要求(年龄验证)。当然,用于注册的强制性年龄验证复选框将伴随着一个小短语。
我曾尝试在 中使用一些钩子functions.php
,但碰巧如果您接受隐私复选框,即使您不接受第二个强制性复选框,您也可以注册。
这是最适合我这篇文章所需的代码
// To add the form
function add_age_verification() {
?>
<p class="form-row form-row-first">
<label for="reg_age_verification" class="woocommerce-form__label woocommerce-form__label-for-checkbox"><?php _e( 'age verification', 'woocommerce' ); ?> <span class="required">*</span></label>
<input type="checkbox" class="woocommerce-form__input woocommerce-form__input-checkbox" name="age_verification" id="reg_age_verification" value="<?php if ( ! empty( $_POST['age_verification'] ) ) esc_attr_e( $_POST['age_verification'] ); ?>" />
</p>
<div class="clear"></div>
<?php
}
// to validate the form
function validate_age_verification( $errors, $username, $email ) {
if ( isset( $_POST['age_verification'] ) && empty( $_POST['age_verification'] ) ) {
$errors->add( 'age_verification_error', __( '<strong>Error</strong>: First name is required!', 'woocommerce' ) );
}
return $errors;
}
// to save the form into user meta age_verification
function age_verification_save( $customer_id ) {
if ( isset( $_POST['age_verification'] ) ) {
update_user_meta( $customer_id, 'age_verification', sanitize_text_field( $_POST['age_verification'] ) );
}
}
add_action( 'woocommerce_register_form', 'add_age_verification' );
add_filter( 'woocommerce_registration_errors', 'validate_age_verification', 10, 3 );
add_action( 'woocommerce_created_customer', 'age_verification_save' );
除了钩子的不兼容之外,我已执行的测试的第二个复选框也出现在一行中的短语和下面的复选框。它必须全部放在一条线上。
我怎样才能做到这一点并让两个钩子都工作而不产生不兼容性?
解决方案
您的代码包含一些小错误
woocommerce_created_customer
隐私政策中缺失reg_age_verification
&age_verification
可以互换使用- 关于字段的显示,这可以通过添加/修改 CSS 选择器来完成:
form-row-first
,form-row-last
&form-row-wide
。此外,这是 CSS 调整的问题,具体取决于您使用的主题
所以你得到:
// Add fields to register page
function action_woocommerce_register_form() {
// First checkbox
woocommerce_form_field( 'politica_privacidad_registro', array(
'type' => 'checkbox',
'class' => array( 'woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide' ),
'label_class' => array( 'woocommerce-form__label woocommerce-form__label-for-checkbox checkbox' ),
'input_class' => array( 'woocommerce-form__input woocommerce-form__input-checkbox input-checkbox' ),
'required' => true,
'label' => __( 'He leído y acepto la política de privacidad', 'woocommerce' ),
));
// Second checkbox
woocommerce_form_field( 'age_verification', array(
'type' => 'checkbox',
'class' => array( 'woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide' ),
'label_class' => array( 'woocommerce-form__label woocommerce-form__label-for-checkbox checkbox' ),
'input_class' => array( 'woocommerce-form__input woocommerce-form__input-checkbox input-checkbox' ),
'required' => true,
'label' => __( 'Age verification', 'woocommerce'),
));
}
add_action( 'woocommerce_register_form', 'action_woocommerce_register_form' );
// Validation
function filter_woocommerce_registration_errors( $errors, $username, $email ) {
// Privacy NOT isset
if ( ! (int) isset( $_POST['politica_privacidad_registro'] ) ) {
$errors->add( 'politica_privacidad_registro_error', __( 'Tienes que aceptar nuestra política de privacidad.', 'woocommerce' ) );
}
// Age NOT isset
if ( ! (int) isset( $_POST['age_verification'] ) ) {
$errors->add( 'age_verification_error', __( 'Age is required.', 'woocommerce' ) );
}
return $errors;
}
add_filter( 'woocommerce_registration_errors', 'filter_woocommerce_registration_errors', 10, 3 );
// Save fields
function action_woocommerce_created_customer( $customer_id, $new_customer_data, $password_generated ) {
// Privacy isset
if ( isset( $_POST['politica_privacidad_registro'] ) ) {
update_user_meta( $customer_id, 'politica_privacidad_registro', sanitize_text_field( $_POST['politica_privacidad_registro'] ) );
}
// Age isset
if ( isset( $_POST['age_verification'] ) ) {
update_user_meta( $customer_id, 'age_verification', sanitize_text_field( $_POST['age_verification'] ) );
}
}
add_action( 'woocommerce_created_customer', 'action_woocommerce_created_customer', 10 , 3 );
推荐阅读
- javascript - Mongoose .findByIdAndUpdate() 控制台记录返回但无法分配给属性
- php - 如何为 public_html 文件路径编写 htaccess 代码?
- javascript - 使用多个选择下拉列表过滤 HTML 表格
- javascript - Mongoose:过滤嵌套文档
- function - 在 for 循环中使用 value_counts 创建函数
- boost - 构建 boost.build 引擎
- azure - 使用 Azure 函数 v1 的 Http 响应中不存在内容长度标头
- python - 使用 Sympy 求解齐次线性系统
- jquery - “慢”动画速度不起作用
- javascript - 有什么方法可以从已删除的 Chrome 扩展程序中恢复本地存储数据?