• 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 4 años, 5 meses por jose64. Razón: Editar y etiquetar código

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

Viendo 3 respuestas - de la 1 a la 3 (de un total de 3)
  • Moderador jose64

    (@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.

    Iniciador del debate monivvette

    (@monivvette)

    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!

    Hola amigos gusto en saludarle. Tengo una situacion y casi estoy seguro que me pueden ayudar a resolver. Tengo una web que aun no esta publicada, la cual solo va a vender reservas. Tras añadir ese producto desde un plugin (wp hotel Booking) redirijo a la pagina de pago (checkout).
    Hasta ahí todo correcto, pero me gustaria que si el cliente en ese momento no acaba la compra (no realiza el pago) y sale de la pagina checkout a cualquier otra del menú, automáticamente su reserva se eliminará» y vacíe el carro; de tal manera que si el cliente quisiera comprar, tendría que iniciar nuevamente el proceso.
    He probado varias cosas, pero no encuentro ningun plugin ni ninguna manera de realizar esto tal y como lo necesito.
    Necesito que todo sea automatico, de tal manera que segun añade la reserva se crea el carrito y le lleva a la pagina de pago. Si realiza el pago se confirma la reserva, pero si abandona esa pagina, el carrito se borra y esa reserva desaparece; pero solo ha de desaparecer al abandonar el carro.

    He visto por internet opciones para borrar el carro cuando finaliza la sesión, pero tampoco me vale. Seria un poco adaptar este código:

    function vaciar_carrito_al_salir() {
    if( function_exists(‘WC’) ){
    WC()->cart->empty_cart();
    }
    }
    add_action(‘wp_logout’, ‘vaciar_carrito_al_salir’);

    para que lo ejecute al salir de la pagina checkout. … y no se como hacerlo tengo 2 meses en wordpress y de quien he apendido es de ti.
    Podriais orientarme? Muchas gracias

Viendo 3 respuestas - de la 1 a la 3 (de un total de 3)
  • El debate ‘Vaciar carrito, en casos concretos’ está cerrado a nuevas respuestas.