Intereting Posts
Значение echo menu_order в моей теме Какой фильтр использовать для предварительного анализа элементов формы, которые генерируются с помощью короткого кода плагина? Общий кэш W3 – белый экран смерти при попытке показать определенные таксономии гравитационные формы: используйте предыдущий выпадающий выбор как переменную в gform_pre_render? Создание сайта каталога подкастов – как разрешить пользователю загружать «большие» файлы? call_user_func_array () ожидает, что параметр 1 будет действительным обратным вызовом, массив должен иметь ровно два члена Результаты поиска показывают другой сайт 'ajaxurl' не определен – wp-includes / js / wp-lists.js Как настроить WordPress, чтобы иметь возможность использовать тег <script> внутри сообщений? сделать другой шаблон на последних шести опубликованных публикациях Используйте wp_list_categories для отображения родительских категорий с фактического срока Есть ли верхний предел для количества сообщений, которые могут быть созданы с помощью wordpress Неверная ошибка плагина Constant Contact вызывать строку / функцию из базы данных $ wpdb выбрать диапазон дат сообщений

Как выбрать продукты WooCommerce by post_meta и заказать их

Я использую следующий код для выбора продуктов со следующими post_metas:

_product_new, _product_almost_new, _product_old

add_action( 'woocommerce_product_query', 'custom_vtp_shop_order' ); function custom_vtp_shop_order($q){ if ( ! $q->is_main_query() ) return; if (! is_admin() && (is_shop() || is_archive) ) { $q->set( 'tax_query', array(array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => array( 'Sold', 'Service' ), 'operator' => 'NOT IN' ))); $q->set('meta_query', array(array( 'relation' => 'OR', 'product_new' => array( 'key' => '_product_new', 'value' => '1', ), 'product_almost_new' => array( 'key' => '_product_almost_new', 'value' => '1', ), 'product_old' => array( 'key' => '_product_old', 'value' => '1', ) ))); /*THIS HAS NO EFFECT*/ $q->set('orderby', array(array( 'product_new' => 'DESC', 'product_old' => 'DESC', 'product_almost_new' => 'DESC', ) )); } } 

Я хочу, чтобы продукты затем отображались в следующем порядке:

  1. PRODUCT_NEW
  2. product_old
  3. product_almost_new

Я использую $ q-> set ('orderby', array (……), но это не имеет никакого эффекта. Мои продукты ВСЕГДА заказываются product_old, product_almost_new, product_new.

Любые идеи, почему мой «порядок» не работает? Заранее благодарю за любую помощь!

Solutions Collecting From Web of "Как выбрать продукты WooCommerce by post_meta и заказать их"

С WP_Query можно отсортировать только по одному мета-значению, установив аргумент meta_key к какому ключу вы хотите сортировать, и meta_value по meta_value (или meta_value_num если значение должно сортироваться численно).

Вот как выглядят аргументы:

 $args = array( 'meta_key' => '_product_new', 'orderby' => 'meta_value_num', 'meta_query' = array( 'relation' => 'OR', array( 'key' => '_product_new', 'value' => '1', ), array( 'key' => '_product_almost_new', 'value' => '1', ), array( 'key' => '_product_old', 'value' => '1', ) ) ); 

Это запросит все сообщения, которые имеют _product_new , _product_almost_new или _product_old , и закажите их так, чтобы те, у которых _product_new , были сверху или снизу (в зависимости от order ).

Проблема в том, что это будет сортироваться только по одному мета-значению _product_new и игнорировать остальные. Но это всего лишь ограничение WP_Query . Невозможно отсортировать результаты по нескольким значениям мета.

Потенциальное решение состоит в том, чтобы иметь один мета-ключ, скажем _product_age , и установить его на числовое значение, представляющее каждое из состояний, которое вы хотите отсортировать. Поэтому вместо того, чтобы _product_new в качестве логического значения, установите _product_age в 1 вместо _product_almost_new , установите _product_age в 3 , а вместо _product_old установите _product_age 2 .

Затем вы можете использовать эти аргументы для сортировки так, как вы хотите;

 $args = array( 'meta_key' => '_product_age', 'orderby' => 'meta_value_num', 'order' => 'ASC', 'meta_query' = array( array( 'key' => '_product_age', 'value' => array( 1, 2, 3 ), 'compare' => 'IN', ), ) );