WooCommerce связанные товары по 2 таксономиям

Вопрос или проблема

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

У меня есть 2 таксономии: product_tag и product_cat. Иногда в product_tag товаров бывает не больше 4, поэтому мне нужно использовать другую таксономию для добавления еще 4 товаров в связанные товары.

Итак, мне нужно 4 связанных товара. Если в product_tag есть все 4, то ничего не нужно, если нет – используйте product_cat для выполнения 4 товаров.

Любая помощь будет очень кстати.

<?php
    // получаем термины таксономии пользовательского пост-тип
    $related_category = wp_get_object_terms( $post->ID, 'product_cat', array('fields' => 'ids') );
    $related_tag = wp_get_object_terms( $post->ID, 'product_tag', array('fields' => 'ids') );
    // аргументы
    $args = array(
    'post_type' => 'product',
    'post_status' => 'publish',
    'posts_per_page' => 4, // вы можете изменить это число
    'orderby' => 'rand',
    'tax_query' => array(
        array(
            'taxonomy' => 'product_tag',
            'field' => 'id',
            'terms' => $related_tag
        )
    ),
    'post__not_in' => array ($post->ID),
    );
    $related_items = new WP_Query( $args );
    // цикл по запросу
    if ($related_items->have_posts()) :
    while ( $related_items->have_posts() ) : $related_items->the_post();
    ?>
    <div class="related_item">
      <div class="Related_image">
        <a href="https://wordpress.stackexchange.com/questions/307112/<?php the_permalink() ?>"><?php the_post_thumbnail('thumbnail'); ?></a>
      </div>
        <div class="Related_title">
          <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><h2>

        </div>
      </div>
    <?php
    endwhile;
    endif;
    // Сбрасываем данные поста
    wp_reset_postdata();
    ?>

Я думаю, я сделал это. Если этот код неправильный или его можно упростить, просто исправьте его. Я хочу получить 5 товаров. Поэтому все они должны быть из product_tag, если это возможно. Если нет, используйте product_cat. Поэтому я объединил 2 аргумента здесь:

<?php
        // получаем термины таксономии пользовательского пост-тип
        $related_tag = wp_get_object_terms( $post->ID, 'product_tag', array('fields' => 'ids'));
        $related_cat = wp_get_object_terms( $post->ID, 'product_cat', array('fields' => 'ids'));


        // аргументы 1
        $args1 = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'posts_per_page' => 5,
        'orderby' => '',

        'tax_query' => array(

            array(

                'taxonomy'     => 'product_tag',
                'field'        => 'id',
                'terms'        =>  $related_tag,
            ),

        ),
        'post__not_in' => array ($post->ID),
         );
        // аргументы 2
        $args2 = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'posts_per_page' => 5,
        'orderby' => 'rand',

        'tax_query' => array(

            array(

                'taxonomy'     => 'product_cat',
                'field'        => 'id',
                'terms'        =>  $related_cat,
            ),

        ),
        'post__not_in' => array ($post->ID),

        );

        $related_items1 = new WP_Query( $args1 );
        $related_items2 = new WP_Query( $args2 );
        $related_items = new WP_Query();
        $related_items->posts = array_merge( $related_items1->posts, $related_items2->posts );

        $related_items3->post_count=5 - $related_items1->post_count;

        $related_items->post_count = $related_items1->post_count + $related_items3->post_count;


        // цикл по запросу
        if ($related_items->have_posts()) :
        while ( $related_items->have_posts() ) : $related_items->the_post();
        ?>
        <div class="related_item">
          <div class="Related_image">
            <a href="https://wordpress.stackexchange.com/questions/307112/<?php the_permalink() ?>"><?php the_post_thumbnail('thumbnail'); ?></a>
          </div>
            <div class="Related_title">
              <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><h2>

            </div>
          </div>
        <?php
        endwhile;
        endif;
        // Сбрасываем данные поста
        wp_reset_postdata();
        ?>

