Как я могу запрашивать посты и использовать атрибут orderby для упорядочивания постов в цикле по дате meta_value?

Я создаю веб-сайт для театральной компании, и я создаю индекс всех прошлых, текущих и будущих постановок. Я бы хотел, чтобы индекс ‘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',
);
?>

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

Я уверен, что мне не хватает чего-то простого.

У кого-нибудь есть идеи?

0

Решение

Вы можете указать тип данных в 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',
);

Код протестирован и полностью функционален.

Ссылка:

Надеюсь это поможет.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]