Come aggiungere paginazione e conteggio risultati dopo un loop personalizzato in Woocommerce

18 mag 2018, 22:17:11
Visualizzazioni: 13.9K
Voti: 1

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.

6
Commenti

Scusa, ma il tuo codice non ha alcun senso... Non c'è motivo in questa parte: $wp_query = NULL; $wp_query = $loop;. Perché assegnare NULL se subito dopo vuoi assegnare un altro valore. E perché assegnare qualcosa a wp_query se subito dopo usi $loop per ciclare i tuoi post...

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

Ho fatto queste cose seguendo la guida. Nella mia comprensione azzerare la query principale serve ad eliminare potenziali errori durante l'override. Poi lo scopo di assegnare la mia $loop a wp_query è far funzionare la paginazione. Il mio loop sta mostrando i post ma non influisce sulla query originale che è responsabile per la paginazione e il conteggio dei risultati. Ho visto questo tipo di codice funzionare nella guida (link fornito nella domanda sopra), ma il mio caso è leggermente diverso perché sto usando woocommerce invece di wordpress semplice.

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

Non ha alcun senso. Se assegni un valore a una variabile, lo assegni e basta - non c'è motivo di farlo due volte. E se non modifichi il global $wp_query allora non ha senso memorizzarlo in variabili temporanee e simili. Cambia tutorial, perché questo è davvero pessimo - l'autore non capisce le basi di PHP né di WP. PS. WooCommerce e altri plugin di terze parti sono fuori tema su questo sito.

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

Quale oggetto? Crei tu stesso questo ciclo nel tuo codice...

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

Semplificando la mia affermazione: $woocommerce_loop sta recuperando i suoi risultati da qualche parte. Pensavo che fosse da wp_query (come in WordPress) ma mi sembra che stia prendendo i risultati da un altro oggetto e sto cercando di capire esattamente quale sia questo oggetto.

Bartosz Was Bartosz Was
24 mag 2018 15:41:15

Sì, l'ho fatto. Ho dimenticato di cambiare la riga con le variabili globali quindi non era chiaro che sto usando 2 oggetti globali qui: $loop e $wp_query... Mi piacerebbe modificare la guida ma non ci sono esempi di WooCommerce che potrei utilizzare. Comunque WooCommerce ha qualche oggetto che è responsabile di recuperare i valori di $woocommerce_loop (suppongo sia il loop principale di WooCommerce). In WordPress quell'oggetto era 'wp_query' ma in WooCommerce valori simili sono assegnati a una $key diversa. Voglio solo scoprire quella chiave.

Bartosz Was Bartosz Was
24 mag 2018 15:41:17
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 1
14

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/

24 mag 2018 22:05:06
Commenti

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

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

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

cfx cfx
25 mag 2018 20:45:15

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

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

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.

cfx cfx
29 mag 2018 20:14:22

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

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

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.

cfx cfx
29 mag 2018 23:27:20

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.

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

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?

cfx cfx
29 mag 2018 23:37:49

Certo, dai un'occhiata a #EDIT2.

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

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.

cfx cfx
30 mag 2018 01:14:12

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.

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

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)

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

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

Able Able
20 nov 2018 17:58:29

@Able funziona perfettamente. Se incolli un Gist con l'intero codice del tuo template, proverò a capire perché potrebbe non funzionare nel tuo caso.

cfx cfx
20 nov 2018 21:09:32
Mostra i restanti 9 commenti