Paginare și număr de rezultate WooCommerce după buclă personalizată

18 mai 2018, 22:17:11
Vizualizări: 13.9K
Voturi: 1

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

6
Comentarii

Scuze, dar codul tău nu are niciun sens... Nu are rost această parte: $wp_query = NULL; $wp_query = $loop;. De ce să atribui NULL dacă imediat după aceea vrei să atribui o altă valoare. Și de ce să atribui ceva lui wp_query dacă imediat după folosești $loop pentru a parcurge postările...

Krzysiek Dróżdż Krzysiek Dróżdż
24 mai 2018 01:18:17

Am făcut aceste lucruri urmând ghidul. Din înțelegerea mea, resetarea query-ului principal ar trebui să elimine potențiale erori în timpul suprascrierii. Apoi scopul atribuirii lui $loop în wp_query este pentru a face paginarea să funcționeze. Bucla mea afișează postări, dar nu afectează query-ul original care este responsabil pentru paginare și numărarea rezultatelor. Am văzut acest tip de cod funcționând în ghid (link furnizat în întrebarea de mai sus), dar cazul meu este ușor diferit pentru că folosesc WooCommerce în loc de WordPress simplu.

Bartosz Was Bartosz Was
24 mai 2018 15:17:31

nu are niciun sens. Dacă atribui o valoare unei variabile, atunci doar o atribui - nu are rost să o faci de două ori. Și dacă nu modifici global $wp_query, atunci nu are rost să-l stochezi în variabile temporare și așa mai departe. Schimbă tutorialul, pentru că acesta este foarte prost - autorul nu înțelege elementele de bază ale PHP sau WP. PS. WooCommerce și alte plugin-uri terțe sunt în afara subiectului pe acest site.

Krzysiek Dróżdż Krzysiek Dróżdż
24 mai 2018 15:26:03

Ce obiect? Tu creezi această buclă în codul tău...

Krzysiek Dróżdż Krzysiek Dróżdż
24 mai 2018 15:30:38

Simplificând afirmația mea: $woocommerce_loop își preia rezultatele de undeva. Am crezut că este din wp_query (ca în WordPress), dar se pare că le ia din alt obiect și încerc să aflu exact acel obiect.

Bartosz Was Bartosz Was
24 mai 2018 15:41:15

Da, am făcut-o. Am uitat să modific linia cu variabilele globale, așa că nu a fost clar că folosesc 2 obiecte globale aici: $loop și $wp_query... Aș dori să modific ghidul, dar nu există exemple WooCommerce pe care să le pot folosi. Oricum, WooCommerce are un obiect care este responsabil pentru preluarea valorilor $woocommerce_loop (presupun că este bucla principală WooCommerce). În WordPress acel obiect era 'wp_query', dar în WooCommerce valori similare sunt atribuite unui $key diferit. Vreau doar să aflu acel key.

Bartosz Was Bartosz Was
24 mai 2018 15:41:17
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 1
14

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/

24 mai 2018 22:05:06
Comentarii

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

Bartosz Was Bartosz Was
25 mai 2018 16:58:45

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

cfx cfx
25 mai 2018 20:45:15

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

Bartosz Was Bartosz Was
29 mai 2018 14:38:51

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.

cfx cfx
29 mai 2018 20:14:22

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

Bartosz Was Bartosz Was
29 mai 2018 23:07:21

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.

cfx cfx
29 mai 2018 23:27:20

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.

Bartosz Was Bartosz Was
29 mai 2018 23:33:14

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?

cfx cfx
29 mai 2018 23:37:49

Desigur, aruncă o privire la #EDIT2.

Bartosz Was Bartosz Was
30 mai 2018 00:04:48

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.

cfx cfx
30 mai 2018 01:14:12

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.

Bartosz Was Bartosz Was
30 mai 2018 01:27:45

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)

Bartosz Was Bartosz Was
30 mai 2018 02:03:05

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

Able Able
20 nov. 2018 17:58:29

@Able funcționează perfect. Dacă înștiințezi un Gist cu întregul cod al template-ului tău, voi încerca să văd de ce poate nu funcționează la tine.

cfx cfx
20 nov. 2018 21:09:32
Arată celelalte 9 comentarii