对我来说这听起来很奇怪,在woocommerce中,无论如何都有一个特定的产品,可以通过产品ID控制,只有一个在购物车中,所以在我们的场景中他们选择一个或另一个,如果他们试图重新添加到购物车,它只需更换或交换购物车中的该项目。 我们的主要产品不会受到这条规则的影响。
答案 0 :(得分:0)
我知道我已经在某个地方贴了这个,但是我找不到它,所以我会重新发布它。这是一个完整的插件(因此将其作为文件添加到wp-content/plugins
),这将1.在产品信息元框中添加一个复选框,并且2.如果选中该复选框,则将购物车限制为仅限该项目。
<?php
/*
Plugin Name: WooCommerce Restrict Items in Cart
Description: Forces cart to remove certain items if other items are added
Version: 1.0
Author: Kathy Darling
Author URI: http://kathyisawesome.com
Requires at least: 4.1.0
Tested up to: 4.1.0
Copyright: © 2015 Kathy Darling.
License: GNU General Public License v3.0
License URI: http://www.gnu.org/licenses/gpl-3.0.html
*/
/**
* The Main WC_Restrict_Item_in_Cart class
**/
if ( ! class_exists( 'WC_Restrict_Item_in_Cart' ) ) :
class WC_Restrict_Item_in_Cart {
/**
* WC_Restrict_Item_in_Cart init
*
* @access public
* @since 1.0
*/
public static function init() {
// product meta
add_action( 'woocommerce_product_options_general_product_data', array( __CLASS__, 'add_to_wc_metabox' ) );
add_action( 'woocommerce_process_product_meta', array( __CLASS__, 'process_wc_meta_box' ), 1, 2 );
// validation - ensure product is never in the cart with other products
add_filter( 'woocommerce_add_to_cart_validation', array( __CLASS__, 'maybe_remove_items' ), 10, 3 );
}
/*-----------------------------------------------------------------------------------*/
/* Product Write Panels */
/*-----------------------------------------------------------------------------------*/
/*
* Add text inputs to product metabox
* @since 1.0
*/
public static function add_to_wc_metabox(){
global $post;
echo '<div class="options_group">';
echo woocommerce_wp_checkbox( array(
'id' => '_only_item_in_cart',
'label' => __( 'Only Item In Cart' ) ,
'description' => __( 'For special items that need to be purchased individually.' )
)
);
echo '</div>';
}
/*
* Save extra meta info
* @since 1.0
*/
public static function process_wc_meta_box( $post_id, $post ) {
if ( isset( $_POST['_only_item_in_cart'] ) ) {
update_post_meta( $post_id, '_only_item_in_cart', 'yes' );
} else {
update_post_meta( $post_id, '_only_item_in_cart', 'no' );
}
}
/*-----------------------------------------------------------------------------------*/
/* Check Cart for presence of certain items */
/*-----------------------------------------------------------------------------------*/
/**
* When an item is added to the cart, remove other products
* based on WooCommerce Subscriptions code
*/
public static function maybe_remove_items( $valid, $product_id, $quantity ) {
if ( self::is_item_special( $product_id ) && WC()->cart->get_cart_contents_count() > 0 ){
self::remove_specials_from_cart();
}
return $valid;
}
/*-----------------------------------------------------------------------------------*/
/* Helper methods */
/*-----------------------------------------------------------------------------------*/
/*
* I've added a custom field 'only_item_in_cart' on items on 'special' products
* check for this field similar to how Subscriptions checks cart for subscription items
*/
public static function check_cart_for_specials() {
$contains_special = false;
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( self::is_item_special( $cart_item['product_id'] ) ) {
$contains_special = true;
break;
}
}
return $contains_special;
}
/**
* Removes all special products from the shopping cart.
*/
public static function remove_specials_from_cart(){
foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item ){
if ( self::is_item_special( $cart_item['product_id'] ) ){
WC()->cart->set_quantity( $cart_item_key, 0 );
$product_title = $cart_item['data']->get_title();
wc_add_notice( sprintf( __( '"%s" has been removed from your cart. Due to shipping calculations, it cannot be purchased in conjunction with other products.', 'wc_Restrict_Item_in_cart' ), $product_title ), 'error' );
}
}
}
/*
* check if an item has custom field
*/
public static function is_item_special( $product_id ){
if ( 'yes' == get_post_meta( $product_id, '_only_item_in_cart', true ) ){
return TRUE;
} else {
return false;
}
}
} //end class: do not remove or there will be no more guacamole for you
endif; // end class_exists check
// Launch the whole plugin
WC_Restrict_Item_in_Cart::init();