Modificarea produselor similare în WooCommerce pentru afișarea după etichete
Am următoarele linii de cod pe site-ul meu care afișează produsele similare în partea de jos a paginii de produs individual în WooCommerce...
functions.php:
// afișează produsele recomandate și similare într-un div dedicat cu un număr și coloane diferite
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;
}
Deoarece afișează 4 produse care au fost categorizate sub același nume, cum aș putea modifica codul de mai sus pentru a afișa produsele după etichete?
De exemplu, am o categorie de produse numită 'Automotive' și în această categorie sunt câteva etichete - 'Holden', 'Ford', 'Toyota', 'Nissan' etc.
Aș dori să afișeze 4 produse în partea de jos, legate de eticheta produsului pe care îl vizualizează utilizatorul.
În primul rând, nu poți atinge imediat scopul descris cu codul afișat în întrebarea ta. Pentru a înțelege de ce nu există o abordare directă cu acel cod, trebuie să analizezi ce folosești - woocommerce_related_products()
- pentru a realiza ceea ce ai făcut până acum.
În al doilea rând, trebuie să înțelegi, altfel nu vei putea formula o întrebare precisă, care ar trebui să fie scopul tău principal, pentru a te asigura că vei primi un răspuns. În plus, trebuie să ții cont că WordPress Development are ca scop principal întrebări legate de nucleul WordPress - dacă ești interesat, acest subiect este discutat pe WordPress Development Meta, un subiect specific fiind Our wooes and future of platform plugins at WPSE. Așadar, dacă pui întrebări despre pluginuri, cum ar fi WooCommerce, ar trebui să le descompui pentru a le face cât mai apropiate de funcțiile de bază - vezi punctul următor - deoarece nu poți spera ca oamenii să cunoască fiecare detaliu al fiecărui plugin pe care îl folosești.
În al treilea rând, să aprofundăm ce se întâmplă. După cum ai menționat, folosești woocommerce_related_products()
acum. Dacă analizezi sursa, vei vedea că această funcție folosește woocommerce_get_template()
pentru a obține șablonul related.php
. woocommerce_get_template()
la rândul său folosește woocommerce_locate_template()
pentru a localiza șablonul, aceasta din urmă folosind funcția de bază din WordPress locate_template()
.
Acum există o legătură înapoi la nucleu, ceea ce ne conduce la realizarea că funcțiile WooCommerce menționate mai sus - și, sperăm, inspectate - sunt în esență wrapper-e care extind funcționalitatea de bază. Un alt lucru care a devenit clar prin analiza dependențelor funcționale este, așa cum am spus anterior, că ai nevoie de o abordare diferită pentru a-ți atinge scopul, deoarece woocommerce_related_products()
- acum incontestabil evident - nu este cea corectă.
Dacă m-ai urmărit cu explicațiile mele și ai citit cu atenție până acum, ai realizat că related.php
conține ceea ce cauți. Mă refer în special la funcția get_related()
, care include hook-ul woocommerce_product_related_posts
și folosește funcțiile de bază wp_get_post_terms()
și get_posts()
- get_related()
este folosit pentru a obține un set de ID-uri. În plus, există hook-ul woocommerce_related_products_args
, care poate fi folosit pentru a modifica argumentele interogării produselor conexe din related.php
, WP_Query
este folosit pentru aceasta. Interogarea folosește ID-urile rezultate din apelul get_related()
.
Cred că acum ai tot ce ai nevoie pentru a-ți rezolva problema. De fapt, mult mai mult decât atât, acest lucru oferă o privire de ansamblu aproape completă asupra modului de personalizare a produselor conexe. Nu am menționat fiecare funcționalitate - funcție și/sau hook - din codul inspectat, dar cu siguranță toate cele importante. Acum ar trebui să fie mai clar cum funcționalitatea produselor conexe din WooCommerce poate fi trasată înapoi la funcțiile de bază ale WordPress.
În al patrulea rând, ajung la partea în care ar trebui să aplici personalizările tale și la ceea ce ar fi trebuit să ceri. De exemplu, astfel:
WooCommerce are hook-ul woocommerce_product_related_posts
pentru a personaliza apelul get_posts()
pentru a determina produsele conexe.
Cod:
// Obține postările
$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
)
)
) ) );
Cum pot personaliza acest lucru pentru a-mi atinge scopul? Care este să afișez produse conexe care sunt în aceeași categorie de produse - product_cat
- și au aceeași etichetă(e) - product_tag
- ca produsul individual afișat.
Fără a-ți oferi un răspuns concluzion - cel puțin nu dacă ai așteptări să primești cod complet și gata făcut - primul lucru pe care probabil ar trebui să-l faci este să schimbi parametrul tax_query
relation
din OR
în AND
.
Note:
- Am făcut acest răspuns mai lung și descriptiv, având în vedere discuția în curs de desfășurare menționată mai sus
- Sper că nu te deranjează că nu este doar un răspuns la întrebarea ta, ci în plus încearcă să îndeplinească un scop educațional general
- acest lucru este netestat, deoarece nu există un cod gata făcut
- în cele din urmă, este previzibil că odată cu lansarea WooCommerce 2.1 vor fi implementate unele modificări semnificative de cod, ține cont de acest lucru, dar pentru moment, în versiunea 2.0.19, codul de mai sus este valabil
Editare:
Chiar nu ar trebui să editezi clasele de bază (ale pluginurilor) direct. Este problematic, deoarece trebuie să-ți menții modificările la actualizări din nou, deoarece fișierele de bază sunt actualizate și suprascrise atunci când efectuezi o actualizare. Mai ales dacă este ușor de evitat, ca în acest caz, codul de mai jos face exact ceea ce ai intenționat să faci, adică implementarea acestei modificări prin functions.php
.
Cod:
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;
}
Pentru WooCommerce versiunea 2.1.0 și mai nouă, hook-ul de mai sus nu va funcționa, deoarece nu mai există, așadar răspunsul este utilizabil până la versiunea 2.0.20. Dar @NathanPowell a descoperit un răspuns frumos pe StackOverflow referitor la setul de hook-uri disponibile începând cu v2.1.0 și utilizabile pentru personalizarea produselor conexe.

