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