Widget Categorie Prodotti WooCommerce - nascondere categorie senza prodotti in magazzino

4 dic 2012, 12:43:09
Visualizzazioni: 21.8K
Voti: 3

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?

0
Tutte le risposte alla domanda 3
2

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

22 feb 2014 02:45:46
Commenti

+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.

helgatheviking helgatheviking
23 feb 2014 10:45:03

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

karpstrucking karpstrucking
16 gen 2016 20:53:10
0

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.

22 feb 2014 02:31:47
5

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.

5 dic 2012 03:39:48
Commenti

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.

olex olex
5 dic 2012 10:50:39

Mi sono distratto sul 'Widget'. Vedi i miei aggiornamenti nella risposta.

Steve Steve
5 dic 2012 16:13:04

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

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

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

Steve Steve
23 feb 2014 02:51:48

olex deve postare del codice qui e contribuire con parte del lavoro. Ho fornito 2 filtri e metà del codice per iniziare a lavorare a questa soluzione. Ce ne sono altri.

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