即使购物车中已经有商品,也要从购物车中获取最后的商品ID

时间:2020-05-12 01:51:51

标签: php woocommerce cart

我需要做什么:我正在制作一个自定义小部件,以便每次用户将商品添加到购物车“您已将[item_name]动态添加到购物车”时显示一条通知消息。这就是我所做的:

public function widget($args,$instance){
    if ( apply_filters( 'woocommerce_widget_cart_is_hidden', is_cart() || is_checkout() ) ) {
        return;
    } 

    $items = WC()->cart->get_cart();
    $ids = array();

    foreach($items as $item => $values) { 

            $_product = $values['data']; 
            $ids[] = $_product->get_id(); 
    } 

    $last_product_id = end($ids); ?>

    <i class="last-item"> user added <?php echo wc_get_product( $last_product_id )->get_title(); ?> to cart. </i>

每次用户在购物车中添加新商品时都要使其动态化,我使用了 woocommerce_add_to_cart_fragments 钩子:

function cart_msg_refresh( $fragments ) {
  $fragments['.last-item'] = '<i class="last-item"> user added ' . wc_get_product( $last_product_id )->get_title() . ' to cart. </i>';
  return $fragments;
}
add_filter( 'woocommerce_add_to_cart_fragments', 'cart_msg_refresh' );  

到目前为止,太好了。这确实有效,但我确实收到了最后添加到购物车商品名称的消息。

问题:问题是,如果用户再次添加购物车中已有的商品,则不会显示该商品的ID。我做了print_r()数组以解决问题,并看到如果该项目在购物车中,它将不会添加ID,而只会在get_cart()的项目数组内增加该项目的数量。从而解释了为什么我无法检索该产品的ID。

编辑: 对于带有$ last_product_id的第一个代码,我正在使用“ woocommerce_add_to_cart_fragments”过滤器以动态显示消息。而且确实有效,唯一的问题是,当购物车中已有商品时,消息不会显示(由于前面提到的ID问题)。多亏@LoicTheAztec提及了Ajax,它才是适合我的解决方案。

1 个答案:

答案 0 :(得分:0)

我知道这是一个古老的问题,但这可能会对某人有所帮助。

我们在我们的网站上遇到了同样的问题。当用户将产品添加到购物车时,我们正在显示通知。当用户将产品A,产品B,然后产品A再次添加到购物车时,最后一个通知显示了产品B的详细信息,因为它仍然是购物车中的最后一项,而购物车中第一项的数量只是增加了。 / p>

在挂钩woocommerce_add_to_cart_fragments中,您可以使用$_POST,它提供了最后添加的产品ID。在您的情况下,将如下所示:

add_filter( 'woocommerce_add_to_cart_fragments', 'cart_msg_refresh' );
function cart_msg_refresh( $fragments ) {
    $product_id = !empty($_POST['product_id']) ? $_POST['product_id'] : '';
    $product = wc_get_product($product_id);
    $title = method_exists($product, 'get_title') ? $product->get_title() ? '';
    $fragments['.last-item'] = '<i class="last-item"> user added ' . 
    $title . ' to cart. </i>';
    return $fragments;
}