Во-первых , вы не можете сразу достичь цели, которую вы описали, с помощью кода, который вы показываете в своем вопросе. Чтобы понять, почему нет прямого подхода к этому коду, нужно взглянуть на то, что вы используете 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 по сути являются обертками для расширения основных функций. Еще одна вещь, которая стала ясной из анализа функциональных зависимостей, состоит в том, что, как я уже говорил, вам нужен другой подход для достижения вашей цели, потому что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()
вызова.
Я думаю, у вас есть все под рукой, чтобы решить вашу проблему. Более того, это дает почти полный обзор того, как настроить соответствующие продукты. Я не упомянул все проверенные функции - функции и / или подключения к исходному коду, но определенно все важные. Теперь должно быть понятнее, как функциональность связанных продуктов woocommerce может быть прослежена до основных функций 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
файла. Еще раз спасибо.