Jak dostosować produkty związane z woocommerce? [Zamknięte]

14

Mam w mojej witrynie następujące wiersze kodu, które wyświetlą powiązane produkty na dole mojej strony pojedynczego produktu w WooCommerce ...

funkcje.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;
}

Ponieważ wyświetla 4 produkty, które zostały skategoryzowane pod tą samą nazwą, jak zmodyfikowałbym powyższe, aby zamiast tego wyświetlały powiązane tagi ?

Na przykład mam kategorię produktów o nazwie „Automotive”, a w tej kategorii jest kilka tagów - „Holden”, „Ford”, „Toyota”, „Nissan” itp.

Chciałbym, aby wyświetlały 4 produkty u dołu, powiązane z tagiem produktu, który użytkownik aktualnie przegląda.

użytkownik1752759
źródło

Odpowiedzi:

29

Po pierwsze , nie można od razu osiągnąć celu opisanego za pomocą kodu wyświetlanego w pytaniu. Aby zrozumieć, dlaczego nie ma bezpośredniego podejścia do tego kodu, musisz spojrzeć na to, czego używasz - woocommerce_related_products()- aby zrobić to, co zrobiłeś do tej pory.

Po drugie , musisz zrozumieć, ponieważ w przeciwnym razie nie będziesz w stanie zadać pytania punktowego, które absolutnie powinno być twoim celem, aby upewnić się, że otrzymujesz odpowiedź. Poza tym musisz pamiętać, że Wordpress Development ma swój podstawowy zakres na pytania związane z rdzeniem Wordpress - jeśli jesteś zainteresowany, jest to dyskutowane na temat Wordpress Development Meta , jednym konkretnym tematem są Nasze wooes i przyszłość wtyczek platform na WPSE . Jeśli więc zadajesz pytania dotyczące wtyczek, takich jak woocommerce, powinieneś je rozbić, aby były jak najbardziej powiązane z podstawowymi funkcjami - patrz następny punkt - ponieważ nie możesz oczekiwać, że ludzie będą znać każdy szczegół każdej wtyczki używam.

Po trzecie , przejdźmy teraz do głębszego wglądu w to, co się dzieje. Jak powiedziałeś, używasz woocommerce_related_products()teraz. Jeśli spojrzysz na źródło, zobaczysz, że ta funkcja korzysta woocommerce_get_template()z related.phpszablonu. woocommerce_get_template()ponownie używa woocommerce_locate_template()do zlokalizowania szablonu, ten drugi robi to, korzystając z podstawowej funkcji wordpress locate_template().
Teraz istnieje połączenie z powrotem do rdzenia, co prowadzi do uświadomienia sobie, że wyżej wymienione - i miejmy nadzieję, sprawdzone - funkcje woocommerce są zasadniczo opakowaniami, aby rozszerzyć funkcjonalność rdzenia. Kolejną rzeczą, która stała się jasna dzięki analizie zależności funkcjonalności, jest to, co powiedziałem wcześniej, że potrzebujesz innego podejścia do osiągnięcia swojego celu, ponieważ woocommerce_related_products()- teraz niewątpliwie oczywiste - nie jest poprawne.
Jeśli zastosowałeś się do moich wyjaśnień i dokładnie przeczytałeś do tej pory, zdałeś sobie sprawę, że related.phpzawiera to, czego szukasz. Mówię szczególnie o get_related()funkcji, która obejmuje woocommerce_product_related_postshak i korzysta z podstawowych funkcji wp_get_post_terms()i get_posts()- get_related()służy do uzyskania zestawu identyfikatorów. Dodatkowo znajduje się woocommerce_related_products_argshaczyk, który może być użyty do zmiany Argumenty related Products kwerendy wewnątrz related.php, WP_Querysłuży do tego. Zapytanie wykorzystuje wynikowe identyfikatory z get_related()wywołania.
Myślę, że masz wszystko pod ręką, aby rozwiązać swój problem. W rzeczywistości znacznie więcej, daje to prawie pełny przegląd tego, jak dostosować powiązane produkty. Nie wspominałem o każdej sprawdzonej funkcjonalności - funkcji i / lub podpięciu kodu źródłowego, ale zdecydowanie wszystkie ważne. Teraz powinno być bardziej zrozumiałe, w jaki sposób powiązaną funkcjonalność produktów woocommerce można prześledzić z powrotem do podstawowych funkcji wordpress.

Po czwarte , przychodzę do, gdzie powinieneś zastosować swoje dostosowania i o co powinieneś poprosić. Na przykład tak:

Woocommerce ma woocommerce_product_related_postshaczyk umożliwiający dostosowanie get_posts()połączenia w celu ustalenia powiązanych produktów.

Kod:

        // 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
                        )
                )
        ) ) );

Jak mogę to dostosować, aby osiągnąć swój cel? Który ma pokazywać pokrewne produkty, które należą do tej samej kategorii produktów - product_cat- i mają takie same znaczniki - product_tag- jak pokazany pojedynczy produkt.

