将多个产品添加到购物车(如果它们尚未在购物车中)
Add multiple products to cart if they are not already in cart
在 WooCommerce 中,我实现了 @jtsternberg 的 WooCommerce: Allow adding multiple products to the cart via the add-to-cart query string 以允许一次添加多个产品,但我收到了许多实际尝试使用的客户的投诉包含多个产品的链接之一。
首先,如果客户点击结帐,然后点击浏览器 "back" 按钮,所有商品数量都会增加。我通过在添加到购物车行为完成后将用户重定向到购物车 URL 去除任何其他参数来解决这个问题,但这并不理想。
我真正想要的是先检查商品是否在购物车中,只有在商品不在购物车中时才添加到购物车中。有人做过类似的事情吗?
工作更新:
我最终修改了@jtsternberg 的代码以使用完全独立的参数名称,以避免与默认的添加到购物车行为发生冲突。然后我可以使用@LoicTheAztec 下面的建议代码,方法是将行为包装在检查中以查看新参数是否存在。这是完整的部分:
function custom_product_link() {
if (empty( $_REQUEST['multi-product-add'])) {
return;
}
$product_ids = explode( ',', $_REQUEST['multi-product-add'] );
foreach ( $product_ids as $product_id ) {
$product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $product_id ) );
$was_added_to_cart = false;
$adding_to_cart = wc_get_product( $product_id );
if ( ! $adding_to_cart ) {
continue;
}
$add_to_cart_handler = apply_filters( 'woocommerce_add_to_cart_handler', $adding_to_cart->product_type, $adding_to_cart );
if ( 'simple' !== $add_to_cart_handler ) {
continue;
}
// For now, quantity applies to all products.. This could be changed easily enough, but I didn't need this feature.
$quantity = empty( $_REQUEST['quantity'] ) ? 1 : wc_stock_amount( $_REQUEST['quantity'] );
$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
if ( $passed_validation && false !== WC()->cart->add_to_cart( $product_id, $quantity ) ) {
wc_add_to_cart_message( array( $product_id => $quantity ), true );
}
}
if ( wc_notice_count( 'error' ) === 0 ) {
// If has custom URL redirect there
if ( $url = apply_filters( 'woocommerce_add_to_cart_redirect', false ) ) {
wp_safe_redirect( $url );
exit;
} elseif ( get_option( 'woocommerce_cart_redirect_after_add' ) === 'yes' ) {
wp_safe_redirect( wc_get_cart_url() );
exit;
}
}
}
function check_product_added_to_cart( $passed, $product_id, $quantity) {
if (!empty( $_REQUEST['multi-product-add'])) {
foreach (WC()->cart->get_cart() as $cart_key => $cart_item ){
// if products are already in cart:
if( $cart_item['product_id'] == $product_id ) {
// Set the verification variable to "not passed" (false)
$passed = false;
// (Optionally) Displays a notice if product(s) are already in cart
// wc_add_notice( '<strong>' . $btn['label'] . '</strong> ' . __( 'This product is already in your cart.', 'woocommerce' ), 'error' );
// Stop the function returning "false", so the products will not be added again
return $passed;
}
}
}
return $passed;
}
add_action( 'wp_loaded', 'custom_product_link', 15 );
add_action( 'woocommerce_add_to_cart_validation', 'check_product_added_to_cart', 10, 3 );
在您使用的代码中,您有 woocommerce_add_to_cart_validation
过滤器挂钩,您可以在自定义挂钩函数中使用它来检查产品是否已经在购物车类似:
add_action( 'woocommerce_add_to_cart_validation', 'check_product_added_to_cart', 10, 3 );
function check_product_added_to_cart( $passed, $product_id, $quantity) {
foreach (WC()->cart->get_cart() as $cart_key => $cart_item ){
// if products are already in cart:
if( $cart_item['data']->get_id() == $product_id ) {
// Set the verification variable to "not passed" (false)
$passed = false;
// (Optionally) Displays a notice if product(s) are already in cart
wc_add_notice( '<strong>' . $btn['label'] . '</strong> ' . __( 'This product is already in your cart.', 'woocommerce' ), 'error' );
// Stop the function returning "false", so the products will not be added again
return $passed;
}
}
return $passed;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
代码已经过测试,这通常应该适用于您的自定义...
For product quantities, you can use the $quantity
argument with $cart_item['quantity']
in some conditions…
在 WooCommerce 中,我实现了 @jtsternberg 的 WooCommerce: Allow adding multiple products to the cart via the add-to-cart query string 以允许一次添加多个产品,但我收到了许多实际尝试使用的客户的投诉包含多个产品的链接之一。
首先,如果客户点击结帐,然后点击浏览器 "back" 按钮,所有商品数量都会增加。我通过在添加到购物车行为完成后将用户重定向到购物车 URL 去除任何其他参数来解决这个问题,但这并不理想。
我真正想要的是先检查商品是否在购物车中,只有在商品不在购物车中时才添加到购物车中。有人做过类似的事情吗?
工作更新: 我最终修改了@jtsternberg 的代码以使用完全独立的参数名称,以避免与默认的添加到购物车行为发生冲突。然后我可以使用@LoicTheAztec 下面的建议代码,方法是将行为包装在检查中以查看新参数是否存在。这是完整的部分:
function custom_product_link() {
if (empty( $_REQUEST['multi-product-add'])) {
return;
}
$product_ids = explode( ',', $_REQUEST['multi-product-add'] );
foreach ( $product_ids as $product_id ) {
$product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $product_id ) );
$was_added_to_cart = false;
$adding_to_cart = wc_get_product( $product_id );
if ( ! $adding_to_cart ) {
continue;
}
$add_to_cart_handler = apply_filters( 'woocommerce_add_to_cart_handler', $adding_to_cart->product_type, $adding_to_cart );
if ( 'simple' !== $add_to_cart_handler ) {
continue;
}
// For now, quantity applies to all products.. This could be changed easily enough, but I didn't need this feature.
$quantity = empty( $_REQUEST['quantity'] ) ? 1 : wc_stock_amount( $_REQUEST['quantity'] );
$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
if ( $passed_validation && false !== WC()->cart->add_to_cart( $product_id, $quantity ) ) {
wc_add_to_cart_message( array( $product_id => $quantity ), true );
}
}
if ( wc_notice_count( 'error' ) === 0 ) {
// If has custom URL redirect there
if ( $url = apply_filters( 'woocommerce_add_to_cart_redirect', false ) ) {
wp_safe_redirect( $url );
exit;
} elseif ( get_option( 'woocommerce_cart_redirect_after_add' ) === 'yes' ) {
wp_safe_redirect( wc_get_cart_url() );
exit;
}
}
}
function check_product_added_to_cart( $passed, $product_id, $quantity) {
if (!empty( $_REQUEST['multi-product-add'])) {
foreach (WC()->cart->get_cart() as $cart_key => $cart_item ){
// if products are already in cart:
if( $cart_item['product_id'] == $product_id ) {
// Set the verification variable to "not passed" (false)
$passed = false;
// (Optionally) Displays a notice if product(s) are already in cart
// wc_add_notice( '<strong>' . $btn['label'] . '</strong> ' . __( 'This product is already in your cart.', 'woocommerce' ), 'error' );
// Stop the function returning "false", so the products will not be added again
return $passed;
}
}
}
return $passed;
}
add_action( 'wp_loaded', 'custom_product_link', 15 );
add_action( 'woocommerce_add_to_cart_validation', 'check_product_added_to_cart', 10, 3 );
在您使用的代码中,您有 woocommerce_add_to_cart_validation
过滤器挂钩,您可以在自定义挂钩函数中使用它来检查产品是否已经在购物车类似:
add_action( 'woocommerce_add_to_cart_validation', 'check_product_added_to_cart', 10, 3 );
function check_product_added_to_cart( $passed, $product_id, $quantity) {
foreach (WC()->cart->get_cart() as $cart_key => $cart_item ){
// if products are already in cart:
if( $cart_item['data']->get_id() == $product_id ) {
// Set the verification variable to "not passed" (false)
$passed = false;
// (Optionally) Displays a notice if product(s) are already in cart
wc_add_notice( '<strong>' . $btn['label'] . '</strong> ' . __( 'This product is already in your cart.', 'woocommerce' ), 'error' );
// Stop the function returning "false", so the products will not be added again
return $passed;
}
}
return $passed;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
代码已经过测试,这通常应该适用于您的自定义...
For product quantities, you can use the
$quantity
argument with$cart_item['quantity']
in some conditions…