Soporte » Plugins y Hacks » WooCommerce » Aplicar función a solo una categoría de producto

  • Resuelto ethink1

    (@ethink1)


    Hola,
    Necesito que mis productos se empiecen a comprar a partir de 5 unidades. Encontré esta función en los snippets de la web oficial de Woocommerce, funciona correctamente pero me lo aplica a todos lo productos de la tienda. Me gustaría que solo los aplicara a una categoría de producto concreta. ¿Me podríais ayudar a cómo añadir ese requisito?
    Muchas gracias!

    add_filter( 'woocommerce_quantity_input_args', 'jk_woocommerce_quantity_input_args', 10, 2 ); // Simple products
    
    function jk_woocommerce_quantity_input_args( $args, $product ) {
    	if ( is_singular( 'product' ) ) {
    		$args['input_value'] 	= 5;	// Starting value (we only want to affect product pages, not cart)
    
    	}
    	$args['max_value'] 	= 80; 	// Maximum value
    	$args['min_value'] 	= 5;   	// Minimum value
    	$args['step'] 		= 1;    // Quantity steps
    	return $args;
    }
    
    add_filter( 'woocommerce_available_variation', 'jk_woocommerce_available_variation' ); // Variations
    
    function jk_woocommerce_available_variation( $args ) {
    	$args['max_qty'] = 80; 		// Maximum value (variations)
    	$args['min_qty'] = 5;   	// Minimum value (variations)
    	return $args;
    }
    • Este debate fue modificado hace 1 año, 8 meses por josearcos.
