首页 > 解决方案 > 有条件地将自定义结帐字段添加到 WooCommerce 中的运输部分

问题描述

我有某些 Woocommerce 产品需要客户(或产品接收者)提供出生日期。客户在创建帐户以结帐时需要提供出生日期,所以我已经设置好了,但是如果选中“运送到其他地址”并且如果有任何物品,我需要在运输部分添加一个必填的 DOB 字段在购物车中是需要出生日期的地方。

这是我尝试过的:

add_filter( 'woocommerce_checkout_fields' , 'real_dob' );

function real_dob( $fields ) {

    $fields['shipping']['real_dob'] = array(

        'type' => 'text',
        'class'=> array( 'form_right_half', 'req'),
        'label' => __('Birthdate'),
        'required' => true,
     );

foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
    $dob_check = get_post_meta( $cart_item['product_id'], 'require-dob', true );

    if ( $dob_check == 1 ) {
        $dob = true;
        break;
    }}

    if ($dob)
        return $fields; 
} 

这适用于购物车中的产品需要出生日期时 - 添加了自定义字段。但是,如果购物车中没有产品需要 DOB,则根本不会加载任何结帐字段,无论是计费还是运输。我错过了什么?

标签: phpwordpresswoocommercecheckoutcustom-fields

解决方案


由于当购物车不包含 DOB 产品时过滤器不返回任何内容,因此它在结帐时既不显示帐单也不显示运输字段。

您可以像这样修改您的代码:

add_filter( 'woocommerce_checkout_fields' , 'real_dob' );

function real_dob( $fields ) {

    //if(cart DOES NOT contain any DOB products)
    if(true)
    {
        return $fields;
    }
    //if(cart contains DOB products)
    else
    {
        $fields['shipping']['real_dob'] = array(
            'type' => 'text',
            'class'=> array( 'form_right_half', 'req'),
            'label' => __('Birthdate'),
            'required' => true,
         );
       return $fields; 
    }  
} 

刚刚测试并且工作正常。祝你有美好的一天。


推荐阅读