如果特定的 Woocommerce 产品在购物车中,则从循环中隐藏它们

Hide a specific Woocommerce products from loop if they are in cart

我正在尝试编写一个挂钩,将购物车中的特定产品从商店页面隐藏起来,但我似乎无法弄清楚两件事。

function find_product_in_cart() {

    $hide_if_in_cart = array(6121, 6107, 14202, 14203);
    $in_cart = false;

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

        $product_in_cart = $cart_item['product_id'];

        foreach ( $hide_if_in_cart as $key => $value ) {
            if ( $product_in_cart === $value ) {
                $in_cart = true;
            }
        }

        if ( $in_cart ) {
            echo 'Product in cart';
        } else {
            echo 'Not in cart!';
        }

    }
}
add_action('woocommerce_before_shop_loop_item', 'find_product_in_cart
  1. 代码到处都打印出 "Product in cart",因为购物车中有一件 ID 为“14202”的产品。我的逻辑在某处是错误的...
  2. 我不会隐藏单个产品,现在我打印一行文字,但我希望能够显示:none;它或者可能使用在特定场景中隐藏产品的特定功能。

这是目前的输出: https://i.gyazo.com/d85bd93598ada7aa96bee9a1d7393c3c.png

以下代码将使用此专用的 Woocommerce 操作挂钩从 Woocommerce 商店和存档页面中删除特定定义的产品,当它们在购物车中时:

add_action( 'woocommerce_product_query', 'hide_specific_products_from_shop', 20, 2 );
function hide_specific_products_from_shop( $q, $query ) {
    if( is_admin() && WC()->cart->is_empty() )
        return;

    // HERE Set the product IDs in the array
    $targeted_ids = array( 6121, 6107, 14202, 14203 );

    $products_in_cart = array();

    // Loop through cart items
    foreach( WC()->cart->get_cart() as $cart_item ){
        if( in_array( $cart_item['product_id'], $targeted_ids ) ){
            // When any defined product is found we add it to an array
            $products_in_cart[] = $cart_item['product_id'];
        }
    }
    // We remove the matched products from woocommerce lopp
    if( count( $products_in_cart ) > 0){
        $q->set( 'post__not_in', $products_in_cart );
    }
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。 已测试并有效。