Вопрос или проблема
Я работаю над проектом, который показывает некоторые поездки (в зависимости от категории назначения). Я пытаюсь отсортировать поездки по дате начала (var_confirmed_date), но результат такой же, как будто сортировки нет.
Вот мой запрос:
`$args = array(
'posts_per_page' => -1,
'post_type' => 'product',
'meta_value' => 'meta_value',
'meta_key' => 'var_confirmed_date',
'order' => 'ASC',
'meta_type' => 'DATE',
'tax_query' => array(
array(
'taxonomy' => 'destination',
'field' => 'id',
'terms' => array($t_id)
)
),
'meta_query' => array(
array(
'key' => 'var_confirmed_date',
'value' => date("Y-m-d",time()),
'compare' => '>=',
'type' => 'DATE',
),
),
);
$loop = new WP_Query( $args );`
Есть идеи, как сделать это правильно?
Спасибо.
Попробуйте это
$args = array(
'posts_per_page' => -1,
'post_type' => 'product',
'meta_key' => 'var_confirmed_date',
'meta_type' => 'DATE',
'orderby' => 'meta_value_date',
'order' => 'ASC',
'tax_query' => array(
array(
'taxonomy' => 'destination',
'field' => 'id',
'terms' => array($t_id)
)
),
'meta_query' => array(
array(
'key' => 'var_confirmed_date',
'value' => date("Y-m-d",time()),
'compare' => '>=',
'type' => 'DATE',
),
),
);
$loop = new WP_Query( $args );
Я нашел решение на StackExchange (WooCommerce: фильтрация по таксономии родительского продукта и метаданным вариаций продукта)
Я использую функцию в child function.php, затем сортирую по $t_id и ID, найденному с помощью функции
Ответ или решение
Кастомный запрос продуктов WooCommerce: решение проблемы сортировки
В рамках вашего проекта, где необходимо отображение путешествий в зависимости от категории назначения, возникла задача сортировки продуктов по дате начала (метаданные var_confirmed_date
). Ниже представлено решение проблемы, которое поможет вам достичь желаемого результата.
Анализ текущего запроса
На первый взгляд, в вашем первоначальном запросе есть несколько проблем, которые могут привести к отсутствию правильной сортировки:
- Использование
meta_value
иmeta_key
одновременно — это не требуется.meta_value
следует удалить, так как оно не используется для сортировки. - Необходимо корректно настроить
orderby
— нужно указать, что сортировка будет выполняться по метадатам, а не по обычным записям.
Исправленный запрос
Ваш исправленный запрос должен выглядеть следующим образом:
$args = array(
'posts_per_page' => -1,
'post_type' => 'product',
'meta_key' => 'var_confirmed_date',
'orderby' => 'meta_value',
'order' => 'ASC',
'tax_query' => array(
array(
'taxonomy' => 'destination',
'field' => 'id',
'terms' => array($t_id)
)
),
'meta_query' => array(
array(
'key' => 'var_confirmed_date',
'value' => date("Y-m-d"),
'compare' => '>=',
'type' => 'DATE',
),
),
);
$loop = new WP_Query($args);
Ключевые изменения:
- Убрано лишнее ключевое слово
meta_value
. Вместо этого теперь указаноorderby
сmeta_value
, чтобы правильно провести сортировку. - Убедитесь, что атрибут
meta_type
больше не используется, так как это приведет к возможной ошибке. - Игнорируя внутренние метаданные WooCommerce, мы сосредоточились на корректной работе с временными метаданными.
Дополнительные улучшения
Если вам необходимо осуществлять фильтрацию по иерархии продуктов (например, родительские и дочерние продукты), вам может понадобиться создать специальную пользовательскую функцию в functions.php
вашей темы. Это позволит дополнительно фильтровать запросы продуктов по их базовым категориям и метаданным.
Использование пользовательских функций
Вот пример функции, которую вы можете использовать:
function custom_product_filter($query) {
if (!is_admin() && $query->is_main_query() && is_post_type_archive('product')) {
$query->set('meta_key', 'var_confirmed_date');
$query->set('orderby', 'meta_value');
$query->set('order', 'ASC');
// Дополнительные параметры фильтрации могут быть добавлены здесь
}
}
add_action('pre_get_posts', 'custom_product_filter');
Эта функция настраивает ваш запрос на архивах продуктов, добавляя необходимые параметры сортировки.
Заключение
С помощью предложенных решений вы сможете корректно отсортировать товары в WooCommerce по дате начала. Чтобы исключить возможные ошибки, рекомендуется тщательно протестировать функциональность при каждом изменении. Это обеспечит не только корректность работы, но и более высокую производительность вашего сайта.
Если возникнут дополнительные вопросы или потребуются уточнения, не стесняйтесь обращаться за помощью.