Widget Categorie Prodotti WooCommerce - nascondere categorie senza prodotti in magazzino
Sto utilizzando WooCommerce sul mio sito WordPress e ho un widget nella sidebar che mostra tutte le categorie di prodotti. È configurato per nascondere le categorie vuote e questo funziona bene. Tuttavia, mostra ancora le categorie che contengono solo prodotti che non sono disponibili in magazzino - questo è quello che vorrei modificare.
Spiegazione tecnica: i prodotti WooCommerce sono un tipo di post personalizzato (product
), le categorie dei prodotti sono una tassonomia personalizzata (product_cat
) e il conteggio delle scorte è un campo personalizzato sui prodotti (_stock
). Il widget Categorie Prodotti di WooCommerce le mostra utilizzando wp_list_categories()
. Ho provato ad esaminare il codice alla ricerca di qualche chiamata di filtro a cui potessi agganciarmi, ma non sono riuscito a trovarne una.
Esiste un buon modo per farlo senza modificare il codice core o WooCommerce? Forse un hook/filtro da qualche parte che mi sono perso che permetterebbe di controllare il valore del campo personalizzato?
Utilizza i filtri woocommerce_product_categories_widget_args
e woocommerce_get_availability
in una funzione personalizzata per filtrare il widget delle categorie di prodotti per i prodotti esauriti.
Prova a vedere cosa riesci a ottenere utilizzando questi filtri e pubblica il codice qui se hai difficoltà.
Ecco un esempio di codice dal mio sito che potrebbe aiutarti a iniziare.
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;
}
Qui trovi tutti i hook per WooCommerce

+1. Stavo proprio pensando a questo approccio, ma al contrario... utilizzando il parametro 'include'. Se esegui una query per tutti i prodotti in ogni categoria, non appena trovi 1 prodotto disponibile puoi aggiungerlo all'array 'included' e passare alla categoria successiva invece di controllare ogni categoria. Apparentemente, questa è una vecchia domanda (non noto sempre le date), ma sono intrigato da essa.

Ho scritto quanto sotto dopo aver trovato questo thread tramite una ricerca su Google. Presumo che la query stessa possa essere ottimizzata, il mio SQL è debole. Sono curioso di vedere come questo approccio si confronti con l'idea di @helgatheviking di usare un loop, in termini di velocità.
https://gist.github.com/karpstrucking/1f6139d6899b1709f545

Non sono sicuro che questo sia possibile, poiché non credo ci sia un punto in wp_list_categories()
che controlli mai lo stato dei post/prodotti nella categoria. Anche se ci fosse, dovresti interrogare un sacco di prodotti in TUTTE le categorie, il che sarebbe altamente inefficiente.
Potresti, forse, sostituire il WC_Product_Cat_Dropdown_Walker
e fare il tuo controllo lì.
La funzione responsabile sembra accettare un altro Walker:
/**
* Attraversa le Categorie di Prodotto.
*
* @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();
// le opzioni dell'utente sono il terzo parametro
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 );
}
Quindi se duplicassi il widget potresti sostanzialmente cambiare
// Bloccato con questo finché non ci sarà una correzione per http://core.trac.wordpress.org/ticket/13258
wc_product_dropdown_categories( array(
'show_counts' => $c,
'hierarchical' => $h,
'show_uncategorized' => 0,
'orderby' => $o
) );
in
// Bloccato con questo finché non ci sarà una correzione per 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'
) );
E poi saresti responsabile di creare e includere una classe Walker InStock_Categories
. Totalmente non testato, ma solo per lanciare qualche idea.

Se vai su WooCommerce => Impostazioni e selezioni la scheda 'Inventario', vedrai un'opzione per 'Nascondi gli articoli esauriti dal catalogo'. Se abiliti questa opzione, gli articoli esauriti non verranno visualizzati e se una categoria non contiene articoli vendibili (esauriti o senza prezzo) verrà nascosta anch'essa.
Aggiornamento
Ok, ho letto 'widget' e l'ho completamente ignorato nella mia risposta.
Per quanto ne so, il widget delle categorie di prodotti WooCommerce non supporta il filtraggio dei prodotti/categorie. Quindi nessun hook o filtore di cui io sia a conoscenza.
Ma potresti facilmente copiare il singolo file e modificarlo come widget autonomo che non verrebbe sovrascritto da un aggiornamento di WooCommerce.
Spero che questo ti sia d'aiuto.

L'opzione è selezionata. Gli articoli esauriti non vengono mostrati nelle pagine del negozio, ma vengono comunque conteggiati nei numeri dei prodotti delle categorie, e le categorie che contengono solo articoli esauriti sono ancora visualizzate nel widget.

Supporta il filtraggio delle categorie nel widget che puoi anche usare con i tag condizionali di WooCommerce.

@BradDalton Saresti così gentile da aggiungere una risposta a questa domanda con i link alla documentazione appropriata? Questo migliorerebbe notevolmente la qualità della domanda/risposta.
