船承运人的自定义字段中Woocommerce结账页面验证(Shipping carrier cust

2019-09-26 06:42发布

我已经通过更改模板中添加了送货方式部分两个自定义输入字段/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属性是不工作无论出于何种原因,相信我,我试过了两天。 不管怎么说,这部分已经工作。 唯一的问题越来越领域的验证,并将其添加到订单电子邮件和订单详细信息。 我环顾四周,到处和我最接近的帮助是这个职位,其中LoicTheAztec给予了详细的解决方案

Answer 1:

这可以在使用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文件。 测试和工程。

不显示:

当“本地拾取”选择显示:



文章来源: Shipping carrier custom fields validation in Woocommerce checkout page