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.php
szablonu. 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.php
zawiera to, czego szukasz. Mówię szczególnie o get_related()
funkcji, która obejmuje woocommerce_product_related_posts
hak 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_args
haczyk, który może być użyty do zmiany Argumenty related Products kwerendy wewnątrz related.php
, WP_Query
sł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_posts
haczyk 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_query
parametr relation
z OR
na 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 .
OR
sięAND
w moimwp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
pliku i wkrótce zmienić to być zrobione od wewnątrzfunctions.php
pliku. Jeszcze raz dziękuję.functions.php
Nie oszukujmy się tutaj, chłopaki. Przyjęta odpowiedź doprowadziła tylko użytkownika do jego celu.
Pierwszy problem leży tutaj:
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_products
tej 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źródło