Come personalizzare i prodotti correlati di WooCommerce?

16 nov 2013, 04:52:17
Visualizzazioni: 97.4K
Voti: 16

Ho le seguenti righe di codice nel mio sito web che mostrano i prodotti correlati in fondo alla pagina del singolo prodotto in WooCommerce...

functions.php:

// mostra upsells e prodotti correlati all'interno di un div dedicato con colonne e numero di prodotti diversi
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

function woocommerce_output_related_products() {
    $output = null;

    ob_start();
    woocommerce_related_products(4,4); 
    $content = ob_get_clean();
    if($content) { $output .= $content; }

    echo '<div class="clear"></div>' . $output;
}

Dato che mostra 4 prodotti che sono stati categorizzati con lo stesso nome, come potrei modificare il codice sopra per mostrare invece i tag correlati?

Per esempio, ho una categoria di prodotti chiamata 'Automotive' e all'interno di questa categoria ci sono alcuni tag - 'Holden', 'Ford', 'Toyota', 'Nissan' ecc.

Vorrei che mostrasse 4 prodotti in fondo, correlati al tag del prodotto che l'utente sta attualmente visualizzando.

0
Tutte le risposte alla domanda 2
9
33

Innanzitutto, non puoi raggiungere immediatamente l'obiettivo descritto con il codice mostrato nella tua domanda. Per capire perché non esiste un approccio diretto con quel codice, devi dare un'occhiata a ciò che stai utilizzando - woocommerce_related_products() - per fare ciò che hai fatto finora.

In secondo luogo, devi capire, altrimenti non sarai in grado di formulare una domanda precisa, che dovrebbe assolutamente essere il tuo obiettivo, per assicurarti di ottenere una risposta. Oltre a ciò, devi tenere a mente che Wordpress Development ha il suo ambito principale incentrato su domande relative al core di WordPress - se sei interessato, questo è in discussione su Wordpress Development Meta, un argomento specifico è Our wooes and future of platform plugins at WPSE. Quindi, se fai domande su plugin, come WooCommerce, dovresti scomporle per renderle il più possibile correlate alle funzioni core - vedi il punto successivo - poiché non puoi aspettarti che le persone conoscano ogni dettaglio di ogni plugin che stai utilizzando.

In terzo luogo, ora approfondiamo cosa sta succedendo. Come hai detto, stai utilizzando woocommerce_related_products(). Se dai un'occhiata al codice sorgente, vedrai che questa funzione utilizza woocommerce_get_template() per ottenere il template related.php. woocommerce_get_template() a sua volta utilizza woocommerce_locate_template() per individuare il template, quest'ultimo lo fa sfruttando la funzione core di WordPress locate_template().
Ora c'è una connessione con il core, che porta alla realizzazione che le funzioni di WooCommerce menzionate sopra - e spero ispezionate - sono essenzialmente wrapper per estendere la funzionalità del core. Un'altra cosa che è diventata chiara analizzando le dipendenze funzionali è, come ho detto prima, che hai bisogno di un approccio diverso per raggiungere il tuo obiettivo, perché woocommerce_related_products() - ora innegabilmente ovvio - non è quello corretto.
Se mi hai seguito con le mie spiegazioni e hai letto attentamente finora, hai capito che il file related.php contiene ciò che stai cercando. Mi riferisco in particolare alla funzione get_related(), che include l'hook woocommerce_product_related_posts e utilizza le funzioni core wp_get_post_terms() e get_posts() - get_related() viene utilizzato per ottenere un insieme di ID. Inoltre, c'è l'hook woocommerce_related_products_args, che può essere utilizzato per modificare gli argomenti della query dei prodotti correlati all'interno di related.php, WP_Query viene utilizzato per questo. La query utilizza gli ID risultanti dalla chiamata a get_related().
Penso che ora tu abbia tutto il necessario per risolvere il tuo problema. In realtà molto di più, questo fornisce una panoramica quasi completa su come personalizzare i prodotti correlati. Non ho menzionato ogni funzionalità - funzione e/o hook - dal codice sorgente ispezionato, ma sicuramente tutte quelle importanti. Ora dovrebbe essere più chiaro come la funzionalità dei prodotti correlati di WooCommerce possa essere ricondotta alle funzioni core di WordPress.

