Modificarea produselor similare în WooCommerce pentru afișarea după etichete

16 nov. 2013, 04:52:17
Vizualizări: 97.4K
Voturi: 16

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.

0
Toate răspunsurile la întrebare 2
9
33

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

16 nov. 2013 17:07:09
Comentarii

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 user1752759
17 nov. 2013 06:28:33

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

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

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 ThdK
6 apr. 2014 22:23:04

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

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

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 user1752759
6 mai 2014 07:21:00

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

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

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

Nicolai Grossherr Nicolai Grossherr
12 sept. 2014 00:09:33

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.

Nypam Nypam
12 sept. 2014 00:50:51

Mulțumesc! Păcat, eram doar curios din cauza comentariului anterior. @Jk_

Nicolai Grossherr Nicolai Grossherr
12 sept. 2014 01:29:44
Arată celelalte 4 comentarii
4

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

30 sept. 2014 10:46:05
Comentarii

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.

Nicolai Grossherr Nicolai Grossherr
6 oct. 2014 22:17:44

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

Nathan Powell Nathan Powell
16 oct. 2014 18:51:52

Nicio problemă, dar am simțit că trebuie să spun ceva.

Nicolai Grossherr Nicolai Grossherr
18 oct. 2014 09:40:24

Link-ul tău de referință a funcționat pentru mine, Nathan, mulțumesc, încercam să-l fac singur de 2 ore. Acum știu să aplic filtrele corect :)

marcovega marcovega
8 iul. 2015 12:41:11