Woocommerce附加注册字段验证无效

时间:2016-02-29 20:56:29

标签: php wordpress validation woocommerce registration

我已经按照教程为注册添加了一个额外的字段,但我无法让它验证。它不需要保存,只需要一次性问题来确认用户做了正确的事情。

我已将下面的内容添加到functions.php中,但它无法正常工作......有人可以看到为什么会这样吗?

function wooc_extra_register_fields() {
?>
<?php if (($_GET['register'] == 'instructor')) : ?>
<p class="form-row form-row-wide">
<label for="reg_instructor"><?php _e( 'Please confirm you\'re trying to register as an instructor', 'woocommerce' ); ?> <span class="required">*</span></label>
<input type="checkbox" class="checkbox" name="instructor" id="reg_instructor" value="<?php if ( ! empty( $_POST['instructor'] ) ) echo esc_attr( $_POST['instructor'] ); ?>" />
</p>
<?php endif; ?>
<?php
}


add_action( 'woocommerce_register_form_start', 'wooc_extra_register_fields' );
function wooc_validate_extra_register_fields( $username, $email, $validation_errors ) {
if ( isset( $_POST['instructor'] ) && empty( $_POST['instructor'] ) ) {
$validation_errors->add( 'instructor_error', __( 'You must be an instructor!', 'woocommerce' ) );
}
}
add_action( 'woocommerce_register_post', 'wooc_validate_extra_register_fields', 10, 3 );


add_action('user_profile_update_errors','instructor_validation',10,1);
function instructor_validation($args)
{
if ( isset( $_POST['instructor'] ) && empty( $_POST['instructor'] ) ) {
$args->add( 'instructor_error', __( 'You must be an instructor!', 'woocommerce' ),'');
}
}


function wooc_save_extra_register_fields( $customer_id ) {
if ( isset( $_POST['instructor'] ) ) {
update_user_meta( $customer_id, 'instructor', sanitize_text_field( $_POST['instructor'] ) );
}
}
add_action( 'woocommerce_created_customer', 'wooc_save_extra_register_fields' );

任何帮助,非常感谢...

谢谢, 马特

1 个答案:

答案 0 :(得分:1)

完全未经测试,因为我现在无法检查。但似乎你没有复选框的价值。然后您正在验证if ( isset( $_POST['instructor'] ) && empty( $_POST['instructor'] ) ),但如果设置了复选框,那么它永远不会是empty,因此您永远无法满足条件。最后,您不需要sanitize_text_field(),因为它不是文本字段。

相反,我已将复选框值设置为1并测试发布的值是否等于1.WooCommerce实际上使用了大量yesno的布尔复选框和甚至可能更容易,所以你可以尝试,如果你需要。但是,如果只是测试盒子是否被检查并且等于特定的东西,它几乎不重要。

function wooc_extra_register_fields() { ?>
    <?php if ( isset($_GET['register']) && ($_GET['register'] == 'instructor')) : ?>
    <p class="form-row form-row-wide">
    <label for="reg_instructor"><?php _e( 'Please confirm you\'re trying to register as an instructor', 'woocommerce' ); ?> <span class="required">*</span></label>
    <input type="checkbox" class="checkbox" name="instructor" id="reg_instructor" value="1" <?php checked ( isset($_POST['instructor']) && 1 == $_POST['instructor'], true ); ?>/>
    </p>
    <?php endif; ?>
<?php
}
add_action( 'woocommerce_register_form_start', 'wooc_extra_register_fields' );


function wooc_validate_extra_register_fields( $username, $email, $validation_errors ) {
    if ( ! isset( $_POST['instructor'] ) || 1 != $_POST['instructor'] ) {
        $validation_errors->add( 'instructor_error', __( 'You must be an instructor!', 'woocommerce' ) );
    }
}
add_action( 'woocommerce_register_post', 'wooc_validate_extra_register_fields', 10, 3 );



function instructor_validation($args){
    if ( ! isset( $_POST['instructor'] ) || 1 != $_POST['instructor'] ) {
        $args->add( 'instructor_error', __( 'You must be an instructor!', 'woocommerce' ),'');
    }
}
add_action('user_profile_update_errors','instructor_validation',10,1);


function wooc_save_extra_register_fields( $customer_id ) {
    if ( isset( $_POST['instructor'] ) && 1 == $_POST['instructor'] ) {
        update_user_meta( $customer_id, 'instructor', 1 );
    }
}
add_action( 'woocommerce_created_customer', 'wooc_save_extra_register_fields' );

PS-我的代码可能会对不是教师的注册人产生负面影响,如果您需要详细说明验证的条件逻辑,可能会再次检查$_GET['register']变量

修改

这是我对如何将用户元素添加到WooCommerce字段的最佳猜测。但是,无法控制值显示的内容,因此1.您可以调整保存instructor元的方式...保存为“是”&#39;或者&#39;讲师&#39;或者其他的东西。或者,添加您自己的custom user meta section

function wooc_show_customer_meta_fields( $fields ){
    $fields['instructor'] = array(
                'title' => __( 'Instructors', 'your-plugin' ),
                'fields' => array(
                    'instructor' => array(
                        'label'       => __( 'Instructor Status', 'your-plugin' ),
                        'description' => ''
                    )
                );
    return $fields;
}
add_filter( 'woocommerce_customer_meta_fields', 'wooc_show_customer_meta_fields' );