php - 如何在 WooCommerce 结帐中制作所需的表单字段
问题描述
在结帐表单中,我创建了一个选择字段。我的问题是如何在 Wordpress 或 Woocmmerce 中根据需要保留这个营地。
<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>
解决方案
1) 对于正常或自定义的计费和运输字段,您可以在结帐页面上使用woocommerce_billing_fields
或woocommerce_shipping_fields
操作挂钩,如下所示。
它将需要一个自定义结帐字段,而无需添加验证脚本并将其保存在订单中。该字段也将出现在我的帐户编辑地址字段部分。
一些论据解释:
- 该类
'update_totals_on_change'
允许在更改时触发“更新结帐”。 - 该
'required'
属性使该字段成为必填项 - 该
'priority'
属性允许您更改字段的位置。
编码:
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;
}
代码位于您的活动子主题(或活动主题)的 function.php 文件中。测试和工作。
2)在特定情况下,您需要使用woocommerce_default_address_fields
过滤器。此过滤器适用于所有计费和运输默认字段 *(请参阅文档)。它仅使用一些默认结帐字段。
3)您也可以使用woocommerce_checkout_fields
that has$fields
作为函数参数(请参阅文档)。
4) 对于其他自定义结帐字段,您可以将以下钩子之一与 woocommerce_form_field() 函数一起使用:
woocommerce_before_checkout_billing_form
有$checkout
作为函数参数woocommerce_before_checkout_billing_form
有$checkout
作为函数参数woocommerce_before_checkout_shipping_form
有$checkout
作为函数参数woocommerce_before_checkout_shipping_form
有$checkout
作为函数参数woocommerce_before_order_notes
有$checkout
作为函数参数woocommerce_after_order_notes
有$checkout
作为函数参数
显示字段、验证字段并按顺序保存字段的代码:
// 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']) );
}
}
代码位于您的活动子主题(或活动主题)的 function.php 文件中。测试和工作。
WooCommerce 文档:使用操作和过滤器自定义结帐字段
推荐阅读
- azure - 如何将文件从工件目录复制到 azure app 服务?
- c# - 在 .NET 中创建和处置 KeyVaultClient
- oop - 我们可以说调用任何普通方法也称为抽象,因为它提供了它的功能并隐藏了实现吗?
- r - Read UTF-8 text in R
- java - java语言中的Snmp版本3 Getbulk OPeration
- azure - Terraform azure - keyvault key generation - access denied
- angular - 如何在 MatTable 中显示键值条件数据?
- r - 是否有一个 R 函数可以为一组变量的每个值减去不同的中位数?
- php - 在php中修剪电子邮件字段
- google-classroom - 如何使用 Google 课堂 API 将班级的所有权转让给没有原始教师帐户的其他教师