首页 > 解决方案 > WooCommerce:当产品已经在购物车中时更改添加到购物车的文本

问题描述

我在更改WooCommerce/WordPress 中“添加到购物车”按钮的文本时遇到问题。

目前下面的代码,我想要它,以便如果产品已经在购物车中,“添加到购物车”按钮通过更改文本以说明它已经在购物车中来反映这一点。

目前,即使产品在购物车中,它仍然是“添加到购物车” 。奇怪的是,如果我删除 if 条件,文本会发生变化,所以我假设 if 条件有问题,但我看不出它有任何问题。

add_filter('woocommerce_product_add_to_cart_text', 'woocommerce_custom_add_to_cart_text');
function woocommerce_custom_add_to_cart_text($add_to_cart_text, $product_id) {
    global $woocommerce;
    
    foreach($woocommerce->cart->get_cart() as $key => $val ) {
        $_product = $val['data'];
 
        if($product_id == $_product->id ) {
            $add_to_cart_text = 'Already in cart';
        }
        
    return $add_to_cart_text;
    }
}

标签: phpwordpresswoocommerceproductcart

解决方案


  • $_product->id应该$_product->get_id()
  • return在 foreach 循环外使用
  • 全局$woocommerce不是必需的
  • woocommerce_product_add_to_cart_text过滤器钩子的第二个参数是$product,不是$product_id

所以你得到

function woocommerce_custom_add_to_cart_text( $add_to_cart_text, $product ) {
    // Get cart
    $cart = WC()->cart;
    
    // If cart is NOT empty
    if ( ! $cart->is_empty() ) {

        // Iterating though each cart items
        foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
            // Get product id in cart
            $_product_id = $cart_item['product_id'];
     
            // Compare 
            if ( $product->get_id() == $_product_id ) {
                // Change text
                $add_to_cart_text = __( 'Already in cart', 'woocommerce' );
                break;
            }
        }
    }

    return $add_to_cart_text;
}
add_filter( 'woocommerce_product_add_to_cart_text', 'woocommerce_custom_add_to_cart_text', 10, 2 );

推荐阅读