我需要做什么:我正在制作一个自定义小部件,以便每次用户将商品添加到购物车“您已将[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,它才是适合我的解决方案。
答案 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;
}