dongshendi3599 2019-04-16 17:25
浏览 137
已采纳

如何在WooCommerce结帐中创建表单字段

In the Checkout form I created a select field. My question is how in Wordpress or Woocmmerce this camp can be left as required.

<p class="form-row form-row-wide validate-required validate-region" id="shipping_region_field" data-priority="6">

  <select name="shipping_region" id="shipping_region" class="state_select select2-selection--single" autocomplete="address-level1" data-placeholder="" tabindex="-1" aria-hidden="true">
        <option>Opción 01</option>
        <option>Opción 02</option>
  </select>
</p>
  • 写回答

2条回答 默认 最新

  • dtxpz8785 2019-04-16 19:51
    关注

    1) For normal or custom billing and shipping fields you can use woocommerce_billing_fields or woocommerce_shipping_fields action hooks on checkout page as follow.

    It will make a custom checkout field required without any need to add a validation script and to save it in the order. The field will also appear in My account edit adresses field section.

    Some argument explanations:

    • The class 'update_totals_on_change' allow to trigger "update checkout" on change.
    • The 'required' attribute make the field required or not
    • The 'priority' attribute allow you to change the location of the field.

    The code:

    add_filter( 'woocommerce_shipping_fields', 'display_shipping_region_checkout_field', 20, 1 );
    function display_shipping_region_checkout_field( $fields ) {
        $fields['shipping_region'] = array(
            'type'        => 'select',
            'label'       => __("Region", "woocommerce") ,
            'class'       => array('form-row-wide', 'update_totals_on_change'),
            'required'    => true,
            'options'       => array(
                ''         => __("Choose a region please"),
                'option-1' => __("Option 01"),
                'option-2' => __("Option 02"),
                'option-3' => __("Option 03"),
            ),
            'priority' => 100, 
            'clear' => true,
        );
        return $fields;
    }
    

    Code goes in function.php file of your active child theme (or active theme). Tested and works.

    enter image description here

    enter image description here


    2) In specific cases you need to use the woocommerce_default_address_fields filter. This filter is applied to all billing and shipping default fields *(see the documentation). It's used only some default checkout fields.

    3) You can also use woocommerce_checkout_fieldsthat has $fields as function argument (see documentation).

    4) For other custom checkout fields you can use one of the following hooks with the woocommerce_form_field() function:

    • woocommerce_before_checkout_billing_form has $checkout as function argument
    • woocommerce_before_checkout_billing_form has $checkout as function argument
    • woocommerce_before_checkout_shipping_form has $checkout as function argument
    • woocommerce_before_checkout_shipping_form has $checkout as function argument
    • woocommerce_before_order_notes has $checkout as function argument
    • woocommerce_after_order_notes has $checkout as function argument

    The code that display the field, validate the field and save the field in the order:

    // Display field
    add_action( 'woocommerce_after_checkout_shipping_form', 'display_shipping_region_after_checkout_shipping_form', 10, 1 );
    function display_shipping_region_after_checkout_shipping_form ( $checkout ) {
    
        woocommerce_form_field( 'shipping_region', array(
            'type'        => 'select',
            'label'       => __("Region", "woocommerce") ,
            'class'       => array('form-row-wide','update_totals_on_change'),
            'required'    => true,
            'options'       => array(
                ''         => __("Choose a region please"),
                'option-1' => __("Option 01"),
                'option-2' => __("Option 02"),
                'option-3' => __("Option 03"),
            ),
            'priority' => 100,
            'clear' => true,
        ), $checkout->get_value( 'shipping_region' ) );
    }
    
    // Field Validation
    add_action('woocommerce_checkout_process', 'shipping_region_custom_checkout_field_validation');
    function shipping_region_custom_checkout_field_validation() {
        if ( isset($_POST['shipping_region']) && empty($_POST['shipping_region']) )
            wc_add_notice( __( 'Please select something into Region field.' ), 'error' );
    }
    
    // Save Field value 
    add_action( 'woocommerce_checkout_create_order', 'action_checkout_create_order_callback', 10, 2 );
    function action_checkout_create_order_callback( $order, $data ) {
        if ( isset($_POST['shipping_region']) && empty($_POST['shipping_region']) ) {
            $order->update_meta_data( '_shipping_region', esc_attr($_POST['shipping_region']) );
            if( $order->get_user_id() > 0 )
                update_user_met( $order->get_user_id(), 'shipping_region', esc_attr($_POST['shipping_region']) );
        }
    }
    

    Code goes in function.php file of your active child theme (or active theme). Tested and works.


    WooCommerce Documentation: Customizing checkout fields using actions and filters

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 shape_predictor_68_face_landmarks.dat
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制