Widget de Categorías de Productos de Woocommerce - ocultar categorías sin productos en stock

4 dic 2012, 12:43:09
Vistas: 21.8K
Votos: 3

Estoy usando WooCommerce en mi sitio WordPress y tengo un widget en la barra lateral que muestra todas las categorías de productos. Está configurado para ocultar las categorías vacías, y eso funciona bien. Sin embargo, todavía muestra categorías que contienen solo productos que están agotados - eso me gustaría cambiarlo.

Explicación técnica: Los productos de WooCommerce son un tipo de publicación personalizada (product), las categorías de productos son una taxonomía personalizada (product_cat), y el conteo de stock es un campo personalizado en los productos (_stock). El widget de Categorías de Productos de WooCommerce los muestra usando wp_list_categories(). He intentado investigar el código para buscar alguna llamada de filtro que pudiera usar, pero no he logrado encontrar una.

¿Hay alguna buena manera de hacer esto sin modificar el código del core o de WooCommerce? ¿Tal vez algún hook/filtro que me haya perdido que permita verificar el valor del campo personalizado?

0
Todas las respuestas a la pregunta 3
2

Utiliza los filtros woocommerce_product_categories_widget_args y woocommerce_get_availability en una función personalizada para filtrar el widget de categorías de productos para artículos agotados.

Prueba a ver qué puedes lograr usando estos filtros y comparte el código aquí si te quedas atascado.

Aquí tienes un código de mi sitio que puede ayudarte a comenzar.

add_filter( 'woocommerce_product_categories_widget_args', 'wpsites_exclude_product_cat_widget' );

function wpsites_exclude_product_cat_widget( $args ) {

$args['exclude'] = array('16','46');

return $args;
}

Aquí están todos los hooks para WooCommerce

22 feb 2014 02:45:46
Comentarios

+1. Justo estaba pensando en este enfoque, pero al revés... usando el parámetro 'include'. Si consultas todos los productos en cada categoría, tan pronto como encuentres 1 producto en stock puedes agregarlo al array 'included' y pasar a la siguiente categoría en lugar de revisar cada una. Aparentemente, esta es una pregunta antigua (no siempre noto las fechas), pero me intriga.

helgatheviking helgatheviking
23 feb 2014 10:45:03

Escribí lo siguiente después de encontrar este hilo en una búsqueda de Google. Asumo que la consulta en sí podría optimizarse, mi SQL es débil. Tengo curiosidad por ver cómo se compara este enfoque con la idea de @helgatheviking de usar un bucle, en términos de velocidad.

https://gist.github.com/karpstrucking/1f6139d6899b1709f545

karpstrucking karpstrucking
16 ene 2016 20:53:10
0

No estoy seguro de que esto sea posible, ya que no creo que haya un lugar en wp_list_categories() que verifique el estado de las publicaciones/productos en la categoría. Incluso si lo hubiera, tendrías que consultar muchos productos en TODAS las categorías, lo que sería muy ineficiente.

Podrías, tal vez, reemplazar el WC_Product_Cat_Dropdown_Walker y hacer tu verificación allí.

La función responsable parece aceptar otro Walker:

/**
 * Recorre las Categorías de Productos.
 *
 * @return mixed
 */
function wc_walk_category_dropdown_tree() {
    global $woocommerce;

    if ( ! class_exists( 'WC_Product_Cat_Dropdown_Walker' ) )
        include_once( WC()->plugin_path() . '/includes/walkers/class-product-cat-dropdown-walker.php' );

    $args = func_get_args();

    // las opciones del usuario son el tercer parámetro
    if ( empty( $args[2]['walker']) || !is_a($args[2]['walker'], 'Walker' ) )
        $walker = new WC_Product_Cat_Dropdown_Walker;
    else
        $walker = $args[2]['walker'];

    return call_user_func_array(array( &$walker, 'walk' ), $args );
}

Así que si duplicas el widget, podrías cambiar ostensiblemente

// Atascado con esto hasta que se solucione http://core.trac.wordpress.org/ticket/13258
            wc_product_dropdown_categories( array(
                'show_counts'        => $c,
                'hierarchical'       => $h,
                'show_uncategorized' => 0,
                'orderby'            => $o
            ) );

por

// Atascado con esto hasta que se solucione http://core.trac.wordpress.org/ticket/13258
            wc_product_dropdown_categories( array(
                'show_counts'        => $c,
                'hierarchical'       => $h,
                'show_uncategorized' => 0,
                'orderby'            => $o,
                                'walker'             => 'InStock_Categories'
            ) );

Y luego serías responsable de crear e incluir una clase Walker InStock_Categories. Totalmente no probado, pero solo estoy lanzando algunas ideas.

22 feb 2014 02:31:47
5

Si vas a WooCommerce => Configuración y seleccionas la pestaña 'Inventario', verás una opción para 'Ocultar artículos agotados del catálogo'. Si activas esta opción, los artículos agotados no se mostrarán y si una categoría no contiene ningún artículo disponible (agotado o sin precio), también se ocultará.

Actualización

Ok, leí 'widget' y lo ignoré por completo en mi respuesta.

El widget de Categorías de Productos de WooCommerce no admite filtrar los productos/categorías que yo sepa. Así que no hay ningún hook o filtro que conozca.

Pero podrías copiar fácilmente el archivo individual y modificarlo como un widget independiente que no se sobrescribiría con una actualización de WooCommerce.

Espero que eso ayude.

5 dic 2012 03:39:48
Comentarios

La opción está marcada. Los artículos agotados no se muestran en las páginas de la tienda, pero aún cuentan en los números de productos de la categoría, y las categorías que solo contienen artículos agotados aún se muestran en el widget.

olex olex
5 dic 2012 10:50:39

Me desconcentré en el 'Widget'. Mira mis actualizaciones en la respuesta.

Steve Steve
5 dic 2012 16:13:04

Soporta el filtrado de categorías en el widget, lo cual también puedes usar con las etiquetas condicionales de WooCommerce.

Brad Dalton Brad Dalton
22 feb 2014 02:36:21

@BradDalton ¿Serías tan amable de agregar una respuesta a esta pregunta con enlaces a la documentación apropiada? Esto mejoraría significativamente la calidad de la pregunta/respuesta.

Steve Steve
23 feb 2014 02:51:48

olex necesita publicar algún código aquí y contribuir con parte del trabajo. He proporcionado 2 filtros y la mitad del código para comenzar con esta solución. Hay otros.

Brad Dalton Brad Dalton
23 feb 2014 10:07:05