首页 > 解决方案 > 在 Woocommerce 中有条件地向购物车商品和订购商品添加一个类

问题描述

当相关产品使用Woocommerce 产品附加组件 3+插件自定义字段时,我想以不同的方式设置 Woocommerce 购物车和订购商品的样式,因此我需要有条件地添加类(到购物车商品和订购商品)

但我无法让它工作,使用_wc_pao_addon_name元密钥来工作。这是我的代码:

  add_filter( 'woocommerce_order_item_class', 'add_product_addon_classes', 10, 4 );
  add_filter( 'woocommerce_cart_item_class', 'add_cart_addon_classes', 10, 4 );

  function add_cart_addon_classes ( $class, $cart_item, $values  ) {

    if ( isset( $values['_wc_pao_addon_name'] ) ) {
        $class = $class . ' fl-addon-item';
    }

    return $class;
}

我做错了什么?

相关:产品附加组件 3.0 中已提供定价选项、图像样本等

标签: phpwordpresswoocommercecartorders

解决方案


您不能创建一个对两个钩子都有效的函数,因为它们具有不同的钩子参数:

  • 钩子woocommerce_cart_item_class使用$class,$cart_item$cart_item_key参数
  • 钩子woocommerce_order_item_class使用$class,$item$order参数

如您所见,您$values['_wc_pao_addon_name']无法在代码中工作。

1) 购物车物品:

要检查并获取 Woocommerce 产品附加组件插件使用的正确 meta_key,您将首先使用在此答案末尾添加的测试挂钩功能......</p>

一旦找到正确的meta_key,您将在以下代码中替换addon_parent_id为 right meta_key

add_filter( 'woocommerce_cart_item_class', 'additional_class_to_cart_item_classes', 10, 3 );
function additional_class_to_cart_item_classes ( $class, $cart_item, $cart_item_key ) {
    if ( isset( $cart_item['addon_parent_id'] ) ) {
        $class .= ' fl-addon-item';
    }

    return $class;
}

代码在您的活动子主题(活动主题)的 function.php 文件中。它应该适用于购物车和结帐。


2) 对于订单项目 (收到订单、查看订单、订单付款和电子邮件通知)

它更复杂,因为您需要知道如何_wc_pao_addon_name保存在订单项中。为此,您需要查看您的数据库表,wp_woocommerce_order_itemmeta搜索meta_key_wc_pao_addon_name.

一旦找到正确的meta_key,您将在以下代码中替换_wc_pao_addon_name为 right meta_key

add_filter( 'woocommerce_order_item_class', 'additional_class_to_order_item_classes', 10, 3 );
function additional_class_to_order_item_classes ( $class, $item, $order ) {
    if ( $item->get_meta('_wc_pao_addon_name') ) {
        $class .= ' fl-addon-item';
    }

    return $class;
}

代码在您的活动子主题(活动主题)的 function.php 文件中。它应该适用于订购商品。


检查并获取正确的购物车自定义元数据(仅限测试)

要在购物车对象中找出插件作为 Woocommerce 产品附加组件添加的自定义元数据的正确元键是什么,您将使用以下内容(将在购物车页面中显示购物车项目的原始数据)

// Testing and getting cart item raw data
add_action( 'woocommerce_before_cart', function(){
    // Loop through cart items
    foreach(WC()->cart->get_cart() as $cart_item) {
        // Output cart item raw data
        echo '<pre>'; print_r($cart_item); echo '</pre>';
    }
}, 987 );

代码在您的活动子主题(活动主题)的 function.php 文件中。


推荐阅读