wordpress - todos - woocommerce productos
Necesita Woocommerce para permitir solo 1 producto en el carro. Si un producto ya está en el carrito y se agrega otro 1, entonces debería eliminar el anterior 1 (8)
Tienes dos opciones:
- Extensión de cantidades mínimas / máximas de WooCommerce
- El siguiente código se agregó a su archivo de tema
functions.php
add_filter ( ''woocommerce_before_cart'' , ''allow_single_quantity_in_cart'' ); function allow_single_quantity_in_cart() { global $woocommerce; $cart_contents = $woocommerce->cart->get_cart(); $keys = array_keys ( $cart_contents ); foreach ( $keys as $key ) { $woocommerce->cart->set_quantity ( $key, 1, true ); } }
Creo que este código debería funcionar pero no estoy seguro de dónde ubicarlo. En todas partes que he intentado ha fallado hasta ahora ...
add_action(''init'', ''woocommerce_clear_cart'');
function woocommerce_clear_cart() {
global $woocommerce, $post, $wpdb;
$url = explode(''/'', ''http://''.$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
$slug=$url[4];
$postid = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_status=''publish'' AND post_name = ''$slug''");
if ($postid){
if ($postid == PRODUCTID1 || $postid == PRODUCTID2){
$woocommerce->cart->empty_cart();
}
}
}
No agregue funciones directamente a sus archivos de comercio ... perderá todo su código cuando actualice.
Las funciones de usuario siempre deben engancharse a través de functions.php de su tema.
Prueba esto,
Para eliminar todos los productos del carro y agregar el último añadido,
//For removing all the items from the cart
global $woocommerce;
$woocommerce->cart->empty_cart();
$woocommerce->cart->add_to_cart($product_id,$qty);
el archivo de clase es wp-content/plugins/woocommerce/classes/class-wc-cart.php
.
Puede agregar el código anterior en la función agregar al carro en functions.php.
Espero que funcione ...
Lamentablemente, no hay gancho de "acción" antes de que WooCommerce agregue un artículo al carro. Pero tienen un gancho ''filtro'' antes de agregarlo al carrito. Así es como lo uso:
add_filter( ''woocommerce_add_cart_item_data'', ''woo_custom_add_to_cart'' );
function woo_custom_add_to_cart( $cart_item_data ) {
global $woocommerce;
$woocommerce->cart->empty_cart();
// Do nothing with the data and return
return $cart_item_data;
}
Si desea restringir la cantidad de productos a solo 1:
function check_if_cart_has_product( $valid, $product_id, $quantity ) {
if(!empty(WC()->cart->get_cart()) && $valid){
foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
$_product = $values[''data''];
if( $product_id == $_product->id ) {
wc_add_notice( ''The product is already in cart'', ''error'' );
return false;
}
}
}
return $valid;
}
add_filter( ''woocommerce_add_to_cart_validation'', ''check_if_cart_has_product'', 10, 3 );
Basándome en la respuesta aceptada y en la última versión de Woo 2.5.1, actualicé la función para que fuera un poco más limpia utilizando el código que utiliza en class-wc-checkout.php para borrar el carrito.
add_filter( ''woocommerce_add_cart_item_data'', ''_empty_cart'' );
function _empty_cart( $cart_item_data ) {
WC()->cart->empty_cart();
return $cart_item_data;
}
De mi respuesta a otra pregunta :
Hay un filtro / gancho que se ejecuta antes de agregar un artículo al carro, ya que cada producto pasa por la validación antes de que se agregue.
Por lo tanto, al validar un producto, podemos verificar si el elemento ya tiene elementos en el carrito y borrarlos (si el elemento actual puede agregarse) y agrega un mensaje de error.
/**
* When an item is added to the cart, remove other products
*/
function so_27030769_maybe_empty_cart( $valid, $product_id, $quantity ) {
if( ! empty ( WC()->cart->get_cart() ) && $valid ){
WC()->cart->empty_cart();
wc_add_notice( ''Whoa hold up. You can only have 1 item in your cart'', ''error'' );
}
return $valid;
}
add_filter( ''woocommerce_add_to_cart_validation'', ''so_27030769_maybe_empty_cart'', 10, 3 );
Esto funcionó como un encanto para mí, elimina el producto anterior y agrega el nuevo con la nueva configuración del producto. Aclamaciones
Actualización: para WooCommerce 3.0.X
function check_if_cart_has_product( $valid, $product_id, $quantity ) {
if(!empty(WC()->cart->get_cart()) && $valid){
foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
$_product = $values[''data''];
if( $product_id == $_product->get_id() ) {
unset(WC()->cart->cart_contents[$cart_item_key]);
}
}
}
return $valid;
}
add_filter( ''woocommerce_add_to_cart_validation'', ''check_if_cart_has_product'', 10, 3 );
Para la versión de WooCommerce menor que 3.0.X
function check_if_cart_has_product( $valid, $product_id, $quantity ) {
if(!empty(WC()->cart->get_cart()) && $valid){
foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
$_product = $values[''data''];
if( $product_id == $_product->id ) {
unset(WC()->cart->cart_contents[$cart_item_key]);
}
}
}
return $valid;
}
add_filter( ''woocommerce_add_to_cart_validation'', ''check_if_cart_has_product'', 10, 3 );