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条)

报告相同问题?

悬赏问题

  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大