我已经通过更改模板中添加了送货方式部分两个自定义输入字段/genesis-sample/woocommerce/checkout/review-order.php
我还设法让他们条件必需的。 只有当特定单选按钮被选中,输入字段出现,并成为必需。 我使用jQuery代码使字段出现和消失。 所有这一切都工作正常。 该代码是在这里:
if ( isset($_POST['shipping_method_0_legacy_local_pickup']) && $_POST['shipping_method_0_legacy_local_pickup'] == 1 ) {
$cheq = 'true';
}
else {
$cheq = 'false';
}
woocommerce_form_field( 'fieldtester1' , array(
'type' => 'text',
'class' => array('wccs-field-class wccs-form-row-wide blahblah1'),
'label' => 'Enter Your Carrier Name',
'required' => $cheq,
'placeholder' => 'Carrier Name',
), $checkout->get_value( 'fieldtester1' ));
woocommerce_form_field( 'fieldtester2' , array(
'type' => 'text',
'class' => array('wccs-field-class wccs-form-row-wide blahblah2'),
'label' => 'Enter Your Carrier Account #',
'required' => $cheq,
'placeholder' => 'Carrier Number',
), $checkout->get_value( 'fieldtester2' ));
但这里的问题,即使有required
设置为属性true
的两个领域,如果当字段为空,验证不会发生Place Order
按钮被按下。 理想情况下,为了不应该去通过,并应当产生一个错误信息。 我已经添加下面的代码functions.php
强制输入字段的验证,但它不会做任何事情。 该代码是在这里:
add_action('woocommerce_checkout_process', 'carrier_checkout_process');
function carrier_checkout_process() {
if ( isset($_POST['shipping_method_0_legacy_local_pickup']) && $_POST['shipping_method_0_legacy_local_pickup'] == 1 ) {
if( empty( $_POST['fieldtester1'] ) ) {
wc_add_notice( ( "Please don't forget to enter your shipping carrier details." ), "error" );
}
}
}
所以,在这里就是我要找:
- 谁能帮助我在强迫我加入了两个输入字段的验证?
- 验证后,我也想在WordPress后台添加新订单电子邮件这两个领域,以及订单的详细信息。
如果你想知道我为什么不使用woocommerce结账场挂钩添加输入字段摆在首位...我不添加字段到结账表单,这样挂钩的任何帮助没有。 该字段在送货方式部分加入。 另一个原因是,我想更新required
每个用户将切换的运输方式时间属性。 使用jQuery改变required
属性是不工作无论出于何种原因,相信我,我试过了两天。 不管怎么说,这部分已经工作。 唯一的问题越来越领域的验证,并将其添加到订单电子邮件和订单详细信息。 我环顾四周,到处和我最接近的帮助是这个职位,其中LoicTheAztec给予了详细的解决方案
这可以在不使用jQuery的一个特殊的钩,将显示下方的两个“承运人”的自定义字段进行legacy_local_pickup
时,它选择的送货方式。 如果客户变更为不同的运输方式,这些领域将被删除。
所以,你应该需要之前删除您的自定义模板,以及所有相关的代码。
现在验证完美的作品,当“承运人”的自定义字段被填充,它们将被保存,以便元数据。
// Add custom fields to a specific selected shipping method
add_action( 'woocommerce_after_shipping_rate', 'carrier_custom_fields', 20, 2 );
function carrier_custom_fields( $method, $index ) {
if( ! is_checkout()) return; // Only on checkout page
$customer_carrier_method = 'legacy_local_pickup';
if( $method->id != $customer_carrier_method ) return; // Only display for "local_pickup"
$chosen_method_id = WC()->session->chosen_shipping_methods[ $index ];
// If the chosen shipping method is 'legacy_local_pickup' we display
if($chosen_method_id == $customer_carrier_method ):
echo '<div class="custom-carrier">';
woocommerce_form_field( 'carrier_name' , array(
'type' => 'text',
'class' => array('form-row-wide carrier-name'),
'label' => 'Carrier Information:',
'required' => true,
'placeholder' => 'Carrier Name',
), WC()->checkout->get_value( 'carrier_name' ));
woocommerce_form_field( 'carrier_number' , array(
'type' => 'text',
'class' => array('form-row-wide carrier-number'),
'required' => true,
'placeholder' => 'Carrier Number',
), WC()->checkout->get_value( 'carrier_number' ));
echo '</div>';
endif;
}
// Check custom fields validation
add_action('woocommerce_checkout_process', 'carrier_checkout_process');
function carrier_checkout_process() {
if( isset( $_POST['carrier_name'] ) && empty( $_POST['carrier_name'] ) )
wc_add_notice( ( "Please don't forget to enter the shipping carrier name." ), "error" );
if( isset( $_POST['carrier_number'] ) && empty( $_POST['carrier_number'] ) )
wc_add_notice( ( "Please don't forget to enter the shipping carrier account number." ), "error" );
}
// Save custom fields to order meta data
add_action( 'woocommerce_checkout_update_order_meta', 'carrier_update_order_meta', 30, 1 );
function carrier_update_order_meta( $order_id ) {
if( isset( $_POST['carrier_name'] ))
update_post_meta( $order_id, '_carrier_name', sanitize_text_field( $_POST['carrier_name'] ) );
if( isset( $_POST['carrier_number'] ))
update_post_meta( $order_id, '_carrier_number', sanitize_text_field( $_POST['carrier_number'] ) );
}
这一代码进入你的活跃儿童主题(或主题)的function.php文件。 测试和工程。
不显示:
当“本地拾取”选择显示: