Soporte » Plugins y Hacks » WooCommerce » Vaciar carrito, en casos concretos

  • Resuelto monivvette

    (@monivvette)


    Buenas noches, lo primero he buscado y no he encontrado solución a mi problema en lor foros, aunque me puedo equivocar por su puesto.
    Os comento. Tengo una floristería que estoy desarrollando su web (por orgullo porque mi primer oficio hace 15 años fue programadora aunque no de webs). Tengo dos líneas de producto completamente diferenciadas: una es el trabajo funerario y el resto (regalo, bodas, tocados, etc).
    Con el trabajo funerario necesito mostrar el catálogo de productos a los usuarios, escoger uno, recoger los datos de envío y pagar. En este caso necesitaba que solo se añadiera un producto por compra así que encontré por la web el siguiente código que me funciona de maravilla:

    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;
    }

    El caso es que vacía el carrito antes de añadir cualquier producto, en mi parte de funerario funciona perfectamente. Pero en la otra línea necesito poder añadir más productos.
    Luego mi pregunta es si se puede llamar al borrado del carrito y luego añadir el producto solo para los de funerario. Y cómo se haría claro, que ahora soy una florista novata en wordpress jeje

    Mil gracias!!!! he trasteado un poco por aqui y haceis un gran trabajo. Gracias.

    • Este debate fue modificado hace 1 semana, 6 días por Jose Luis. Razón: Editar y etiquetar código

    La página con la que necesito ayuda: [accede para ver el enlace]

Viendo 2 respuestas - de la 1 a la 2 (de un total de 2)
  • Moderador Jose Luis

    (@jose64)

    Hola.

    Prueba este código:

    function limit_cart_items_from_category ( $passed, $product_id )
    {
        // Accept when cart is empty
        if( WC()->cart->is_empty() ) return $passed;
    
        // HERE your product categories in this array (can be names, slugs or Ids)
        $categories = array('Music');
        $found = $current = false;
    
        // Check the current product
        if( has_term( $categories, 'product_cat', $product_id ) ){
            $current = true;
                global $woocommerce;
                $woocommerce->cart->empty_cart();
        }
    
        return $passed;
    }
    
    add_filter( 'woocommerce_add_to_cart_validation', 'limit_cart_items_from_category',10,3  );

    Tiene asignada la categoría ‘Funerario’ en el momento en que añades un producto de esa categoría se vacía el carrito y deja sólo este último. En los productos de las otras categorías no hace nada.

    También tienes este otro código (copiado directamente de stackoverflow.com) que te añade una casilla a cada producto para que cuando lo selecciones te envíe directamente al checkout, si lo usas junto con el otro puedes hacer que en cuanto un cliente añada un producto de la categoría Funerario al carrito se borren los demás y lo envíe a la finalización del pedido:

    /**
     * Plugin Name: WC Redirect to checkout
     * Plugin URI: http://stackoverflow.com/q/32962653/383847
     * Description: Redirect to checkout for certain products 
     * Version: 1.0
     * Author: Kathy Darling
     * Author URI: http://kathyisawesome.com
     * Requires at least: 3.8
     * Tested up to: 3.9
     * WC requires at least: 3.1.0
     * WC tested up to: 4.0.1
     *
     * Text Domain: kia-redirect-to-checkout
     * Domain Path: /languages/
     *
     */
    if ( ! defined( 'ABSPATH' ) ) {
        exit; // Exit if accessed directly
    }
    
    /**
     * Add text inputs to product metabox
     */
    function kia_add_to_wc_metabox(){
        global $post;
    
        echo '<div class="options_group">';
    
        // Suggested Price
        echo woocommerce_wp_checkbox( array(
            'id' => '_redirect_to_checkout',
            'label' => __( 'Redirect to checkout', 'kia-redirect-to-checkout' ) ,
            'description' => __( 'When this item is added to the cart, re-direct the customer to checkout immediately.', 'kia-redirect-to-checkout' )
            )
        );
    
        echo '</div>';
    
    }
    add_action( 'woocommerce_product_options_general_product_data', 'kia_add_to_wc_metabox' );
    
    /**
     * Save extra meta info
     *
     * @param  WC_Product  $product
     */
    function kia_process_wc_meta_box( $product ) {
    
        if ( isset( $_POST['_redirect_to_checkout'] ) ) {
            $product->update_meta_data( '_redirect_to_checkout', 'yes' );
        } else {
            $product->update_meta_data( '_redirect_to_checkout', 'no' );
        }
    
    }
    add_action( 'woocommerce_admin_process_product_object', 'kia_process_wc_meta_box' );
    
    /**
     * Redirect to checkout
     *
     * @param  WC_Product  $product
     */
    function kia_add_to_cart_redirect( $url, $product ) {
    
        // If product is one of our special products.
        if ( kia_maybe_redirect_cart( $product ) ) {
    
            // Remove default cart message.
            wc_clear_notices();
    
            // Redirect to checkout.
            $url = wc_get_checkout_url();
        }
    
        return $url;
    }
    add_filter( 'woocommerce_add_to_cart_redirect', 'kia_add_to_cart_redirect', 10, 2 );
    
    /**
     * Check if an item has custom field.
     *
     * @param  WC_Product  $product
     */
    function kia_maybe_redirect_cart( $product ) {
        return wc_string_to_bool( $product instanceof WC_Product && $product->get_meta( '_redirect_to_checkout', true ) );
    }

    Puedes insertar el código junto con el anterior en el archivo functions.php de tu tema hijo o en un plugin de personalizaciones como Code Snippets. Si no es exactamente lo que querías por lo menos te puede servir de base.

    Quedamos a la espera de tus comentarios y, por favor, recuerda cerrar el debate marcándolo como resuelto cuando así lo consideres, de esta forma nos ayudas a mantener el foro al día.

    Hola José Luis, funciona perfectamente!!! Mi dolor de cabeza solucionado, muchísimas gracias.
    He usado tu código y es justo lo que necesitaba.
    La verdad que sé qué haría programando pero no sé cómo hacerlo en este lenguaje, me ha vuelto a picar la gana de saber y me voy a poner con ello.

    Y gracias por vuestra labor!

Viendo 2 respuestas - de la 1 a la 2 (de un total de 2)
  • Debes estar registrado para responder a este debate.