Php 从购物车获取最后一个产品ID,即使它是';这张卡片上已经有了

Php 从购物车获取最后一个产品ID,即使它是';这张卡片上已经有了,php,woocommerce,cart,Php,Woocommerce,Cart,我需要做什么:我正在制作一个自定义小部件,以便在用户每次向购物车添加商品时动态显示一条通知消息“您已将[item_name]添加到购物车”。以下是我所做的: public function widget($args,$instance){ if ( apply_filters( 'woocommerce_widget_cart_is_hidden', is_cart() || is_checkout() ) ) { return; } $items =

我需要做什么:我正在制作一个自定义小部件,以便在用户每次向购物车添加商品时动态显示一条通知消息“您已将[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>
公共函数小部件($args,$instance){
if(应用过滤器('woocommerce_widget_cart_is_hidden',is_cart()| is_checkout())){
返回;
} 
$items=WC()->cart->get_cart();
$ids=array();
foreach($items作为$item=>$values){
$_product=$values['data'];
$ids[]=$\u产品->获取\u id();
} 
$last_product_id=end($id);?>
用户已添加到购物车。
为了使每次用户在购物车中添加新项目时都保持动态,我使用了woocommerce\u add\u to\u cart\u fragmentshook:

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' );  
function cart\u msg\u刷新($fragments){
$fragments['.last item']='user added'.wc_get_product($last_product_id)->get_title()。'to cart';
返回$fragments;
}
添加过滤器('woocommerce'u add'u to'u cart'u fragments'、'cart'u msg'u refresh');
到目前为止,还不错。这确实有效,我确实收到了最后添加到购物车项目名称的消息

问题:问题是,如果用户再次添加购物车中已经存在的商品,它将不会显示该商品的ID。我打印了数组以解决问题,并看到如果商品在购物车中,它不会添加ID,只会在get\u cart()的items数组中增加该商品的数量.从而解释了为什么我无法检索该产品的ID

编辑:
对于第一个带有$last\u product\u id的代码,我使用了一个过滤器“woocommerce\u add\u to\u cart\u fragments”来动态显示消息。它确实有效,唯一的问题是当商品已经在购物车中时,消息不会显示(由于前面提到的id问题).Ajax将是适合我的解决方案,感谢@LoicTheAztec提到这一点。

我知道这是一个老问题,但它可能会帮助一些人

我们的网站上也有同样的问题。当用户将产品添加到购物车时,我们会显示一个通知。当用户再次将产品a、产品B和产品a添加到购物车时,最后一个通知会显示产品B的详细信息,因为它仍然是购物车中的最后一个项目,而购物车中第一个项目的数量刚刚增加

在hook
woocommerce\u add\u to\u cart\u fragments
中,您可以使用提供最后添加的产品id的
$\u POST
。在您的情况下,它类似于以下内容:

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;
}
add_过滤器('woocommerce_add_to_cart_fragments','cart_msg_refresh');
功能购物车消息刷新($fragments){
$product\U id=!空($\U POST['product\U id'])?$\U POST['product\U id']:'';
$product=wc\U get\U product($product\U id);
$title=method_exists($product,'get_title')?$product->get_title()?“”;
$fragments['.最后一项']='user added'。
$title.“到购物车上”;
返回$fragments;
}

我知道这是一个老问题,但它可能会帮助某些人

我们的网站上也有同样的问题。当用户将产品添加到购物车时,我们会显示一个通知。当用户再次将产品a、产品B和产品a添加到购物车时,最后一个通知会显示产品B的详细信息,因为它仍然是购物车中的最后一个项目,而购物车中第一个项目的数量刚刚增加

在hook
woocommerce\u add\u to\u cart\u fragments
中,您可以使用提供最后添加的产品id的
$\u POST
。在您的情况下,它类似于以下内容:

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;
}
add_过滤器('woocommerce_add_to_cart_fragments','cart_msg_refresh');
功能购物车消息刷新($fragments){
$product\U id=!空($\U POST['product\U id'])?$\U POST['product\U id']:'';
$product=wc\U get\U product($product\U id);
$title=method_exists($product,'get_title')?$product->get_title()?“”;
$fragments['.最后一项']='user added'。
$title.“到购物车上”;
返回$fragments;
}

自WooCommerce 3以来,
$\u product=$values['data']->post;$ids[]=$\u product->ID;
$\u product=$values['data'];$ids[]=$\u product->get\u ID();
替换为过滤器挂钩“WooCommerce\u add\u cart\u item\u data”仅适用于简单的添加到购物车,但不适用于Ajax添加到购物车。我使用的是woocommerce\u add\u to\u cart\u fragments钩子,因此我希望它通过使用Ajax保持动态,而无需使用帖子重新加载页面。没有插件。帖子已编辑,谢谢。这不适用于简单的添加到购物车,仅适用于Ajax添加到购物车。因此,您应该提供自woocommerce 3以来,
$\u product=$values['data']->post;$ids[]=$\u product->ID;
$\u product=$values['data'].$ids[]替换为
$\u product=$values['data'].$ids[]=$\u product->get\u id();
…有关信息,请查看过滤器挂钩“woocommerce\u add\u cart\u item\u data”仅适用于简单的添加到购物车,但不适用于Ajax添加到购物车。我使用的是woocommerce\u add\u to\u cart\u fragments钩子,因此我希望它通过使用Ajax保持动态,而无需使用帖子重新加载页面。没有插件。帖子已编辑,谢谢。这不适用于简单的添加到购物车,仅适用于Ajax添加到购物车。因此,您应该提供你用来在有问题的帖子中显示通知的相关代码,以及widget方法和woocommerce\u add\u to\u cart\u fragments钩子使用的完整代码(这个钩子使用的是AJAX)