Come personalizzare i prodotti relativi al woocommerce? [chiuso]


14

Ho le seguenti righe di codice nel mio sito Web che visualizzeranno i prodotti correlati nella parte inferiore della mia pagina del singolo prodotto in WooCommerce ...

functions.php:

// display upsells and related products within dedicated div with different column and number of products
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 visualizza 4 prodotti che sono stati classificati con lo stesso nome, come dovrei modificare quanto sopra, per visualizzare invece i tag correlati ?

Ad esempio, ho una categoria di prodotti denominata "Automotive" e all'interno di questa categoria sono presenti alcuni tag: "Holden", "Ford", "Toyota", "Nissan" ecc.

Vorrei che visualizzasse 4 prodotti in basso, relativi al tag del prodotto che l'utente sta visualizzando.

Risposte:


29

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

In secondo luogo , devi capire, perché altrimenti non sei in grado di porre una domanda sul punto, che dovrebbe assolutamente essere il tuo obiettivo, per assicurarti di ottenere una risposta. Oltre a ciò, devi tenere presente che lo sviluppo di Wordpress ha il suo ambito primario impostato su domande relative al core di wordpress - se sei interessato, questo è in discussione su Wordpress Development Meta , un argomento specifico è I nostri guai e il futuro dei plugin della piattaforma presso WPSE . Quindi, se stai ponendo domande sui plugin, come il woocommerce, dovresti scomporlo per renderlo il più possibile correlato alle funzioni principali - vedi il prossimo punto - poiché non puoi aspettarti che le persone conoscano ogni dettaglio di ogni plugin che stai usando.

In terzo luogo , ora consente di approfondire ciò che sta accadendo. Come hai detto, stai usando woocommerce_related_products()ora. Se dai un'occhiata alla fonte vedi che questa funzione usa woocommerce_get_template()per ottenere il related.phpmodello. woocommerce_get_template()usa nuovamente woocommerce_locate_template()per localizzare il template, quest'ultimo lo sta facendo usando la funzione core di wordpress locate_template().
Ora c'è una connessione con il core, che porta alla realizzazione che le funzioni di woocommerce sopra menzionate e, si spera, ispezionate, sono essenzialmente dei wrapper per estendere la funzionalità del core. Un'altra cosa che è diventata chiara analizzando le dipendenze della funzionalità è, quello che ho detto prima, è necessario 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 finora hai letto attentamente, ti sei reso conto che related.phpcontiene ciò che stai cercando. Sto parlando in particolare della get_related()funzione, che include l' woocommerce_product_related_postshook e fa uso delle funzioni principali wp_get_post_terms()e get_posts()- get_related()viene utilizzata per ottenere un set di ID. Inoltre v'è il woocommerce_related_products_argsgancio, che può essere utilizzato per alterare gli argomenti dei relativi prodotti di query all'interno related.php, WP_Queryviene utilizzato per questo. La query utilizza gli ID risultanti dalla get_related()chiamata.
Penso che tu abbia tutto a portata di mano per risolvere il tuo problema. In realtà molto più di questo, questo offre una panoramica quasi completa su come personalizzare i prodotti correlati. Non ho menzionato tutte le funzionalità - funzioni e / o hook - out del codice sorgente ispezionate, ma sicuramente tutte quelle importanti. Ora dovrebbe essere più chiaro come la funzionalità dei prodotti correlati del woocommerce possa essere ricondotta alle funzioni principali di wordpress.

In quarto luogo , vengo a dove dovresti applicare le tue personalizzazioni e cosa avresti dovuto chiedere. Ad esempio in questo modo:

Woocommerce ha il woocommerce_product_related_postsgancio per personalizzare la get_posts()chiamata per determinare i prodotti correlati.

Codice:

        // Get the posts
        $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 i prodotti correlati che sono nella stessa categoria di prodotti - product_cat- e hanno gli stessi tag - product_tag- del singolo prodotto mostrato.

Senza darti una conclusione - almeno non se ti aspettavi di ottenere un codice completo e pronto - risposta, la prima cosa che probabilmente dovresti fare è cambiare il tax_queryparametro relationda ORa AND.





Appunti:

  • Ho reso questa una risposta più descrittiva tenendo presente la discussione in corso sopra collegata
  • Spero non ti dispiaccia, che non sia solo una risposta alla tua domanda, ma persegue inoltre il raggiungimento di uno scopo educativo generale
  • questo non è testato , perché non esiste un vero codice pronto
  • ultimo ma non meno importante, è prevedibile che con il rilascio di woocoomerce 2.1 verranno implementate alcune significative modifiche al codice, se ne tiene conto, ma per ora a partire dalla 2.0.19 il codice sopra riportato è valido



Modificare:

Non dovresti davvero modificare direttamente le classi core (plugin). È problematico, perché è necessario mantenere nuovamente le modifiche sugli aggiornamenti, poiché i file core vengono aggiornati e sovrascritti se ne esegui uno. Soprattutto se è facilmente evitabile come in questo caso, sotto il codice fa comunque quello che intendevi fare, 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 per quanto riguarda la v2.1.0 in poi disponibile e per la personalizzazione del relativo set utilizzabile di ganci .


Grazie mille a @ialocin per la risposta rapida e dettagliata. Come misura temporanea, ho semplicemente cambiato il ORverso ANDnel mio wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phpfile di e sarà presto cambiare questo per essere fatto all'interno del functions.phpfile. Grazie ancora.
user1752759

@ user1752759 Vedi la mia modifica per farlo tramitefunctions.php
Nicolai,

Risposta perfetta! Dovrebbe essere utilizzato in qualsiasi guida su come comprendere i plugin e come estenderli alle tue esigenze. Non sono sicuro che esistano questi libri .. Ma comunque :)
Giovedì

@ThdK Grazie, non so se sia così bello, ma dopo averlo letto per la prima volta da quando lo scrivo sono ancora felice della risposta, inoltre apprezzo sicuramente il complimento, è sempre bello sentirlo :) hai provato questo con WC 2.1.x?
Nicolai,

Ciao a tutti @ialocin. Nella versione modificata in basso mancano alcune parentesi quadre e, sfortunatamente, non funziona più come soluzione nella versione 2.1.8. Se non ci sono troppi problemi, potresti aggiornare questo per me?
user1752759

2

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

Il primo problema sta qui:

<?php
// display upsells and related products within dedicated div with different column and number of    products
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 quindi posizionata nella posizione ESATTA da cui è stata rimossa. L'obiettivo non è del tutto chiaro.

Mi sono imbattuto in questo con una ricerca sui prodotti correlati perché non ho capito che TAGS e CATEGORIE sono ciò che guida la woocommerce_output_related_productsfunzione in questo plugin.

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


Questo è in realtà abbastanza divertente. Perché potresti chiedere, perché se hai letto attentamente la mia risposta, allora avresti visto, utilizza solo un filtro. Per l'esattezza l'unico filtro disponibile in quel momento, ma l'avresti saputo, se davvero avessi letto quello che ho scritto e avresti preso il tempo di esaminare i file sorgente delle diverse versioni. Sto solo dicendo. A parte questo, la risposta che hai collegato spiega molto bene i nuovi hook disponibili sine v2.1.
Nicolai,

Scusatemi, era tardi. Speravo di spiegare un po 'dell'ovvio errore nel codice da parte dell'OP.
Nathan Powell,

Nessun problema, ma sentivo che dovevo dire qualcosa però.
Nicolai,

Il tuo link di riferimento ha funzionato per me Nathan, grazie, ho cercato di farlo da solo 2 ore. Ora so applicare correttamente i filtri :)
marcovega
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.