Bez konkluzji - przynajmniej jeśli nie spodziewałeś się, że otrzymasz kompletny i gotowy kod - odpowiedź, pierwszą rzeczą, którą prawdopodobnie powinieneś zrobić, to zmienić tax_queryparametr relationz ORna AND.





Uwagi:

  • Uczyniłem to dłuższą opisową odpowiedzią, mając na uwadze powyższą powiązaną trwającą dyskusję
  • Mam nadzieję, że nie masz nic przeciwko temu, że jest to nie tylko odpowiedź na twoje pytanie, ale dodatkowo służy realizacji ogólnego celu edukacyjnego
  • jest to niesprawdzone , ponieważ nie ma rzeczywistego gotowego kodu
  • wreszcie, można przewidzieć, że wraz z wydaniem woocoomerce 2.1 zostaną wprowadzone znaczące zmiany w kodzie, nie zapominając o tym, ale na razie od 2.0.19 powyższy kod jest ważny



Edytować:

Naprawdę nie powinieneś bezpośrednio edytować (wtyczki) podstawowych klas. Jest to problematyczne, ponieważ musisz ponownie zachować zmiany w aktualizacjach, ponieważ podstawowe pliki zostaną zaktualizowane i nadpisane, jeśli je wykonasz. Zwłaszcza jeśli jest to łatwe do uniknięcia, tak jak w tym przypadku, poniższy kod i tak robi to, co zamierzałeś zrobić, czyli wdrażanie tej zmiany za pośrednictwem twojego functions.php.

Kod:

    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;
    }



W przypadku WooCommerce w wersji 2.1.0 i wyższych powyższy hak nie będzie działał, ponieważ już nie istnieje, więc odpowiedź jest dostępna do wersji 2.0.20. Ale @NathanPowell odkrył fajną odpowiedź na StackOverflow dotyczącą wersji v2.1.0 na dostępne i do dostosowywania powiązanych produktów użyteczny zestaw haków .

Nicolai
źródło
Bardzo dziękuję @ialocin za szybką i szczegółową odpowiedź. Jako środek tymczasowy, po prostu zmieniła ORsię ANDw moim wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phppliku i wkrótce zmienić to być zrobione od wewnątrz functions.phppliku. Jeszcze raz dziękuję.
user1752759,
@ user1752759 Zobacz moją edycję, aby to zrobić przezfunctions.php
Nicolai,
Idealna odpowiedź! Powinien być używany w każdym przewodniku na temat zrozumienia wtyczek i rozszerzenia ich na twoje potrzeby. Nie jestem pewien, czy te książki istnieją ... Ale nadal :)
ThdK
@ThdK Dzięki, nie wiem, czy to jest tak dobre, ale po przeczytaniu go po raz pierwszy od momentu napisania wciąż jestem zadowolony z odpowiedzi, poza tym z pewnością doceniam komplement, zawsze miło to słyszeć :) próbowałeś tego z WC 2.1.x?
Nicolai
Cześć, @ialocin. W edytowanej wersji na dole brakuje kilku nawiasów zamykających i niestety nie działa już jako rozwiązanie w wersji 2.1.8. Jeśli to nie jest zbyt trudne, proszę zaktualizuj to dla mnie?
user1752759
2

Nie oszukujmy się tutaj, chłopaki. Przyjęta odpowiedź doprowadziła tylko użytkownika do jego celu.

Pierwszy problem leży tutaj:

<?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);

Akcja jest usuwana, a następnie umieszczana w DOKŁADNEJ pozycji, z której została usunięta. Cel jest całkowicie niejasny.

Natrafiłem na to podczas wyszukiwania powiązanych produktów, ponieważ nie rozumiałem, że TAGI i KATEGORIE są motorem woocommerce_output_related_productstej wtyczki.

Najlepsza odpowiedź na to pytanie to następujący link, który ma wszystko wspólnego z woocommerce_output_related_products_args()filtrem: /programming/23554993/output-posts-relating-to-the-tags

Nathan Powell
źródło
To jest właściwie dość zabawne. Dlaczego możesz zapytać, ponieważ jeśli dokładnie przeczytałeś moją odpowiedź, to zobaczyłbyś, że używa tylko jednego filtra. Mówiąc dokładniej, jedyny dostępny filtr w tym czasie, ale wiedziałbyś o tym, gdybyś rzeczywiście przeczytał to, co napisałem i poświęciłby czas na sprawdzenie plików źródłowych różnych wersji. Tylko mówię. Poza tym odpowiedź, którą połączyłeś, bardzo dobrze wyjaśnia nowe dostępne haki sine v2.1.
Nicolai
Przepraszam za to, że była późna noc. Miałem nadzieję wyjaśnić trochę na temat oczywistej wady kodu w OP.
Nathan Powell
Bez obaw, ale czułem, że muszę coś powiedzieć.
Nicolai
Twój link referencyjny zadziałał dla mnie, Nathan, dzięki, próbowałem zrobić to dla siebie już 2 godziny. Teraz wiem, jak prawidłowo stosować filtry :)
marcovega