如果只有非虚拟物品,则添加 WooCommerce 自定义结帐字段

Add WooCommerce custom checkout fields if there is only non virtual items

在我的 functions.php 中有一个脚本来显示我创建的某些自定义字段以在结账时显示,但有些产品不需要这些字段来显示。所以我将它们分配为虚拟并使用此代码使它们仅出现在标准产品上:

add_action( 'woocommerce_before_order_notes', 'my_checkout_fields' );
function my_checkout_fields( $checkout ) {

    $only_virtual = false;

    foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
      if ( ! $cart_item['data']->is_virtual() ) $only_virtual = true;   
   }
 
    if( $only_virtual ) {

    woocommerce_form_field( 'so_childs_name', array(
        'type'          => 'text',
        'required'      => 'true',
        'class'         => array('cname-class form-row-wide'),
        'label'         => __('Child's Name'),
        ), $checkout->get_value( 'so_childs_name' ));
}

它有效....偶尔。

当然,我需要它一直工作,那么为什么它不工作或者有什么方法可以代替 only_virtual,我可以只使用一组产品 ID 吗?

您的代码中有一些错误和缺少右括号(如果我理解得很好的话)。尝试:

add_action( 'woocommerce_before_order_notes', 'my_checkout_fields' );
function my_checkout_fields( $checkout ) {
    $has_virtual = false; // Initializing

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( $cart_item['data']->is_virtual() ) {
            $has_virtual = true; // Stop the loop
            break;
        }
    }

    if( ! $has_virtual ) {
        woocommerce_form_field( 'so_childs_name', array(
            'type'          => 'text',
            'required'      => 'true',
            'class'         => array('cname-class form-row-wide'),
            'label'         => __('Child's Name'),
        ), $checkout->get_value( 'so_childs_name' ) );
    }
}

代码进入活动子主题(或活动主题)的 functions.php 文件。应该可以。