【问题标题】:Shipping carrier custom fields validation in Woocommerce checkout pageWoocommerce 结帐页面中的承运人自定义字段验证
【发布时间】:2018-08-15 23:59:37
【问题描述】:

我通过更改模板/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" );
        }
    }
}

所以,这就是我要找的东西:

  1. 谁能帮我强制验证两个输入字段我 添加了吗?
  2. 验证后,我还想在新的订单电子邮件中添加这两个字段,并在 Wordpress 仪表板中添加订单详细信息。

如果您想知道为什么我首先不使用 woocommerce 结帐字段挂钩来添加输入字段...我没有将字段添加到结帐表单,因此挂钩没有任何帮助。这些字段被添加到运输方式部分。另一个原因是,我想在每次用户切换运输方式时更新required 属性。使用 Jquery 更改 required 属性无论出于何种原因都不起作用,相信我我尝试了两天。无论如何,那部分已经开始工作了。唯一的问题是让字段验证并将它们添加到订单电子邮件和订单详细信息中。我环顾四周,最接近的帮助是这篇帖子where LoicTheAztec gave a detailed solution

【问题讨论】:

  • 刚刚在该链接上投票支持您的答案,这是模板pastebin.com/HK8AEuim 的完整代码,还有用于隐藏和显示字段的 JQuery 代码。 WooCommerce 版本是 3.0.5。实时站点在这里truckingtarps.com/shop我已经尝试过您所说的...将所需字段设置为false,然后尝试使用JQuery ...没有用
  • 这是 WooCommerce 状态报告,您可以查看安装了哪些插件:pastebin.com/sU7NAkCZ

标签: php jquery wordpress woocommerce shipping-method


【解决方案1】:

这可以在不使用 jQuery 的情况下使用一个特殊的钩子来完成,当它被选中时,它将在 legacy_local_pickup 运输方式下方显示您的两个 "Carrier" 自定义字段。如果客户更改为不同的送货方式,这些字段将被删除。

所以你应该需要先删除你的自定义模板和所有相关代码。

现在验证工作完美,当填写“承运人”自定义字段时,它们会保存在订单元数据中。

// 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'] ) );
}

此代码位于您的活动子主题(或主题)的 functions.php 文件中。经过测试并且可以工作。

不显示:

选择“本地取货”时显示:

【讨论】:

  • 谢谢@LoicTheAztec ..这正是我所需要的。你是救世主!我正在创建用于在订单编辑页面和管理员电子邮件中添加这些字段的代码...我将这些代码也放在这里以供参考
猜你喜欢
  • 2015-04-20
  • 1970-01-01
  • 2018-11-02
  • 2021-07-02
  • 1970-01-01
  • 2016-07-29
  • 2018-08-07
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多