Show/hide 基于 select 字段的自定义字段,在 WooCommerce 结账时进行了验证

Show/hide custom field based on a select field with validation in WooCommerce checkout

我使用以下代码在 WooCommerce 的结帐页面上添加了自定义 select 字段和自定义文本字段。

我想默认隐藏此文本字段,只有在 select 从 select 字段 select 编辑“推荐计划”选项时,它才应该可见

这是我的代码,可以正常工作。除了文本字段始终可见, 无论做出什么选择。

// add fields

add_action( 'woocommerce_after_checkout_billing_form', 'my_select_field' );
add_action( 'woocommerce_after_order_notes', 'referralName_textbox' );
 
// save fields to order meta
add_action( 'woocommerce_checkout_update_order_meta', 'save_what_we_added' );
 
// select
function my_select_field( $checkout ){
 
    // you can also add some custom HTML here
 
    woocommerce_form_field( 'referrence', array(
        'type'          => 'select', // text, textarea, select, radio, checkbox, password, about custom validation a little later
        'required'  => true, 
        'class'         => array('my-field', 'form-row-wide'), // array only, read more about classes and styling in the previous step
        'label'         => 'From where you hear about us',
        'label_class'   => 'my-label',
        'options'   => array( // options for <select> or <input type="radio" />
            ''      => 'Please select', // empty values means that field is not selected
            'Google'    => 'Google', // 'value'=>'Name'
            'LinkedIn'  => 'LinkedIn',
            'Facebook'  => 'Facebook',
            'Email' => 'Email',
            'Referral Program'  => 'Referral Program', // 'value'=>'Name'
            'Other' => 'Other'
            )
        ), $checkout->get_value( 'referrence' ) );
 
    // you can also add some custom HTML here
 
}
 
// checkbox
function referralName_textbox( $checkout ) {
 
    woocommerce_form_field( 'referralName', array(
        'type'  => 'text',
        'class' => array('my-field form-row-wide'),
        'label' => ' Referral Name',
        ), $checkout->get_value( 'Referral Name' ) );
 
}
 
// save field values
function misha_save_what_we_added( $order_id ){
 
    if( !empty( $_POST['referrence'] ) )
        update_post_meta( $order_id, 'referrence', sanitize_text_field( $_POST['referrence'] ) );
 
 
    if( !empty( $_POST['ReferralName'] ) )
        update_post_meta( $order_id, 'ReferralName', sanitize_text_field( $_POST['ReferralName'] ));
 
}
//

能否请您指导我如何实现文本字段仅可见,具体取决于使用 WordPress 挂钩和函数在 select 字段中的选择?

  • 如果 select 在 select 字段中未输入任何内容,提交表单时将出现错误消息。
  • 如果 select 编辑了“推荐计划”,文本字段将变为可见。如果另一个选项是 selected,文本字段将被隐藏。
  • 由于“referralname”文本字段是可选的,因此不提供验证。

所以你得到:

// Add fields
function action_woocommerce_after_checkout_billing_form( $checkout ) {
    // Add select field
    woocommerce_form_field( 'referrence', array(
        'type'          => 'select', // text, textarea, select, radio, checkbox, password, about custom validation a little later
        'required'      => true, 
        'class'         => array( 'my-field', 'form-row-wide' ), // array only, read more about classes and styling in the previous step
        'label'         => 'From where you hear about us',
        'label_class'   => 'my-label',
        'options'       => array( // options for <select> or <input type="radio" />
            ''                 => 'Please select', // empty values means that field is not selected
            'Google'           => 'Google', // 'value' => 'Name'
            'LinkedIn'         => 'LinkedIn',
            'Facebook'         => 'Facebook',
            'Email'            => 'Email',
            'Referral Program' => 'Referral Program',
            'Other'            => 'Other'
        )
    ), $checkout->get_value( 'referrence' ) );
    
    // Add textfield
    woocommerce_form_field( 'referralname', array(
        'type'  => 'text',
        'class' => array( 'my-field form-row-wide' ),
        'label' => ' Referral Name',
    ), $checkout->get_value( 'referralname' ) );

    // jQuery show/hide custom textfield
    ?>
    <script>
    jQuery(document).ready(function($) {
        // Hide textfield by default
        $( '#referralname_field' ).hide();

        // On change
        $( 'select#referrence' ).change( function() {
            if ( $( 'select#referrence' ).val() == 'Referral Program' ) {
                $( '#referralname_field' ).show();
            } else {
                $( '#referralname_field' ).hide();              
            }
        });
      
    });
    </script>
    <?php
}
add_action( 'woocommerce_after_checkout_billing_form', 'action_woocommerce_after_checkout_billing_form', 10, 1 );

// Validate select field
function action_woocommerce_checkout_process() {
    // Isset    
    if ( isset( $_POST['referrence'] ) ) {
        $domain = 'woocommerce';
        $referrence = $_POST['referrence'];
        
        // Empty
        if ( empty ( $referrence ) ) {
            wc_add_notice( __( 'Please select from where you hear about us', $domain ), 'error' );
        }
        
        // NOT empty but value is 'Please select'
        if ( ! empty ( $referrence ) && $referrence == 'Please select' ) {
            wc_add_notice( __( 'Please select from where you hear about us', $domain ), 'error' );
        }       
    }
}
add_action( 'woocommerce_checkout_process', 'action_woocommerce_checkout_process', 10, 0 );

// Save fields
function action_woocommerce_checkout_create_order( $order, $data ) {
    // Isset    
    if ( isset( $_POST['referrence'] ) ) {
        $referrence = $_POST['referrence'];
    
        // Update meta data
        $order->update_meta_data( 'referrence', sanitize_text_field( $referrence ) );
    }
    
    // Isset    
    if ( isset( $_POST['referralname'] ) ) {
        $referralname = $_POST['referralname'];
    
        // Update meta data
        $order->update_meta_data( 'referralname', sanitize_text_field( $referralname ) );
    }   
}
add_action( 'woocommerce_checkout_create_order', 'action_woocommerce_checkout_create_order', 10, 2 );