根据选择器选择显示自定义结帐字段

基于这个工作答案:
自定义下拉选择器显示或隐藏其他Checkout自定义字段

在WooCommerce结帐页面中,我使用下面的代码创建一些其他自定义字段并重新排序所有结帐字段。 我使用jQuery脚本根据选择器选项显示/隐藏一些字段。

这是我的新代码:

// Registering external jQuery/JS file function cfields_scripts() { /* IMPORTANT NOTE: For a child theme replace get_template_directory_uri() by get_stylesheet_directory_uri() The external cfields.js file goes in a subfolder "js" of your active child theme or theme.*/ wp_enqueue_script( 'checkout_script', get_template_directory_uri().'/js/cfields.js', array('jquery'), '1.0', true ); } add_action( 'wp_enqueue_scripts', 'cfields_scripts' ); add_filter( 'woocommerce_checkout_fields', 'custom_checkout_billing_fields' ); function custom_checkout_billing_fields( $fields ) { // 1. Creating the additional custom billing fields // The "status" selector $fields['billing']['billing_status']['type'] = 'select'; $fields['billing']['billing_status']['class'] = array('form-row-wide, status-select'); $fields['billing']['billing_status']['required'] = true; $fields['billing']['billing_status']['label'] = __('Statut Juridic', 'my_theme_slug'); $fields['billing']['billing_status']['placeholder'] = __('Alege statutul', 'my_theme_slug'); $fields['billing']['billing_status']['options'] = array( '1' => __( 'Persoana Fizica', '' ), '2' => __( 'Persoana Juridica', '' ) ); // Customizing 'billing_company' field ['required'] $fields['billing']['billing_company']['required'] = false; $fields['billing']['billing_company']['class'] = array('form-row-wide', 'status-group2'); // The "Nr. registrul comertului" text field $fields['billing']['billing_ser_id']['type'] = 'text'; $fields['billing']['billing_ser_id']['class'] = array('form-row-wide', 'status-group2'); $fields['billing']['billing_ser_id']['required'] = false; $fields['billing']['billing_ser_id']['label'] = __('Nr. Reg. Comert', 'my_theme_slug'); $fields['billing']['billing_ser_id']['placeholder'] = __('Introdu numarul', 'my_theme_slug'); // The "Banca" text field $fields['billing']['billing_bt_id']['type'] = 'text'; $fields['billing']['billing_bt_id']['class'] = array('form-row-wide', 'status-group2'); $fields['billing']['billing_bt_id']['required'] = false; $fields['billing']['billing_bt_id']['label'] = __('Banca', 'my_theme_slug'); $fields['billing']['billing_bt_id']['placeholder'] = __('Adauga Banca', 'my_theme_slug'); // The "IBAN" text field $fields['billing']['billing_ib_id']['type'] = 'text'; $fields['billing']['billing_ib_id']['class'] = array('form-row-wide', 'status-group2'); $fields['billing']['billing_ib_id']['required'] = false; $fields['billing']['billing_ib_id']['label'] = __('IBAN', 'my_theme_slug'); $fields['billing']['billing_ib_id']['placeholder'] = __('Adauga IBAN-ul', 'my_theme_slug'); // The "CIF" text field $fields['billing']['billing_cf_id']['type'] = 'text'; $fields['billing']['billing_cf_id']['class'] = array('form-row-wide', 'status-group2'); $fields['billing']['billing_cf_id']['required'] = false; $fields['billing']['billing_cf_id']['label'] = __('Cod Fiscal', 'my_theme_slug'); $fields['billing']['billing_cf_id']['placeholder'] = __('Adauga CIF-ul', 'my_theme_slug'); // 3. Ordering the billing fields $fields_order = array( 'billing_first_name', 'billing_last_name', 'billing_email', 'billing_phone', 'billing_address_1', 'billing_address_2', 'billing_postcode', 'billing_city', 'billing_country', 'billing_status', 'billing_company', 'billing_ser_id', 'billing_bt_id', 'billing_ib_id', 'billing_cf_id' ); foreach($fields_order as $field) $ordered_fields[$field] = $fields['billing'][$field]; $fields['billing'] = $ordered_fields; // Returning Checkout customized billing fields return $fields; } // Process the checkout add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process'); function custom_checkout_field_process() { // Check if set, if its not set add an error. if ( ! $_POST['billing_ser_id'] ) wc_add_notice( __( 'Please enter your Serial id.' , 'my_theme_slug' ), 'error' ); if ( ! $_POST['billing_bt_id'] ) wc_add_notice( __( 'Please enter your Serial id.' , 'my_theme_slug' ), 'error' ); if ( ! $_POST['billing_ib_id'] ) wc_add_notice( __( 'Please enter your Serial id.' , 'my_theme_slug' ), 'error' ); if ( ! $_POST['billing_cf_id'] ) wc_add_notice( __( 'Please enter your Serial id.' , 'my_theme_slug' ), 'error' ); } // Update the order meta with field value add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta' ); function custom_checkout_field_update_order_meta( $order_id ) { if ( ! empty( $_POST['billing_ser_id'] ) ) update_post_meta( $order_id, 'billing_ser_id', sanitize_text_field( $_POST['billing_ser_id'] ) ); if ( ! empty( $_POST['billing_bt_id'] ) ) update_post_meta( $order_id, 'billing_bt_id', sanitize_text_field( $_POST['billing_bt_id'] ) ); if ( ! empty( $_POST['billing_ib_id'] ) ) update_post_meta( $order_id, 'billing_ib_id', sanitize_text_field( $_POST['billing_ib_id'] ) ); if ( ! empty( $_POST['billing_cf_id'] ) ) update_post_meta( $order_id, 'billing_cf_id', sanitize_text_field( $_POST['billing_cf_id'] ) ); } // Display field value on the order edit page add_action( 'woocommerce_admin_order_data_after_billing_address', 'custom_checkout_field_display_admin_order_meta', 10, 1 ); function custom_checkout_field_display_admin_order_meta($order){ echo '

