По-перше , ви не можете відразу досягти поставленої мети за допомогою коду, який ви вказали у своєму запитанні. Щоб зрозуміти, чому немає прямого підходу до цього коду, вам слід поглянути на те, що ви використовуєте - woocommerce_related_products()
- щоб зробити те, що ви робили до цього часу.
По-друге , ви повинні зрозуміти, бо в іншому випадку ви не можете задати точне питання, яке абсолютно повинно бути вашою метою, щоб переконатися, що ви отримаєте відповідь. Крім того, ви повинні мати на увазі, що Wordpress Development має свою основну сферу роботи щодо основних питань, що стосуються Wordpress - якщо вас цікавить, це обговорюється в Wordpress Development Meta , однією з конкретних тем є Наші питання та майбутнє плагінів платформи на WPSE . Отже, якщо ви ставите запитання щодо плагінів, як-от woocommerce, вам слід розбити його, щоб зробити його максимально пов’язаним із основними функціями - див. Наступний пункт - так як ви не можете очікувати, що люди будуть знати кожну деталь кожного плагіну, який ви використовую.
По-третє , тепер давайте глибше зрозуміти, що відбувається. Як ви сказали, ви зараз використовуєте woocommerce_related_products()
. Якщо ви подивитесь на джерело, ви побачите, що ця функція використовується woocommerce_get_template()
для отримання related.php
шаблону. woocommerce_get_template()
знову використовує woocommerce_locate_template()
для пошуку шаблону, останній робить це, використовуючи основну функцію wordpress locate_template()
.
Тепер існує з'єднання назад до основного, що призводить до усвідомлення того, що вищезгадані - і, сподіваємось, перевірені - функції комерційної торгівлі, по суті, є обгортками для розширення функціональності основної роботи. Ще одна річ, яка стала зрозумілою при аналізі функціональних залежностей - це те, що я говорив раніше, для досягнення поставленої мети вам потрібен інший підхід, тому що woocommerce_related_products()
- зараз це безперечно очевидно - не є правильним.
Якщо ви слідували за мною за моїми поясненнями і до цього часу досконально читали, ви зрозуміли, що related.php
містить те, що ви шукаєте. Я особливо говорю про get_related()
функцію, яка включає woocommerce_product_related_posts
гачок і використовує основні функції wp_get_post_terms()
і get_posts()
- get_related()
використовується для отримання набору ідентифікаторів. Крім того , є woocommerce_related_products_args
гак, який може бути використаний , щоб змінити аргументи супутніх продукти запиту , всередині related.php
, WP_Query
для цього використовуються. У запиті використовуються отримані ідентифікатори від get_related()
виклику.
Я думаю, у вас зараз все під рукою, щоб вирішити свою проблему. Насправді набагато більше, це дає майже повний огляд того, як налаштувати пов’язані продукти. Я не згадував про всі перевірені функціональні можливості - функції та / або гачок вихідного коду, але, безумовно, всі важливі. Тепер має бути зрозумілішим, як функціональні можливості супутніх комерційних товарів можна простежити до основних функцій Wordpress.
По-четверте , я заходжу, де ви повинні застосувати свої налаштування та що ви повинні попросити. Наприклад так:
Woocommerce має woocommerce_product_related_posts
гачок, щоб налаштувати get_posts()
виклик для визначення супутніх товарів.
Код:
// 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
)
)
) ) );
Як я можу налаштувати це для досягнення своєї мети? Що означає показувати супутні товари, що належать до тієї ж категорії товарів - product_cat
- і мають ті самі теги - product_tag
-, що й окремий продукт.
Не даючи вам висновку - принаймні ні, якщо ви очікували отримати повний і готовий код - відповідь, перше, що ви, ймовірно, повинні зробити, - це змінити tax_query
параметр relation
з OR
на AND
.
Примітки:
- Я зробив це більш детальною описовою відповіддю, маючи на увазі вищезазначене постійне обговорення
- Сподіваюся, ви не заперечуєте, що це не лише відповідь на ваше запитання, але й додатково прагне досягти загальноосвітньої мети
- це не перевірено , оскільки немає фактично готового коду
- І останнє, але не менш важливо, передбачувано, що з випуском woocoomerce 2.1 будуть внесені деякі суттєві зміни коду, маючи це на увазі, але наразі станом на 2.0.19 наведений вище код є дійсним
Редагувати:
Ви дійсно не повинні редагувати (плагіни) основні класи безпосередньо. Це проблематично, тому що вам доведеться знову підтримувати зміни в оновленнях, оскільки основні файли оновлюються та перезаписуються, якщо ви їх виконуєте. Особливо, якщо це легко уникнути, як у цьому випадку, нижче код робить те, що ви мали намір робити у будь-якому випадку, тобто здійснюючи цю зміну через ваш functions.php
.
Код:
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;
}
Для версії WooCommerce версії 2.1.0 і вище, вищезгаданий гак не працюватиме, оскільки він більше не існує, тому відповідь можна використовувати до версії 2.0.20. Але @NathanPowell виявив приємну відповідь на StackOverflow щодо наявної версії від v2.1.0 та для налаштування відповідного набору гачків .
OR
щобAND
в моємуwp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
файлі і незабаром часу змінити це зробити всерединіfunctions.php
файлу. Ще раз дякую вам.