当前位置: 首页 > 知识库问答 >
问题:

在WooCommerce中有条件地向shipping部分添加自定义签出字段

束福
2023-03-14

我有一些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个答案

凌运恒
2023-03-14

在过滤器挂钩中,您需要始终在末尾返回第一个函数参数,即此处的$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
} 
苗征
2023-03-14

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

刚刚测试过,效果很好。祝您今天过得愉快。

 类似资料:
  • 在WooCommerce结帐表单中,我自定义了字段。但是,如果产品属于特定类别,我不希望显示这些字段。我让那部分工作。 接下来,我想取消设置一些自定义签出字段,但我不知道如何取消设置或现在取消设置。取消设置普通签出字段很容易,例如,我使用以下代码: 然而,对于自定义结帐字段它不起作用。下面是我如何设置这个自定义字段: 由于这属于它自己的部分,而不是账单、发货或其他字段,我找不到删除它的方法。 我尝

  • WordPress-WooCommerce 我想做的是: null 邮件里什么也没印。 请解决。提前谢了。

  • 我正在使用wordpress 4.1与ACF v4。我有一个添加了自定义字段的自定义帖子类型,每次添加新类别时都需要添加新的自定义字段。如果我自动添加类别“轿车”,我必须添加自定义字段“轿车”。我可以使用插件函数执行此操作吗?或者我必须用代码,在数据库中插入来做到这一点?提前致谢!!

  • 我有一个插件管理我的货件与两个自定义状态:等待-装运和装运。 我尝试添加一个电子邮件发送时,订单传递到发货。 我在Stack Overflow:Woocommerce退款电子邮件中发现了这一点,但我可以知道它是如何工作的 下面是我的插件文件代码: 我用下面的helgatheviking和Adrien Leber的建议更新了我的代码 和我的班级: 当我改变我的订单状态时,什么也没有发生!我的触发函数

  • 遵循电子商务签出字段自定义文档: 使用操作和筛选器自定义签出字段 我已经通过函数向woocommerce结帐页面添加了一个自定义字段。php。 我担心是否必须清理自定义字段的用户输入? 我认为它不需要消毒,因为它被传递到帐单字段中,如:$fields['billing'],对吗? 如果没有,我如何清理这个自定义字段? 创建此自定义字段意味着接受长度不超过50的文本字符串(拉丁文)和整数的组合。

  • 我正在尝试根据是否已选中自定义复选框向签出添加费用。我真的很接近让这项工作,但我有问题获得后的价值观,以确定是否应申请或不收费。 以下是我自定义字段的代码: 这是可行的,而且字段显示得非常完美。 在我的主题中form-checkout.php的底部,我添加了以下javascript,以在检查字段时更新购物车总数: 这将更新订单总数并运行以下代码(这就是问题所在): 我知道这部分被调用是因为如果我去