'.__('My serial identification').': ' . get_post_meta( $order->id, 'billing_ser_id', true ) . '

'; echo '

'.__('My serial identification').': ' . get_post_meta( $order->id, 'billing_bt_id', true ) . '

'; echo '

'.__('My serial identification').': ' . get_post_meta( $order->id, 'billing_ib_id', true ) . '

'; echo '

'.__('My serial identification').': ' . get_post_meta( $order->id, 'billing_cf_id', true ) . '

'; }

Javascript cfields.js代码 不完整的外部文件)

 // This file named "cfields.js" goes in a subfolder "js" of your active child theme or theme jQuery(document).ready(function($){ $('#billing_company_field').hide(function(){ $(this).removeClass("validate-required"); }); $('#billing_ser_id_field').hide(function(){ $(this).removeClass("validate-required"); }); $("#billing_number_id_field").addClass("validate-required"); $("#billing_status").change(function(){ if($("#billing_status option:selected").val() == "2"){ $('#billing_company_field').show(function(){ $(this).addClass("validate-required"); }); $('#billing_ser_id_field').show(function(){ $(this).addClass("validate-required"); }); } else if($("#billing_status option:selected").val() == "1"){ $('#billing_company_field').hide(function(){ $(this).removeClass("validate-required"); }); $('#billing_ser_id_field').hide(function(){ $(this).removeClass("validate-required"); }); } }); }); 

因为我有一些额外的字段,我现在需要的是在billing_status选择器打开时:

  1. Persoana Fizica选项值(个人) :仅显示billing_serial自定义字段。
  2. Persoana Juridica期权价值(公司) ,还有4个字段会显示:

    • billing_company现有字段(首先,在billing_serial之前)
    • billing_registration_id自定义字段(在这两种情况下始终显示此字段)
    • billing_bank_id自定义字段
    • billing_bankno_id自定义字段
    • billing_cif_id自定义字段

此外,我想在Thankyou Oder接收页面和电子邮件通知上显示此数据。

我还没有找到让它运转的方法。 我怎样才能让它正常工作?

提前致谢。

在此处更新WC 3+中的校验字段

当您添加其他海关字段并进行一些更改时,您将在下面找到使其正常工作的必要代码。 这正在成为一个真正的发展,不应该在这里问。 我总是试着完成我的开始,所以我回答它。

这里最困难的事情是当选择器在Individual上时,避免在隐藏的必填字段上发出WooCommerce警报通知。 为此,您有义务(在jQuery的帮助下)在隐藏字段中输入“否”值。

