Короткий код продуктов Woocommerce специфичный порядок

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

Существует ли способ получить продукты в порядке ID, указанном в параметре шорткода:

например [products ids="53,68,1"]

Отобразить блок с 3 продуктами, где 53 на первом месте, 68 на втором…?

Сейчас я получаю продукты, отсортированные по SKU, имени и т.д. В зависимости от параметра сортировки, но мне нужен конкретный порядок.

     function woo_products( $atts ) {
         global $post;
         $product_Out="";
                $atts = shortcode_atts(
         array(
           'product_ids' => '',// ваш ID продукта здесь
         ), $atts, 'bartag' );
         $pro_ids = explode(",", $atts['product_ids']);
         foreach ($pro_ids as $key => $values) {
            $product_obj = $product = wc_get_product( $values );
            //вызовите ваш HTML и данные в переменной $product_out
            $product_Out .= '<div class="product_name">'.$values.'</div>';
         }
         return $product_Out;
     }
     add_shortcode( 'woo_products', 'woo_products' );
     //используйте этот шорткод [woo_products product_ids="9,86"]

Я знаю, что это старый пост, но недавно я столкнулся с той же проблемой, и с помощью этой темы pre_get_posts с WooCommerce Shortcode Query я наконец нашел решение. Просто добавьте этот фильтр в ваши функции:

add_filter( 'woocommerce_shortcode_products_query', 'woocommerce_shortcode_products_orderby' );
function woocommerce_shortcode_products_orderby( $args ) {
    $standard_array = array('menu_order','title','date','rand','id');

    if( isset( $args['orderby'] ) && !in_array( $args['orderby'], $standard_array ) ) {
    $args['orderby']  = 'post__in'; 
    }

    return $args;
}

Ответ B4rT имеет правильную идею, но нет необходимости писать дополнительный фильтр для этого. шорткод [products] в основном использует WP_Query, так что если вы установите порядок на post__in, он естественно отсортирует посты в порядке, в котором они переданы:

[products ids="53,68,1" orderby="post__in"]

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

Чтобы получить товары в специфическом порядке с использованием короткого кода WooCommerce, вам необходимо настроить параметры запроса в соответствии с необходимым порядком. В данном контексте мы рассмотрим, как можно использовать короткий код [products], чтобы отобразить товары по идентификаторам (IDs), сохраняя указанный порядок.

Решение задачи

Для достижения этой цели вы можете использовать параметр orderby с видом post__in, который позволяет упорядочить товары в соответствии с последовательностью их идентификаторов, указанной в атрибуте ids.

Вот пример использования короткого кода:

[products ids="53,68,1" orderby="post__in"]

Этот код выведет товары с идентификаторами 53, 68 и 1 в указанном вами порядке.

Подробная реализация

Если вам нужно добавить кастомные параметры или провести дополнительные манипуляции с выводом, вам может понадобиться модифицировать функцию, которая обрабатывает короткие коды. Вот пример такой настройки:

  1. Добавление фильтра для открытия возможности сортировки:
    Вам нужно использовать фильтр woocommerce_shortcode_products_query, который позволяет изменить параметры запроса.
add_filter('woocommerce_shortcode_products_query', 'custom_woocommerce_shortcode_products_orderby');

function custom_woocommerce_shortcode_products_orderby($args) {
    $standard_array = array('menu_order', 'title', 'date', 'rand', 'id');

    if (isset($args['orderby']) && !in_array($args['orderby'], $standard_array)) {
        $args['orderby'] = 'post__in'; 
    }

    return $args;
}
  1. Создание короткого кода для вывода товаров:
    Вы также можете создать свой собственный короткий код для выполнения более расширенных операций с товарами:
function woo_products_shortcode($atts) {
    $atts = shortcode_atts(array(
        'ids' => '', // Ваши ID продуктов
    ), $atts, 'woo_products');

    $product_ids = explode(',', $atts['ids']);
    $args = array(
        'post_type' => 'product',
        'post__in' => $product_ids,
        'orderby' => 'post__in',
        'posts_per_page' => -1, // Можно установить количество отображаемых товаров
    );

    $query = new WP_Query($args);
    $output = '';

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $output .= '<div class="product">' . get_the_title() . '</div>'; // Можно дополнить вывод необходимыми данными о продукте
        }
        wp_reset_postdata();
    }

    return $output;
}

add_shortcode('woo_products', 'woo_products_shortcode');

Резюме

Используя приведенные выше подходы, вы можете управлять порядком отображения продуктов в WooCommerce с помощью короткого кода. Атрибут orderby установленный на значение post__in позволит корректно выполнить сортировку товаров в соответствии с теми ID, которые вы указали в шорткоде.

Заключение

Таким образом, получите необходимую гибкость в отображении продуктов WooCommerce на вашем сайте. Вы можете интегрировать данные о продуктах с различными элементами дизайна, создавая индивидуальное пользовательское восприятие.

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

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