为了账号安全,请及时绑定邮箱和手机立即绑定

有条件地将自定义结帐字段添加到 WooCommerce 中的运输部分

有条件地将自定义结帐字段添加到 WooCommerce 中的运输部分

PHP
斯蒂芬大帝 2021-12-03 16:38:42
我有某些 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,那么结帐字段中的任何一个都不会加载,无论是计费还是运输。我错过了什么?
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

由于当购物车不包含 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; 

    }  

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


查看完整回答
反对 回复 2021-12-03
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

在过滤器钩子中,您需要始终在最后返回第一个函数参数,即 here $fields。尝试以下功能更简单的方法:


add_filter( 'woocommerce_checkout_fields' , 'add_real_dob_checkout_field' );

function add_real_dob_checkout_field( $fields ) {

    // Loop through cart items

    foreach ( WC()->cart->get_cart() as $cart_item ) {

        // Check for 'require-dob' custom field

        if( get_post_meta( $cart_item['product_id'], 'require-dob', true ) == 1 ) { 

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

                'type' => 'text',

                'class'=> array( 'form_right_half', 'req'),

                'label' => __('Birthdate'),

                'required' => true,

            );

            break; // Stop the loop

        }

    }

    return fields; // Always return the main function argument at the end for a filter hook


查看完整回答
反对 回复 2021-12-03
  • 2 回答
  • 0 关注
  • 190 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信