Widget Categorii Produse Woocommerce - ascunde categoriile fără produse în stoc

4 dec. 2012, 12:43:09
Vizualizări: 21.8K
Voturi: 3

Folosesc WooCommerce pe site-ul meu WordPress și am un widget în sidebar care afișează toate categoriile de produse. Este setat să ascundă categoriile goale și asta funcționează bine. Cu toate acestea, încă afișează categoriile care conțin doar produse care nu sunt în stoc - lucru pe care aș dori să-l modific.

Explicație tehnică: Produsele WooCommerce sunt un tip de postare personalizat (product), categoriile de produse sunt o taxonomie personalizată (product_cat), iar numărul stocului este un câmp personalizat pentru produse (_stock). Widget-ul Categorii Produse WooCommerce le afișează folosind wp_list_categories(). Am încercat să caut în cod pentru a găsi un apel de filtru pe care l-aș putea folosi, dar nu am reușit să găsesc unul.

Există o modalitate bună de a face acest lucru fără a modifica codul de bază sau codul WooCommerce? Poate un hook/filtru pe care l-am omis și care ar permite verificarea valorii câmpului personalizat?

0
Toate răspunsurile la întrebare 3
2

Folosește filtrele woocommerce_product_categories_widget_args și woocommerce_get_availability într-o funcție personalizată pentru a filtra widget-ul de categorii de produse pentru produsele care nu sunt în stoc.

Vezi ce poți realiza folosind aceste filtre și postează codul aici dacă te blochezi.

Iată un exemplu de cod de pe site-ul meu care te poate ajuta să începi.

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;
}

Aici sunt toate hook-urile pentru WooCommerce

22 feb. 2014 02:45:46
Comentarii

+1. Tocmai mă gândeam la această abordare, dar invers... folosind parametrul 'include'. Dacă interoghezi toate produsele din fiecare categorie, imediat ce găsești 1 produs în stoc poți să-l adaugi în array-ul 'included' și să treci la următoarea categorie în loc să verifici fiecare categorie. Aparent, aceasta este o întrebare veche (nu observ întotdeauna datele), dar sunt intrigat de ea.

helgatheviking helgatheviking
23 feb. 2014 10:45:03

Am scris următoarele după ce am găsit acest thread într-o căutare Google. Presupun că interogarea în sine ar putea fi optimizată, SQL-ul meu este slab. Sunt curios să văd cum se compară această abordare cu ideea lui @helgatheviking de a face o buclă, din punct de vedere al vitezei.

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

karpstrucking karpstrucking
16 ian. 2016 20:53:10
0

Nu sunt sigur că acest lucru este posibil, deoarece nu cred că există vreun loc în wp_list_categories() care să verifice starea postărilor/produselor din categorie. Chiar dacă ar exista, ar trebui să interoghezi o mulțime de produse din TOATE categoriile, ceea ce ar fi foarte ineficient.

Ai putea, poate, să înlocuiești WC_Product_Cat_Dropdown_Walker și să faci verificarea acolo.

Funcția responsabilă pare să accepte un alt Walker:

/**
 * Parcurge categoriile de produse.
 *
 * @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();

    // opțiunile utilizatorului sunt al treilea parametru
    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 );
}

Deci, dacă ai duplica widget-ul, ai putea schimba în principiu

// Blocat cu asta până la o rezolvare pentru http://core.trac.wordpress.org/ticket/13258
            wc_product_dropdown_categories( array(
                'show_counts'        => $c,
                'hierarchical'       => $h,
                'show_uncategorized' => 0,
                'orderby'            => $o
            ) );

în

// Blocat cu asta până la o rezolvare pentru 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'
            ) );

Și apoi ai fi responsabil pentru crearea și includerea unei clase Walker InStock_Categories. Complet netestat, dar doar arunc niște idei pe masă.

22 feb. 2014 02:31:47
5

Dacă mergi la WooCommerce => Setări și selectezi fila 'Inventar', vei vedea o opțiune pentru 'Ascunde produsele stocate epuizate din catalog'. Dacă activezi această opțiune, produsele epuizate nu vor fi afișate, iar dacă o categorie nu conține niciun produs vandabil (epuizat sau fără preț), aceasta va fi de asemenea ascunsă.

Actualizare

Ok, am citit 'widget' și l-am ignorat complet în răspunsul meu.

Widget-ul WooCommerce pentru Categorii de Produse nu suportă filtrarea produselor/categoriilor, din câte știu eu. Deci, nu există niciun hook sau filtru de care să fiu conștient.

Dar poți copia cu ușurință fișierul singular și să-l modifici ca un widget independent care nu ar fi suprascris de o actualizare WooCommerce.

Sper că acest lucru te ajută.

5 dec. 2012 03:39:48
Comentarii

Opțiunea este bifată. Articolele stocate epuizate nu sunt afișate pe paginile magazinului, dar acestea sunt încă luate în considerare în numerele de produse din categorie, iar categoriile care conțin doar articole stocate epuizate sunt încă afișate în widget.

olex olex
5 dec. 2012 10:50:39

Am uitat de 'Widget'. Vezi actualizările mele în răspuns.

Steve Steve
5 dec. 2012 16:13:04

Suportă filtrarea categoriilor în widget, pe care o poți folosi și cu etichetele condiționale WooCommerce.

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

@BradDalton Ai fi atât de amabil să adaugi un răspuns la această întrebare cu link-uri către documentația corespunzătoare? Acest lucru ar îmbunătăți considerabil calitatea întrebării/răspunsului.

Steve Steve
23 feb. 2014 02:51:48

olex trebuie să posteze niște cod aici și să contribuie cu o parte din muncă. Am furnizat 2 filtre și jumătate din cod pentru a începe cu această soluție. Mai sunt și altele.

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