Widget Categorii Produse Woocommerce - ascunde categoriile fără produse în stoc
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?
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

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

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

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

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

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.

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

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