Я создаю веб-сайт для театральной компании, и я создаю индекс всех прошлых, текущих и будущих постановок. Я бы хотел, чтобы индекс ‘orderby’ указывал дату окончания каждого производства (ACF ‘тип поля’ date ‘;’ Окончание_даты ‘).
Вот пример моего запроса:
<?php
$futureProd = array(
'post_type' => 'productions',
'posts_per_page' => -1,
'meta_key' => 'ending_date',
'orderby' => 'meta_value',
'order' => 'ASC',
);
$slider_posts = new WP_Query($futureProd);
$array_rev = array_reverse($slider_posts->posts);
$slider_posts->posts = $array_rev;
?>
Также попробовали следующее, добавив альтернативы meta_value_date и meta_value_num:
<?php // query posts
$futureProd = array(
'post_type' => 'productions',
'posts_per_page' => -1,
'meta_key' => 'ending_date',
'orderby' => 'meta_value_date',
'order' => 'ASC',
);
?>
А ТАКЖЕ
<?php // query posts
$futureProd = array(
'post_type' => 'productions',
'posts_per_page' => -1,
'meta_key' => 'ending_date',
'orderby' => 'meta_value_num',
'order' => 'ASC',
);
?>
Независимо от того, что я пытаюсь сделать, посты отказываются упорядочивать их по мета-значению, а вместо этого предпочитают упорядочивать себя по умолчанию, по дате публикации.
Я уверен, что мне не хватает чего-то простого.
У кого-нибудь есть идеи?
Вы можете указать тип данных в
orderby
ключ какmeta_value_*
Возможные значения: «NUMERIC», «BINARY», «CHAR», «DATE», «DATETIME»,
«DECIMAL», «SIGNED», «TIME», «UNSIGNED».
Попробуй это,
$futureProd = array(
'post_type' => 'productions',
'posts_per_page' => -1,
'meta_key' => 'ending_date',
'orderby' => 'meta_value_date',
'order' => 'ASC',
);
$slider_posts = new WP_Query($futureProd);
Обратите внимание: для работы вышеуказанного кода необходимо указать дату в YYYY-MM-DD
Если у вас есть дата в другом формате, вы должны создать свою собственную функцию фильтра posts_orderby
фильтр с STR_TO_DATE
Функция MySQL
Для формата даты ГГГГММДД
Добавьте это в вашу активную тему function.php
файл вашей активной дочерней темы (или темы). Или также в любом файле плагина php.
function text_domain_posts_orderby($orderby, $query) {
//Only for custom orderby key
if ($query->get('orderby') != 'yyyymmdd_date_format')
return $orderby;
if (!( $order = $query->get('order') ))
$order = 'ASC';
global $wpdb;
$fieldName = $wpdb->postmeta . '.meta_value';
return "STR_TO_DATE(" . $fieldName . ", '%Y%m%d') " . $order;
}
add_filter('posts_orderby', 'text_domain_posts_orderby', 10, 2);
Итак, теперь ваш аргумент WP_Query должен выглядеть так:
$futureProd = array(
'post_type' => 'productions',
'posts_per_page' => -1,
'meta_key' => 'ending_date',
'orderby' => 'yyyymmdd_date_format', //added custom orderby key
'order' => 'ASC',
);
Код протестирован и полностью функционален.
Ссылка:
Надеюсь это поможет.
Других решений пока нет …