In quarto luogo, arrivo a dove dovresti applicare le tue personalizzazioni e cosa avresti dovuto chiedere. Ad esempio così:

WooCommerce ha l'hook woocommerce_product_related_posts per personalizzare la chiamata a get_posts() per determinare i prodotti correlati.

Codice:

        // Ottieni i post
        $related_posts = get_posts( apply_filters('woocommerce_product_related_posts', array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                        'relation' => 'OR',
                        array(
                                'taxonomy' => 'product_cat',
                                'field' => 'id',
                                'terms' => $cats_array
                        ),
                        array(
                                'taxonomy' => 'product_tag',
                                'field' => 'id',
                                'terms' => $tags_array
                        )
                )
        ) ) );

Come posso personalizzare questo per raggiungere il mio obiettivo? Che è quello di mostrare prodotti correlati che sono nella stessa categoria di prodotto - product_cat - e hanno lo stesso tag/i - product_tag - del singolo prodotto mostrato.

Senza darti una risposta conclusiva - almeno non se avevi l'aspettativa di ottenere un codice completo e pronto all'uso - la prima cosa che probabilmente dovresti fare è cambiare il parametro tax_query relation da OR a AND.





Note:

  • Ho reso questa risposta più lunga e descrittiva con la discussione in corso sopra menzionata in mente
  • Spero non ti dispiaccia che non sia solo una risposta alla tua domanda, ma che persegua anche uno scopo educativo generale
  • questo è non testato, perché non c'è un codice effettivo pronto all'uso
  • ultimo ma non meno importante, è prevedibile che con il rilascio di WooCommerce 2.1 verranno implementati alcuni cambiamenti significativi nel codice, tienilo a mente, ma per ora, come da versione 2.0.19, il codice sopra è valido



Modifica:

Non dovresti mai modificare direttamente le classi core (dei plugin). È problematico, perché devi mantenere le tue modifiche sugli aggiornamenti, poiché i file core vengono aggiornati e sovrascritti quando esegui un aggiornamento. Soprattutto se è facilmente evitabile come in questo caso, il codice qui sotto fa ciò che intendevi fare comunque, ovvero implementare questa modifica tramite il tuo functions.php.

Codice:

    add_filter( 'woocommerce_product_related_posts', 
                'wpse_123436_change_wc_related_products_relation_to_and' );
    function wpse_123436_change_wc_related_products_relation_to_and() {
            $get_related_products_args = array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                    'relation' => 'AND',
                    array(
                        'taxonomy' => 'product_cat',
                        'field' => 'id',
                        'terms' => $cats_array
                    ),
                    array(
                        'taxonomy' => 'product_tag',
                        'field' => 'id',
                        'terms' => $tags_array
                    )
                )
            );
            return $get_related_products_args;
    }



Per WooCommerce versione 2.1.0 e successive l'hook sopra non funzionerà, poiché non esiste più, quindi la risposta è utilizzabile fino alla versione 2.0.20. Ma @NathanPowell ha scoperto una bella risposta su StackOverflow riguardo all'insieme di hook disponibili a partire dalla v2.1.0 e utilizzabili per la personalizzazione dei prodotti correlati.

16 nov 2013 17:07:09
Commenti

Grazie mille @ialocin per la risposta rapida e dettagliata. Come misura temporanea, ho semplicemente cambiato OR in AND nel mio file wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php e presto modificherò questa operazione per essere eseguita dal file functions.php. Grazie ancora.

user1752759 user1752759
17 nov 2013 06:28:33

@user1752759 Vedi la mia modifica per farlo tramite functions.php

Nicolai Grossherr Nicolai Grossherr
18 nov 2013 13:01:03

