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 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?