Mulțumesc foarte mult @ialocin pentru răspunsul rapid și detaliat. Ca măsură temporară, am schimbat pur și simplu OR
în AND
în fișierul meu wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
și voi modifica acest lucru în curând pentru a fi făcut din interiorul fișierului functions.php
. Mulțumesc din nou.

@user1752759 Vezi ediția mea pentru a face acest lucru prin functions.php

Răspuns perfect! Ar trebui să fie folosit în orice ghid despre cum să înțelegi plugin-urile și cum să le extinzi conform nevoilor tale. Nu sunt sigur dacă aceste cărți există însă.. Dar oricum :)

@ThdK Mulțumesc, nu știu dacă e chiar atât de bun, dar după ce l-am citit prima dată de când l-am scris, încă sunt mulțumit de răspuns, în afară de asta sigur apreciez complimentul, e mereu plăcut să auzi :) Ai încercat asta cu WC 2.1.x?

Salut @ialocin. Versiunea editată de la sfârșit are câteva paranteze închise lipsă, și din păcate, nu mai funcționează ca soluție în versiunea 2.1.8. Dacă nu e prea mult deranj, poți te rog să îl actualizezi pentru mine?

@user1752759 Poți și ar trebui să repari singur erorile pe care le vezi, editând răspunsul. În afară de asta, îmi pare rău, nu am timp momentan.

@Jk_ Cu plăcere! Ai implementat acest lucru? Și dacă da, pe ce versiune de WooCommerce?

Nu am implementat filtrul cum ai menționat. Am modificat related.php în tema mea pentru a adapta interogarea. În cazul meu voiam să găsesc produse similare bazate pe 'meta_query'. Dar răspunsul tău a fost atât de inspirant încât a trebuit să las un comentariu.

Să nu ne mințim aici, băieți. Răspunsul acceptat a ajutat utilizatorul să-și atingă obiectivul.
Prima problemă reală stă aici:
<?php
// afișează produsele suplimentare și produsele conexe într-un div dedicat cu un număr și un layout diferit de coloane
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);
O acțiune este eliminată, apoi plasată în EXACT aceeași poziție din care a fost eliminată. Scopul este complet neclar.
Am dat peste asta în timp ce căutam despre produsele conexe, pentru că nu înțelesesem că TAG-urile și CATEGORIILE sunt ce determină funcția woocommerce_output_related_products
în acest plugin.
Cel mai bun răspuns la ACEASTĂ întrebare este următorul link și are totul de-a face cu filtrul woocommerce_output_related_products_args()
: https://stackoverflow.com/questions/23554993/output-posts-relating-to-the-tags

Este de fapt destul de amuzant. De ce, te-ai putea întreba? Pentru că dacă ai citit cu atenție răspunsul meu, ai fi văzut că folosește doar un singur filtru. Mai exact, singurul filtru disponibil la acea vreme, dar ai fi știut asta dacă ai fi citit cu adevărat ce am scris și ai fi luat timp să te uiți la fișierele sursă din diferitele versiuni. Doar zic. În afară de asta, răspunsul la care ai dat link explică foarte bine noile hook-uri disponibile începând cu versiunea 2.1.

Îmi cer scuze pentru asta, era târziu noaptea. Speram să explic puțin despre greșeala evidentă din codul OP-ului.
