Paginare și număr de rezultate WooCommerce după buclă personalizată
Încerc să obțin un afișaj corect al paginării și numărului de rezultate după rularea interogării mele personalizate.
Momentan, rezultatele interogării sunt afișate corect, dar se pare că numărul de rezultate și paginarea sunt afișate pentru toate produsele din magazin.
După ce am analizat problema, am descoperit că am creat un obiect de interogare separat în loc să înlocuiesc interogarea principală. Am încercat să repar acest lucru urmând ghidul de aici: Cum să repari paginarea pentru bucle personalizate?
... dar acesta este un mod WordPress și trebuie să transform acest cod:
global $loop;
$args = array(
'post_type' => 'product',
'posts_per_page' => $per_page,
'meta_query' => array(
array(
'key' => '_product_brand',
'value' => $val,
)
)
);
$loop = new WP_Query($args);
// fix pentru paginare
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $loop;
if ($loop->have_posts()) {
while ($loop->have_posts()) : $loop->the_post();
wc_get_template_part('content', 'product');
endwhile;
} else {
echo __('Nu s-au găsit produse');
}
wp_reset_postdata();
$wp_query = NULL;
$wp_query = $temp_query;
... într-o funcție WooCommerce. Până acum am încercat să schimb variabila globală $loop cu $woocommerce_loop, dar generează erori.
Am încercat și să transmit atributul $paged astfel:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'product',
'posts_per_page' => $per_page,
'paged' => $paged,
'meta_query' => array(
array(
'key' => '_product_brand',
'value' => $val,
)
)
);
și astfel:
$args['paged'] = (get_query_var('paged')) ? get_query_var('paged') : 1;
Ambele metode au eșuat - afișează corect produsele, dar nu și paginarea sau numărul de rezultate.
Care este problema aici? Aș aprecia orice ajutor, mulțumesc.
#EDIT 1 După ce am urmat ghidul CFX: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/
Paginarea și numărul de rezultate au început să funcționeze. Problema mea a fost folosirea WP_Query în loc de wc_get_products.
Urmând documentația WooCommerce pentru funcția wc_get_products: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query
Am reușit să afișez corect produsele cu cheia mea personalizată. Dar nu toate argumentele din documentație funcționează pentru mine. De exemplu, nu pot afișa produsele dintr-o categorie sau produsele cu un preț dat.
$all_products = wc_get_products(array(
'category' => array('suspension'),
'price' => 59.99,
'regular_price' => 59,
'sale_price' => 159,
));
Am încercat să transmit aceste argumente unul câte unul, conform documentației, așa că ar trebui să funcționeze, dar nu funcționează. Generează această eroare:
Warning: array_map(): Argument #2 should be an array in E:\xampp\apps\wordpress\htdocs\wp-content\plugins\woocommerce\includes\data-stores\class-wc-product-data-store-cpt.php on line 1673
Warning: array_filter() expects parameter 1 to be array, null given in E:\xampp\apps\wordpress\htdocs\wp-content\plugins\woocommerce\includes\data-stores\class-wc-product-data-store-cpt.php on line 1673
#EDIT2
argumente:
$all_products = wc_get_products(array(
'product_category' => 'suspension',
));
handler:
if (!empty($query_vars['product_category'])) {
$query['tax_query'][] = array(
'taxonomy' => 'product_cat',
'terms' => esc_attr($query_vars['product_category']),
);
return $query;
}
Vreau să afișez produsele din categoria părinte cu slug-ul dat. Acest cod funcționează doar dacă transmit ID-ul categoriei. Dacă transmit slug-ul ca argument (ca în codul de mai sus), bucla afișează toate produsele din magazin.

O complici lucrurile destul de mult cu o parte din sintaxa ta de interogare, iar WooCommerce descurajează de fapt utilizarea WP_Query()
pentru a prelua produse. Ei chiar susțin că acest lucru poate duce la probleme pe termen lung.
Am scris recent un articol despre cum să faci exact ceea ce dorești, complet cu un exemplu aici: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

Da, exact asta căutam. Mulțumesc! Acum trebuie să transform toate interogările WP_Query în wc_get_products. Așa că am o întrebare pentru tine: ai folosit interogări complexe în proiectul tău? Adică cele cu meta_key specificat, meta_value, interval de preț între anumite valori etc..?

Nu am încercat asta, dar ar putea funcționa. Încearcă și voi face tot posibilul să te ajut dacă întâmpini vreo problemă.

Am actualizat articolul. Poți să te uiți la #EDIT1 și să îmi spui dacă acele argumente funcționează pentru tine?

Nu funcționează, dar dacă le formatăm așa cum ai formata un WP_Query()
, atunci interogarea taxonomiei funcționează perfect. Nu sunt sigur ce încerci să faci cu valorile de preț, dar poate ai nevoie de o cheie personalizată meta_query
pentru a realiza ceea ce dorești. Verifică clasa WC_Product_Query()
pentru argumente valide.

Este ciudat, argumentele de bază nu funcționează. Se pare că trebuie să anunț suportul WooCommerce. Da, am rezolvat problema prețurilor cu meta_query
. FYI, folosesc prețurile cu filtrele mele personalizate - utilizatorul introduce 'price_min' și 'price_max', iar apoi afișez produsele din intervalul de preț dat. Acum mă întreb cum să rezolv problema categoriei. Pentru categoriile cu ID dat am folosit tax_query, dar cum rămâne cu categoriile cu slug dat? Pentru ele, argumentul category
este defect...

category
este strict pentru taxonomia nativă WordPress category
. Dacă vrei să filtrezi după product_cat
, atunci vei avea nevoie de un tax_query
, despre care am confirmat că funcționează conform așteptărilor. Poate dorești să postezi soluția finală ca o actualizare.

tax_query
funcționează conform așteptărilor, dar pot trece doar ID-ul categoriei părinte, și am nevoie să transmit slug-ul categoriei părinte ca argument. Cu siguranță voi face o actualizare pentru cititorii viitori.

Poți să actualizezi cu codul pe care îl ai în prezent și detalii despre ce te aștepți să se întâmple și detalii despre ce se întâmplă în schimb?

Nu este clar ce încerci să faci aici. Te rog să incluzi codul complet. Dacă acesta este un șablon de pagină, te rog să îl incluzi. Nu am nicio idee de ce ai împărțit asta în "argumente" și "handler" sau ce ar trebui să însemne acestea.

Deoarece argumentul category
nu funcționează, încerc să găsesc o altă metodă de a afișa toate produsele dintr-o anumită categorie. Așadar, vreau să transmit slug-ul categoriei ca argument.

Am descoperit cum să afișez produsele dintr-o categorie folosind ID-ul categoriei părinte și am realizat acest lucru folosind tax_query
. Acum mă întreb dacă este posibil să configurez tax_query
astfel încât să pot transmite slug
-ul categoriei în loc de ID-ul categoriei. || product_category
nu este un argument built-in, așa că WooCommerce îl tratează ca unul personalizat, iar argumentele personalizate trebuie gestionate manual, exact ca și meta_keys personalizate (verifică documentația)

...dar cum rămâne cu result count
? se pare că nu afișează numărul corect de produse pe care le-am obținut folosind abordarea @cfx. Din câte am înțeles, $total
(woocommerce_result_count()
) este luat din wc_get_loop_prop( 'total' )
, și văd că l-am schimbat în $products->total
și abia apoi am făcut do_action('woocommerce_before_shop_loop');
Dar $total din Se afișează x - x din x rezultate
nu reacționează la asta...
