Come aggiungere paginazione e conteggio risultati dopo un loop personalizzato in Woocommerce
Sto cercando di ottenere una visualizzazione corretta della paginazione e del conteggio dei risultati dopo aver eseguito la mia query personalizzata.
Attualmente i risultati della query vengono visualizzati correttamente, ma sembra che il conteggio dei risultati e la paginazione vengano mostrati per tutti i prodotti del negozio.
Dopo aver analizzato il problema, ho scoperto che ho creato un oggetto query separato invece di sostituire la query principale. Ho provato a risolvere seguendo questa guida: Come sistemare la paginazione per loop personalizzati?
...ma questo è un approccio WordPress e ho bisogno di trasformare questo codice:
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 per la paginazione
$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 __( 'Nessun prodotto trovato' );
}
wp_reset_postdata();
$wp_query = NULL;
$wp_query = $temp_query;
...in una funzione Woocommerce. Ho provato a cambiare la variabile globale $loop con $woocommerce_loop ma genera errori.
Ho anche provato a passare l'attributo $paged in questo modo:
$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,
)
)
);
e anche così:
$args['paged'] = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
Entrambi i metodi non hanno funzionato, visualizzano correttamente i prodotti ma non la paginazione né il conteggio dei risultati.
Qual è il problema? Apprezzerei davvero qualsiasi aiuto, grazie.
#EDIT 1 Dopo aver seguito la guida CFX: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/
La paginazione e il conteggio dei risultati hanno finalmente iniziato a funzionare. Il mio problema era usare WP_Query invece di wc_get_products.
Seguendo la documentazione di Woocommerce per la funzione wc_get_products: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query
ho ottenuto la visualizzazione corretta dei prodotti con la mia chiave personalizzata. Ma non tutti gli argomenti della documentazione funzionano per me. Ad esempio, non riesco a visualizzare i prodotti per categoria né i prodotti con un prezzo specifico.
$all_products = wc_get_products(array(
'category' => array( 'sospensioni' ),
'price' => 59.99,
'regular_price' => 59,
'sale_price' =>159,
));
Ho provato a passare questi argomenti uno per uno, tutto secondo la documentazione quindi dovrebbe funzionare ma non è così. Genera questo errore:
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
argomenti:
$all_products = wc_get_products(array(
'product_category' => 'sospensioni',
));
handler:
if ( ! empty( $query_vars['product_category']) ) {
$query['tax_query'][] = array(
'taxonomy' => 'product_cat',
'terms' => esc_attr( $query_vars['product_category'] ),
);
return $query;
}
Voglio visualizzare i prodotti dalla categoria principale con lo slug specificato. Questo codice funziona solo se passo l'ID della categoria. Se passo lo slug come argomento (come nel codice sopra) il loop mostra tutti i prodotti del negozio.

Stai complicando le cose con la tua sintassi delle query, e WooCommerce sconsiglia effettivamente l'uso di WP_Query()
per recuperare i prodotti. Affermano addirittura che potrebbe smettere di funzionare in futuro.
Recentemente ho scritto un articolo su come fare ciò che desideri, completo di un esempio qui: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

Sì, era esattamente quello che stavo cercando. Grazie! Ora devo trasformare tutte le WP_Query in wc_get_products. Quindi ho una domanda per te: hai usato query complesse nel tuo progetto? Intendo quelle con meta_key specificato, meta_value, range di prezzo tra valori dati ecc...?

Non ho provato ma potrebbe funzionare. Fai un tentativo e farò del mio meglio per aiutarti se incontri problemi.

Ho aggiornato il post. Puoi dare un'occhiata a #EDIT1 e dirmi se quegli argomenti funzionano per te?

Non funzionano, ma se li formattassi come faresti con una WP_Query()
allora la query della tassonomia funziona perfettamente. Non sono sicuro di cosa stai cercando di fare con i valori dei prezzi, ma potresti aver bisogno di una chiave personalizzata meta_query
per ottenere ciò che vuoi. Controlla la WC_Product_Query()
class per gli argomenti validi.

È strano, gli argomenti di base non funzionano. Sembra che debba informare il supporto di woocommerce. Sì, ho risolto il problema dei prezzi con meta_query
. Per tua informazione, sto usando i prezzi con i miei filtri personalizzati - l'utente inserisce 'price_min' e 'price_max' e poi mostro i prodotti nell'intervallo di prezzo specificato. Ora mi chiedo solo come risolvere il problema delle categorie. Per le categorie con un ID specifico ho usato tax_query, ma per quelle con uno slug? Per loro l'argomento category
non funziona...

category
è strettamente per la tassonomia nativa di WordPress category
. Se intendi filtrare per product_cat
allora avrai bisogno di un tax_query
che ho confermato funzionare come previsto. Potresti voler pubblicare la tua soluzione completata come aggiornamento.

tax_query
funziona come previsto ma posso comunque passare solo l'ID della categoria genitore, e ho bisogno di passare lo slug della categoria genitore come argomento. Aggiornerò sicuramente per i lettori futuri.

Puoi per favore aggiornare con il codice corrente che hai e i dettagli su cosa ti aspetti che accada e i dettagli su cosa sta succedendo invece?

Non è chiaro cosa stai cercando di fare qui. Per favore, includi il codice completo. Se si tratta di un template di pagina, per favore includilo. Non ho idea del perché tu abbia diviso questo in "argomenti" e "gestore" o cosa dovrebbero significare.

Poiché l'argomento category
è rotto, sto cercando un altro modo per visualizzare tutti i prodotti di una determinata categoria. Quindi voglio passare lo slug della categoria come argomento.

Ho scoperto come visualizzare i prodotti di una categoria utilizzando l'ID della categoria genitore e ho ottenuto questo risultato usando tax_query
. Ora mi chiedo se sia possibile impostare tax_query
in modo da poter passare lo slug
della categoria invece dell'ID della categoria. || product_category
non è un argomento integrato, quindi WooCommerce lo tratta come un argomento personalizzato, e gli argomenti personalizzati devono essere gestiti manualmente, esattamente come i meta_keys personalizzati (controlla la documentazione)

...ma riguardo al result count
? Sembra che non mostri il conteggio corretto dei prodotti che abbiamo ottenuto utilizzando l'approccio @cfx. Per quanto ho capito, $total
(woocommerce_result_count()
) viene preso da wc_get_loop_prop( 'total' )
, e vedo che l'abbiamo cambiato in $products->total
e solo dopo abbiamo eseguito do_action('woocommerce_before_shop_loop');
Ma $total in Showing x - x of x results
non reagisce a questo...