Ответ или решение

Чтобы изменить вывод связанных продуктов в WooCommerce по двум таксономиям (например, product_tag и product_cat), вам необходимо выполнить несколько шагов. Мы хотим отобразить до 5 связанных товаров, в первую очередь опираясь на таксономию тегов. Если продуктов по тегам недостаточно, вы сможете дополнить результат товарами по категории.

Подход

  1. Получить термины таксономий: Мы будем использовать функции для получения ID тегов и категорий, связанных с текущим продуктом.
  2. Создать два запроса: Первый запрос будет искать продукты по тегам, а второй – по категориям.
  3. Объединить результаты: Если первый запрос вернет менее 5 товаров, мы дополнительно извлечем товары из второго запроса, чтобы суммарно получить 5.
  4. Вывести список связанных товаров: Выведем изображения и заголовки товаров в HTML.

Пример кода

Вот пример реализации, который соответствует описанным требованиям:

<?php
// Получаем таксономии продукта
$related_tag = wp_get_object_terms($post->ID, 'product_tag', array('fields' => 'ids'));
$related_cat = wp_get_object_terms($post->ID, 'product_cat', array('fields' => 'ids'));

// Запрос по тегам
$args1 = array(
    'post_type' => 'product',
    'post_status' => 'publish',
    'posts_per_page' => 5, // Максимум 5 товаров
    'orderby' => 'rand',
    'tax_query' => array(
        array(
            'taxonomy' => 'product_tag',
            'field' => 'id',
            'terms' => $related_tag,
        ),
    ),
    'post__not_in' => array($post->ID),
);

$related_items1 = new WP_Query($args1);

// Запрос по категориям (только если нужно больше товаров)
$args2 = array(
    'post_type' => 'product',
    'post_status' => 'publish',
    'posts_per_page' => 5 - $related_items1->post_count, // Дополняем до 5
    'orderby' => 'rand',
    'tax_query' => array(
        array(
            'taxonomy' => 'product_cat',
            'field' => 'id',
            'terms' => $related_cat,
        ),
    ),
    'post__not_in' => array($post->ID),
);

// Получаем товары по категориям
$related_items2 = new WP_Query($args2);

// Объединяем результаты
$related_items = new WP_Query();
$related_items->posts = array_merge($related_items1->posts, $related_items2->posts);
$related_items->post_count = count($related_items->posts);

// Вывод связанных товаров
if ($related_items->have_posts()) :
    while ($related_items->have_posts()) : $related_items->the_post(); ?>
        <div class="related_item">
            <div class="related_image">
                <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a>
            </div>
            <div class="related_title">
                <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            </div>
        </div>
    <?php endwhile;
endif;

// Сбрасываем информацию о постах
wp_reset_postdata();
?>

Описание кода

  • Получение таксономий: Используем wp_get_object_terms для получения ID тегов и категорий, связанных с текущим продуктом.
  • Первичный запрос: Выполняем запрос для получения связанных продуктов по тегам. Параметр posts_per_page установлен на 5, чтобы не превышать лимит.
  • Дополнительный запрос: Если по тегам недостаточно товаров, выполняем следующий запрос на основе категорий, где также ограничиваем количество к возвращаемым товарам так, чтобы сумма не превышала 5.
  • Объединение результатов: С помощью array_merge объединяем массивы товаров из обоих запросов.
  • Вывод: Итоговый массив товаров выводим с помощью стандартного цикла while, отображая каждую запись с изображением и заголовком.

Заключение

Этот подход обеспечивает гибкость в отображении связанных товаров, обращая внимание на пользовательский опыт. Убедитесь, что вы протестировали код на своей локальной среде или сайте перед развертыванием изменений на продакшене. Оптимизация под SEO обеспечивается с использованием правильных заголовков и ссылок, что позволит улучшить видимость ваших продуктов в сети.

Оцените материал
Добавить комментарий

Капча загружается...