因此,当提交订单时,您将获得订单元数据中的所有自定义字段值(对于Individual您的隐藏字段将具有"no"值。 这是唯一可能的方式。
但是,由于我们可以处理显示的数据,甚至之后更新,这不是问题,因为你会看到……

这是PHP代码(在function.php中):

  // Registering external jQuery/JS file function cfields_scripts() { // IMPORTANT NOTE: // For a child theme replace get_template_directory_uri() by get_stylesheet_directory_uri() // The external cfields.js file goes in a subfolder "js" of your active child theme or theme. wp_enqueue_script( 'checkout_script', get_template_directory_uri().'/js/cfields.js', array('jquery'), '1.0', true ); } add_action( 'wp_enqueue_scripts', 'cfields_scripts' ); add_filter( 'woocommerce_checkout_fields', 'ba_custom_checkout_billing_fields' ); function ba_custom_checkout_billing_fields( $fields ) { // 1. Creating the additional custom billing fields // The "status" selector $fields['billing']['billing_status']['type'] = 'select'; $fields['billing']['billing_status']['class'] = array('form-row-wide, status-select'); $fields['billing']['billing_status']['required'] = true; $fields['billing']['billing_status']['label'] = __('Statut Juridic', 'theme_domain'); $fields['billing']['billing_status']['placeholder'] = __('Alege statutul', 'theme_domain'); $fields['billing']['billing_status']['options'] = array( '1' => __( 'Persoana Fizica', 'theme_domain' ), '2' => __( 'Persoana Juridica', 'theme_domain' ) ); // The "Nr. registrul comertului" text field (this field is common) $fields['billing']['billing_ser_id']['type'] = 'text'; $fields['billing']['billing_ser_id']['class'] = array('form-row-wide', 'status-group2'); $fields['billing']['billing_ser_id']['required'] = true; // <== HERE has to be "true" as it always be shown and need validation $fields['billing']['billing_ser_id']['label'] = __('Nr. Reg. Comert', 'theme_domain'); $fields['billing']['billing_ser_id']['placeholder'] = __('Introdu numarul', 'theme_domain'); // The "Banca" text field $fields['billing']['billing_bt_id']['type'] = 'text'; $fields['billing']['billing_bt_id']['class'] = array('form-row-wide', 'status-group2'); $fields['billing']['billing_bt_id']['required'] = false; $fields['billing']['billing_bt_id']['label'] = __('Banca', 'theme_domain'); $fields['billing']['billing_bt_id']['placeholder'] = __('Adauga Banca', 'theme_domain'); // The "IBAN" text field $fields['billing']['billing_ib_id']['type'] = 'text'; $fields['billing']['billing_ib_id']['class'] = array('form-row-wide', 'status-group2'); $fields['billing']['billing_ib_id']['required'] = false; $fields['billing']['billing_ib_id']['label'] = __('IBAN', 'theme_domain'); $fields['billing']['billing_ib_id']['placeholder'] = __('Adauga IBAN-ul', 'theme_domain'); // The "CIF" text field $fields['billing']['billing_cf_id']['type'] = 'text'; $fields['billing']['billing_cf_id']['class'] = array('form-row-wide', 'status-group2'); $fields['billing']['billing_cf_id']['required'] = false; $fields['billing']['billing_cf_id']['label'] = __('Cod Fiscal', 'theme_domain'); $fields['billing']['billing_cf_id']['placeholder'] = __('Adauga CIF-ul', 'theme_domain'); // 2. Ordering the billing fields $fields_order = array( 'billing_first_name', 'billing_last_name', 'billing_email', 'billing_phone', 'billing_address_1', 'billing_address_2', 'billing_postcode', 'billing_city', 'billing_country', 'billing_status', 'billing_company', 'billing_ser_id', 'billing_bt_id', 'billing_ib_id', 'billing_cf_id' ); foreach($fields_order as $field) $ordered_fields[$field] = $fields['billing'][$field]; $fields['billing'] = $ordered_fields; // 4. Returning Checkout customized billing fields return $fields; } // Process the checkout (Checking if required fields are not empty) add_action('woocommerce_checkout_process', 'ba_custom_checkout_field_process'); function ba_custom_checkout_field_process() { if ( ! $_POST['billing_ser_id'] ) wc_add_notice( __( 'Nr. Reg. Comert is a required field.', 'theme_domain' ), 'error' ); if ( ! $_POST['billing_bt_id'] ) wc_add_notice( __( 'Banca is a required field.', 'theme_domain' ), 'error' ); if ( ! $_POST['billing_ib_id'] ) wc_add_notice( __( 'IBAN is a required field.', 'theme_domain' ), 'error' ); if ( ! $_POST['billing_cf_id'] ) wc_add_notice( __( 'Cod Fiscal is a required field.', 'theme_domain' ), 'error' ); } // Adding/Updating meta data to the order with the custom-fields values add_action( 'woocommerce_checkout_update_order_meta', 'ba_custom_checkout_field_update_order_meta' ); function ba_custom_checkout_field_update_order_meta( $order_id ) { $billing_company = $_POST['billing_company']; $billing_ser_id = $_POST['billing_ser_id']; $billing_bt_id = $_POST['billing_bt_id']; $billing_ib_id = $_POST['billing_ib_id']; $billing_cf_id = $_POST['billing_cf_id']; // For Individual resetting billing company to "" (no value) instead of 'no' if ( !empty($billing_company) && 'no' == $billing_company ) update_post_meta( $order_id, '_billing_company', '' ); if ( !empty($billing_ser_id) ) update_post_meta( $order_id, '_billing_ser_id', sanitize_text_field( $billing_ser_id ) ); // Adding/updating data only for companies if ( !empty($billing_bt_id) && 'no' != $billing_bt_id ) update_post_meta( $order_id, '_billing_bt_id', sanitize_text_field( $billing_bt_id ) ); // Adding/updating data only for companies if ( !empty($billing_ib_id) && 'no' != $billing_ib_id ) update_post_meta( $order_id, '_billing_ib_id', sanitize_text_field( $billing_ib_id ) ); // Adding/updating data only for companies if ( !empty($billing_cf_id) && 'no' != $billing_cf_id ) update_post_meta( $order_id, '_billing_cf_id', sanitize_text_field( $billing_cf_id ) ); } // Display custom-field Title/values on the order edit page add_action( 'woocommerce_admin_order_data_after_billing_address', 'ba_custom_checkout_field_display_admin_order_meta', 10, 1 ); function ba_custom_checkout_field_display_admin_order_meta( $order ){ $output = ''; $billing_ser_id = get_post_meta( $order->id, '_billing_ser_id', true ); $billing_bt_id = get_post_meta( $order->id, '_billing_bt_id', true ); $billing_ib_id = get_post_meta( $order->id, '_billing_ib_id', true ); $billing_cf_id = get_post_meta( $order->id, '_billing_cf_id', true ); if ( !empty($billing_ser_id) ){ $output .= '

' . __( 'Nr. Reg. Comert', 'theme_domain' ) . ': ' . $billing_ser_id . '

'; } if ( !empty($billing_bt_id) && 'no' != $billing_bt_id ){ $output .= '

' . __( 'Banca', 'theme_domain' ) . ': ' . $billing_bt_id . '

'; } if ( !empty($billing_ib_id) && 'no' != $billing_ib_id ){ $output .= '

' . __( 'IBAN', 'theme_domain' ) . ': ' . $billing_ib_id . '

'; } if ( !empty($billing_cf_id) && 'no' != $billing_cf_id ){ $output .= '

' . __( 'Cod Fiscal', 'theme_domain' ) . ': ' . $billing_cf_id . '

'; } echo $output; }

要在客户订单视图, Thankyou页面, 我的帐户订单视图和电子邮件通知上显示数据,请在function.php文件中添加以下2个代码段:

 // Displaying data on order view in "customer details" zone add_action('woocommerce_order_details_after_customer_details','ba_add_values_to_order_item_meta', 10, 1 ); function ba_add_values_to_order_item_meta( $order ) { $output = ''; $billing_ser_id = get_post_meta( $order->id, '_billing_ser_id', true ); $billing_bt_id = get_post_meta( $order->id, '_billing_bt_id', true ); $billing_ib_id = get_post_meta( $order->id, '_billing_ib_id', true ); $billing_cf_id = get_post_meta( $order->id, '_billing_cf_id', true ); if ( !empty($billing_ser_id) ) $output .= '  ' . __( "Nr. Reg. Comert:", "woocommerce" ) . ' ' . $billing_ser_id . ' '; if ( !empty($billing_bt_id) && 'no' != $billing_bt_id ) $output .= '  ' . __( "Banca:", "woocommerce" ) . ' ' . $billing_bt_id . ' '; if ( !empty($billing_ib_id) && 'no' != $billing_ib_id ) $output .= '  ' . __( "IBAN:", "woocommerce" ) . ' ' . $billing_ib_id . ' '; if ( !empty($billing_cf_id) && 'no' != $billing_cf_id ) $output .= '  ' . __( "Cod Fiscal:", "woocommerce" ) . ' ' . $billing_cf_id . ' '; echo $output; } // Displaying data on email notifications add_action('woocommerce_email_customer_details','ba_add_values_to_emails_notifications', 15, 4 ); function ba_add_values_to_emails_notifications( $order, $sent_to_admin, $plain_text, $email ) { $output = '
    '; $billing_ser_id = get_post_meta( $order->id, '_billing_ser_id', true ); $billing_bt_id = get_post_meta( $order->id, '_billing_bt_id', true ); $billing_ib_id = get_post_meta( $order->id, '_billing_ib_id', true ); $billing_cf_id = get_post_meta( $order->id, '_billing_cf_id', true ); if ( !empty($billing_ser_id) ) $output .= '
  • ' . __( "Nr. Reg. Comert:", "woocommerce" ) . ' ' . $billing_ser_id . '
  • '; if ( !empty($billing_bt_id) && 'no' != $billing_bt_id ) $output .= '
  • ' . __( "Banca:", "woocommerce" ) . ' ' . $billing_bt_id . '
  • '; if ( !empty($billing_ib_id) && 'no' != $billing_ib_id ) $output .= '
  • ' . __( "IBAN:", "woocommerce" ) . ' ' . $billing_ib_id . '
  • '; if ( !empty($billing_cf_id) && 'no' != $billing_cf_id ) $output .= '
  • ' . __( "Cod Fiscal:", "woocommerce" ) . ' ' . $billing_cf_id . '
  • '; $output .= '
'; echo $output; }

Javascript cfields.js代码 (外部文件):

 // This file named "cfields.js" goes in a subfolder "js" of your active child theme or theme jQuery(document).ready(function($){ // Common Serial ID field if(! $("#billing_ser_id_field").hasClass("validate-required") ){ $("#billing_ser_id_field").addClass("validate-required"); } // The 4 Fields to hide at start (if not "Persoana Juridica") if($("#billing_status option:selected").val() == "1"){ $('#billing_company_field').hide(function(){ $(this).removeClass("validate-required"); $(this).removeClass("woocommerce-validated"); $('#billing_company').val("no"); }); $('#billing_bt_id_field').hide(function(){ $(this).removeClass("validate-required"); $(this).removeClass("woocommerce-validated"); $('#billing_bt_id').val("no"); }); $('#billing_ib_id_field').hide(function(){ $(this).removeClass("validate-required"); $(this).removeClass("woocommerce-validated"); $('#billing_ib_id').val("no"); }); $('#billing_cf_id_field').hide(function(){ $(this).removeClass("validate-required"); $(this).removeClass("woocommerce-validated"); $('#billing_cf_id').val("no"); }); } // Action with the selector (Showing/hiding and adding/removing classes) $("#billing_status").change(function(){ // For "Persoana Juridica" if($("#billing_status option:selected").val() == "2") { $('#billing_company_field').show(function(){ $(this).addClass("validate-required"); $('#billing_company').val(""); }); $('#billing_bt_id_field').show(function(){ $(this).children('label').append( ' *' ); $(this).addClass("validate-required"); $('#billing_bt_id').val(""); }); $('#billing_ib_id_field').show(function(){ $(this).children('label').append( ' *' ); $(this).addClass("validate-required"); $('#billing_ib_id').val(""); }); $('#billing_cf_id_field').show(function(){ $(this).children('label').append( ' *' ); $(this).addClass("validate-required"); $('#billing_cf_id').val(""); }); } // For "Persoana Fizica" else if($("#billing_status option:selected").val() == "1") { $('#billing_company_field').hide(function(){ $(this).removeClass("validate-required"); $(this).removeClass("woocommerce-validated"); $('#billing_company').val("no"); }); $('#billing_bt_id_field').hide(function(){ $(this).children("abbr.required").remove(); $(this).removeClass("validate-required"); $(this).removeClass("woocommerce-validated"); $('#billing_bt_id').val("no"); }); $('#billing_ib_id_field').hide(function(){ $(this).children("abbr.required").remove(); $(this).removeClass("validate-required"); $(this).removeClass("woocommerce-validated"); $('#billing_ib_id').val("no"); }); $('#billing_cf_id_field').hide(function(){ $(this).children("abbr.required").remove(); $(this).removeClass("validate-required"); $(this).removeClass("woocommerce-validated"); $('#billing_cf_id').val("no"); }); } }); }); 

所有这些代码都经过测试和运行