Viendo 13 respuestas - de la 1 a la 13 (de un total de 13)
  • Moderador josearcos

    (@josearcos)

    Hola, @ethink1. Puedes añadir un condicional para que salga de la función si no es de la categoría que quieres. Para comprobar que el producto esté en la categoría deseada, sigue estos pasos:

    1. Obten el listado de categorías del producto.
    2. Comprueba si existe la categoría.
    3. Retorna de la función o continua la ejecución.

    El código resultante sería algo así:

    add_filter( 'woocommerce_quantity_input_args', 'jk_woocommerce_quantity_input_args', 10, 2 ); // Simple products
    
    function jk_woocommerce_quantity_input_args( $args, $product ) {
    	// Obten las categorías del producto
    	$product_terms = get_the_term_list( $product->ID, 'product_cat' );
    	// Comprueba si el producto está en esa categoría
    	// IMPORTANTE: CAMBIA EL NOMBRE DE LA CATEGORÍA POR EL NOMBRE REAL
    	if ( is_singular( 'product' ) && in_array( 'nombre-de-la-categoria', $product_terms ) {
    		$args['input_value'] 	= 5;	// Starting value (we only want to affect product pages, not cart)
    
    	}
    	$args['max_value'] 	= 80; 	// Maximum value
    	$args['min_value'] 	= 5;   	// Minimum value
    	$args['step'] 		= 1;    // Quantity steps
    	return $args;
    }
    
    add_filter( 'woocommerce_available_variation', 'jk_woocommerce_available_variation' ); // Variations
    
    function jk_woocommerce_available_variation( $args ) {
    	$args['max_qty'] = 80; 		// Maximum value (variations)
    	$args['min_qty'] = 5;   	// Minimum value (variations)
    	return $args;
    }

    Mira las diferencias del código y dime si te vale.

    Un saludo.

    • Esta respuesta fue modificada hace 1 año, 8 meses por josearcos.
    Iniciador del debate ethink1

    (@ethink1)

    Hola José,
    En primer lugar darte gracias por la respuesta. Al añadir este código la página se vuelve en blanco y sale el mensaje «El sitio está experimentando dificultades técnicas.»

    Donde me indicas el nombre de la categoría he puesto uno de los míos, solo he cambiado eso, no sé que puede ser lo que esté dando error. Ojalá puedas corregirlo.
    Muchísimas gracias.

    Moderador josearcos

    (@josearcos)

    Disculpa por el error, sustituye la línea:
    $product_terms = get_the_term_list( $product->ID, 'product_cat' );
    por:
    $product_terms = get_the_term( $product->ID, 'product_cat' );
    Así te devuelve un array y una cadena de texto.

    Un saludo.

    Iniciador del debate ethink1

    (@ethink1)

    Jose´, lo siento pero me devuelve el mismo mensaje… se ve que hay algo que no está bien 🙁
    Esto es lo que estoy poniendo:

    
    add_filter( 'woocommerce_quantity_input_args', 'jk_woocommerce_quantity_input_args', 10, 2 ); // Simple products
    
    function jk_woocommerce_quantity_input_args( $args, $product ) {
        // Obten las categorías del producto
        $product_terms=get_the_term( $product->ID, 'product_cat' );
        // Comprueba si el producto está en esa categoría
        // IMPORTANTE: CAMBIA EL NOMBRE DE LA CATEGORÍA POR EL NOMBRE REAL
        if ( is_singular( 'product' ) && in_array( 'itinerarios-permanentes', $product_terms ) {
            $args['input_value']    = 5;    // Starting value (we only want to affect product pages, not cart)
    
        }
        $args['max_value']  = 80;   // Maximum value
        $args['min_value']  = 5;    // Minimum value
        $args['step']       = 1;    // Quantity steps
        return $args;
    }
    
    add_filter( 'woocommerce_available_variation', 'jk_woocommerce_available_variation' ); // Variations
    
    function jk_woocommerce_available_variation( $args ) {
        $args['max_qty'] = 80;      // Maximum value (variations)
        $args['min_qty'] = 5;       // Minimum value (variations)
        return $args;
    }
    • Esta respuesta fue modificada hace 1 año, 8 meses por josearcos.
    Moderador josearcos

    (@josearcos)

    Disculpa de nuevo, la función es en plural, las prisas no son buenas 😉

    $product_terms=get_the_terms( $product->ID, 'product_cat' );

    Iniciador del debate ethink1

    (@ethink1)

    Nada, sigue igual… 🙁

    Moderador josearcos

    (@josearcos)

    Activa el debug en WordPress y copia por aquí lo que encuentres en el archivo debug.log. Sigue estas instrucciones si no sabes cómo:
    https://codex.wordpress.org/es:Depurar_en_WordPress

    Iniciador del debate ethink1

    (@ethink1)

    Me sale esto:

    Notice: Use of undefined constant WPLANG – assumed ‘WPLANG’ in /home/thinkworking/public_html/laponte.thinkworking.com/wp-content/plugins/woocommerce-es/woocommerce-es.php on line 113

    Parse error: syntax error, unexpected ‘;’ in /home/thinkworking/public_html/laponte.thinkworking.com/wp-content/themes/bridge-child/functions.php on line 76
    El sitio está experimentando dificultades técnicas.

    La línea 76 es la correspondiente a este código:

    $args[‘input_value’] = 5; // Starting value (we only want to affect product pages, not cart)

    Espero que te sirva, mil gracias 🙂

    Moderador josearcos

    (@josearcos)

    Prueba con este código, he pasado el inspector y parece estar limpio de errores:

    add_filter( 'woocommerce_quantity_input_args', 'jk_woocommerce_quantity_input_args', 10, 2 ); // Simple products
    
    function jk_woocommerce_quantity_input_args( $args, $product ) {
    	// Obten las categorías del producto
    	$product_terms = get_the_terms( $product->ID, 'product_cat' );
    	// Comprueba si el producto está en esa categoría
    	// IMPORTANTE: CAMBIA EL NOMBRE DE LA CATEGORÍA POR EL NOMBRE REAL
    	if ( is_singular( 'product' ) && in_array( 'itinerarios-permanentes', $product_terms, true ) ) {
    		$args['input_value'] = 5;    // Starting value (we only want to affect product pages, not cart)
    
    	}
    	$args['max_value'] = 80;   // Maximum value
    	$args['min_value'] = 5;    // Minimum value
    	$args['step']      = 1;    // Quantity steps
    	return $args;
    }
    
    add_filter( 'woocommerce_available_variation', 'jk_woocommerce_available_variation' ); // Variations
    
    function jk_woocommerce_available_variation( $args ) {
    	$args['max_qty'] = 80;      // Maximum value (variations)
    	$args['min_qty'] = 5;       // Minimum value (variations)
    	return $args;
    }
    Iniciador del debate ethink1

    (@ethink1)

    Me hace lo mismo que la función primera, es decir, me aplica que empiece a contar desde 5 en todos los productos de la tienda, sin tener en cuenta la categoría. No sé porque no nos hace caso 🙁
    A ver si a alguien se le ocurre otra forma y nos puede echar un cable

    Moderador josearcos

    (@josearcos)

    Vale, ahora lo entiendo 🤦‍♂️
    Estaba entendiendo mal la lógica de tu pregunta. Intenta con este código, si no me doy por vencido 😉

    add_filter( 'woocommerce_quantity_input_args', 'jk_woocommerce_quantity_input_args', 10, 2 );
    
    function jk_woocommerce_quantity_input_args( $args, $product ) {
    	$product_terms = get_the_terms( $product->ID, 'product_cat' );
    	if ( ! in_array( 'itinerarios-permanentes', $product_terms, true ) ) {
    		return $args;
    	}
    	if ( is_singular( 'product' ) ) {
    		$args['input_value'] = 5;
    	}
    	$args['max_value'] = 80;
    	$args['min_value'] = 5;
    	$args['step']      = 1;
    	return $args;
    }
    
    add_filter( 'woocommerce_available_variation', 'jk_woocommerce_available_variation' );
    
    function jk_woocommerce_available_variation( $args ) {
    	$args['max_qty'] = 80;
    	$args['min_qty'] = 5;
    	return $args;
    }

    Si por algún casual te diera error de página en blanco, pon por aquí el debug.

    Un saludo.

    Iniciador del debate ethink1

    (@ethink1)

    Hola de nuevo Jose,
    Pues no me hace nada, el contador de todos los productos empieza a 1.
    Es como si no hubiera metido ningún código.

    Tengo dos categorías de producto: itinerarios-permanentes y colaboracion.
    En los productos incluidos dentro de Itinerarios permanentes quiero que empiece a contar las unidades desde 5 (es el mínimo de compra) y en Colaboración que empiece desde 1 (lo normal).
    Con el primer código que puse conseguía que todos los productos empezaran desde 5, pero solo necesito que los de la categoría Itinerarios Permanantes empiecen así.
    A ver si alguien me puede ayudar. Gracias y perdonar las molestias.

    Iniciador del debate ethink1

    (@ethink1)

    Escribo de nuevo para dejar aquí un código que encontré y que me funciona correctamente, por si lo necesitase otra persona:

    add_filter( 'woocommerce_quantity_input_args', 'min_qty_filter_callback', 20, 2 );
    function min_qty_filter_callback( $args, $product ) {
        $category = 'NOMBRE_DE_TU_CATEGORIA_DE_PRODUCTO'; // The targeted product category
        $min_qty  = 5; // The minimum product quantity
    
        $product_id = $product->is_type('variation') ? $product->get_parent_id() : $product->get_id();
    
        if( has_term( $category, 'product_cat', $product_id ) ){
            $args['min_value'] = $min_qty;
        }
        return $args;
    }

    Gracias @josearcos por tu paciencia y ganas de ayudarme 🙂

    • Esta respuesta fue modificada hace 1 año, 8 meses por josearcos.
Viendo 13 respuestas - de la 1 a la 13 (de un total de 13)
  • El debate ‘Aplicar función a solo una categoría de producto’ está cerrado a nuevas respuestas.