2017-01-08 11 views
0

Я создаю сайт для театральной компании, и я создаю индекс всех прошлых, текущих и будущих постановок. Я хотел бы, чтобы индекс «заказывал» конечную дату каждого выпуска (тип поля «дата» ACF; «end_date»).Как я могу запрашивать сообщения и использовать атрибут orderby для заказов в цикле в соответствии с датой meta_value?

Вот пример моего запроса:

<?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', 
); 
?> 

Независимо от того, что я пытаюсь, сообщения отказываются заказать themselevs по meta_value, а вместо этого закажите себя по умолчанию, укажите дату.

Уверен, что я пропустил что-то простое.

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

ответ

0

Вы можете spicify тип данных в orderby ключе, как meta_value_* Возможные значения: 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'ПОДПИСАННОЙ', ' 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 если у вас есть дата в другом формате, то вы должны создать свой собственный функциональный фильтр крюк to 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

Дайте ему попробовать. Проблема сохраняется. :( Любые другие идеи? –

+0

Какой формат даты вы используете? Является ли это «ГГГГ-ММ-ДД»? –

+0

У меня есть возвращающее YYYYMMDD, чтобы оно получилось как 8-значное число.т.е. с 1 января 2017 года возвращается: 20170101. –