Risposta perfetta! Dovrebbe essere utilizzata in qualsiasi manuale su come comprendere i plugin e come estenderli alle proprie esigenze. Non sono sicuro che questi libri esistano però.. Ma comunque :)

ThdK ThdK
6 apr 2014 22:23:04

@ThdK Grazie, non so se sia così buono, ma dopo averlo riletto per la prima volta da quando l'ho scritto sono ancora soddisfatto della risposta, oltre al fatto che apprezzo sicuramente il complimento, è sempre bello sentirselo dire :) Hai provato questo con WC 2.1.x?

Nicolai Grossherr Nicolai Grossherr
7 apr 2014 12:05:43

Ciao @ialocin. La versione modificata in fondo manca di alcune parentesi di chiusura e, purtroppo, non funziona più come soluzione nella versione 2.1.8. Se non è troppo disturbo, potresti aggiornarla per me?

user1752759 user1752759
6 mag 2014 07:21:00

@user1752759 Puoi e dovresti correggere gli errori che vedi da solo, modificando la risposta. A parte questo, mi dispiace, non ho tempo al momento.

Nicolai Grossherr Nicolai Grossherr
6 mag 2014 13:42:05

@Jk_ Piacere mio! Ce l'hai già in funzione? E se sì, su quale versione di WooCommerce?

Nicolai Grossherr Nicolai Grossherr
12 set 2014 00:09:33

Non ho implementato il filtro come hai menzionato. Ho modificato related.php nel mio tema per adattare la query. Nel mio caso volevo trovare prodotti correlati basati su 'meta_query'. Ma la tua risposta è stata così stimolante che ho dovuto lasciare un commento.

Nypam Nypam
12 set 2014 00:50:51

Grazie! Peccato, ero solo curioso, a causa del commento precedente. @Jk_

Nicolai Grossherr Nicolai Grossherr
12 set 2014 01:29:44
Mostra i restanti 4 commenti
4

Non prendiamoci in giro, ragazzi. La risposta accettata ha solo portato l'utente al suo obiettivo.

Il vero problema si trova qui:

<?php
// mostra prodotti upsell e correlati all'interno di un div dedicato con colonne e numero di prodotti diversi
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

Un'azione viene rimossa e poi reinserita nella STESSA posizione da cui è stata rimossa. L'obiettivo non è per niente chiaro.

Mi sono imbattuto in questo cercando informazioni sui prodotti correlati perché non avevo capito che sono i TAG e le CATEGORIE a guidare la funzione woocommerce_output_related_products in questo plugin.

La migliore risposta a QUESTA domanda è il seguente link, e ha tutto a che fare con il filtro woocommerce_output_related_products_args(): https://stackoverflow.com/questions/23554993/output-posts-relating-to-the-tags

30 set 2014 10:46:05
Commenti

Questa è davvero divertente. Perché potresti chiederti? Perché se avessi letto attentamente la mia risposta, avresti visto che utilizza solo un filtro. Per essere precisi, l'unico filtro disponibile a quel tempo, ma lo avresti saputo se avessi effettivamente letto ciò che ho scritto e avessi preso il tempo di guardare i file sorgente delle diverse versioni. Giusto per dire. A parte questo, la risposta che hai linkato spiega molto bene i nuovi hook disponibili dalla versione 2.1 in poi.

Nicolai Grossherr Nicolai Grossherr
6 ott 2014 22:17:44

Mi dispiace, era notte fonda. Speravo di spiegare un po' l'ovvio errore nel codice dell'OP.

Nathan Powell Nathan Powell
16 ott 2014 18:51:52

Nessun problema, ma ho sentito di dover dire qualcosa.

Nicolai Grossherr Nicolai Grossherr
18 ott 2014 09:40:24

Il tuo link di riferimento ha funzionato per me Nathan, grazie, ci stavo provando da 2 ore. Ora so come applicare correttamente i filtri :)

marcovega marcovega
8 lug 2015 12:41:11