Как настроить продукты, связанные с woocommerce? [закрыто]

14

У меня есть следующие строки кода на моем веб-сайте, которые будут отображать соответствующие продукты в нижней части страницы моего отдельного продукта в WooCommerce ...

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

Поскольку он отображает 4 продукта, которые были классифицированы под одним и тем же именем, как бы я изменил выше, чтобы отобразить вместо них соответствующие теги ?

Например, у меня есть категория продуктов под названием «Автомобильный», и в этой категории есть несколько тегов - «Холден», «Форд», «Тойота», «Ниссан» и т. Д.

Я бы хотел, чтобы внизу отображались 4 товара, связанные с тегом товара, который пользователь просматривает в данный момент.

user1752759
источник

Ответы:

29

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

Nicolai
источник
Большое спасибо @ialocin за быстрый и подробный ответ. В качестве временной меры, я просто изменил , ORчтобы ANDв моем wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phpфайле и в скором времени изменить это сделать внутри functions.phpфайла. Еще раз спасибо.
user1752759
@ user1752759 Смотрите мои изменения, чтобы сделать это черезfunctions.php
Николай
Идеальный ответ! Его следует использовать в любом руководстве о том, как понимать плагины и как их расширять для ваших нужд. Не уверен, что эти книги существуют, хотя .. Но все же :)
ThdK
@ThdK Спасибо, я не знаю, насколько это хорошо, но после прочтения этого в первый раз с момента написания, я все еще доволен ответом, кроме того, что я, конечно, ценю комплимент, всегда приятно слышать :) ты пробовал это с WC 2.1.x?
Николай
Привет @ialocin. В отредактированной версии внизу отсутствуют несколько заключительных скобок, и, к сожалению, она больше не работает в качестве решения в версии 2.1.8. Если это не так уж много проблем, не могли бы вы обновить это для меня?
user1752759
2

Давайте не будем обманывать себя здесь, ребята. Принятый ответ только привел пользователя к его цели.

Самая первая проблема лежит здесь:

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

Действие удаляется, а затем помещается в ТОЧНОЕ положение, из которого оно было удалено. Цель совершенно неясна.

Я наткнулся на это с поиском по сопутствующим продуктам, потому что я не понимал, что TAGS и CATEGORIES являются движущей силой woocommerce_output_related_productsфункции в этом плагине.

Лучший ответ на ЭТОТ вопрос - следующая ссылка, которая имеет все, что связано с woocommerce_output_related_products_args()фильтром: /programming/23554993/output-posts-relating-to-the-tags

Натан Пауэлл
источник
Это на самом деле довольно забавно. Почему вы можете спросить, потому что если вы внимательно прочитали мой ответ, то вы бы увидели, что он использует только один фильтр. Точнее говоря, единственный фильтр, доступный в то время, но вы бы знали об этом, если бы действительно прочитали то, что я написал, и потратили бы время на просмотр исходных файлов различных версий. Просто говорю. Кроме того, ответ, который вы связали, очень хорошо объясняет новые хуки, доступные в sine v2.1.
Николай
Извините, это был поздний вечер. Я надеялся немного объяснить очевидную ошибку в коде ОП.
Натан Пауэлл,
Не беспокойся, но чувствовал, что должен был что-то сказать.
Николай
Ссылка на меня сработала, Натан, спасибо, я пытался сделать это для себя 2 часа. Теперь я знаю, как правильно применять фильтры :)
marcovega