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.php
modello. 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.php
contiene ciò che stai cercando. Sto parlando in particolare della get_related()
funzione, che include l' woocommerce_product_related_posts
hook 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_args
gancio, che può essere utilizzato per alterare gli argomenti dei relativi prodotti di query all'interno related.php
, WP_Query
viene 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_posts
gancio 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_query
parametro relation
da OR
a 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 .
OR
versoAND
nel miowp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
file di e sarà presto cambiare questo per essere fatto all'interno delfunctions.php
file. Grazie ancora.