Изменение порядка записей ПОСЛЕ выполнения запроса в WordPress

3 апр. 2012 г., 06:59:14
Просмотры: 13.7K
Голосов: 6

Я вывожу последние 5 записей пользовательского типа 'show'.

Сейчас я получаю последнюю запись первой.

<?php
$args = array(
    'post_type' => 'show',               // Тип записи
    'posts_per_page' => 5,                // Количество записей
    'order' => 'DESC'                     // Порядок сортировки
    );
$home_shows = new WP_Query($args);        // Создаем запрос
var_dump($home_shows);                    // Выводим данные запроса
?>

Мне нужно, чтобы в полученном массиве самая ранняя запись (из последних 5 шоу) была первой, а самая последняя - последней.

Сейчас я получаю (дата шоу берется из произвольного поля):

11.03.12, 7.03.12, 4.03.12, 2.03.12, 30.02.12 и т.д.

А нужно: 30.02.12, 1.03.12, 4.03.12, 7.03.12, 11.03.12

Я пробовал использовать array_reverse (добавил в предыдущий код):

$reversed_shows = array_reverse( $home_shows->posts );  // Пытаемся развернуть массив

Но получил странные результаты (отображались совершенно другие части записи, порядок массива был нарушен).

Есть идеи?

0
Все ответы на вопрос 4
1

Я понял, в чём была моя ошибка. Обычная ошибка новичка.

Функция array_reverse работала правильно, но я не переназначал перевёрнутый массив обратно в WP_Query $home_shows, поэтому не видел изменений.

Вот решение и исправленный код.

<?php
                    $args = array(
                        'post_type' => 'show',
                        'posts_per_page' => 5,
                        'order' => 'DESC',
                    );
                    $home_shows = new WP_Query($args);
                    //переворачиваем порядок записей, чтобы последняя была в конце
                    $array_rev = array_reverse($home_shows->posts);
                    //переназначаем перевёрнутый массив записей обратно в объект $home_shows
                    $home_shows->posts = $array_rev;
                ?>
                <?php $captions = array(); ?>
                <?php if ( $home_shows->have_posts() ) : ?>         
                    <?php while ( $home_shows->have_posts() ) : $home_shows->the_post(); ?>

Спасибо за ответы, рад что разобрался с этой проблемой.

3 апр. 2012 г. 17:07:22
Комментарии

Не забудьте отметить ваш ответ как принятый!

Burgi Burgi
21 нояб. 2016 г. 13:39:16
3

Уберите весь беспорядок с пользовательскими полями и добавьте 'order' => 'ASC' в массив аргументов! И всё готово!

3 апр. 2012 г. 07:04:22
Комментарии

Какой ещё беспорядок с произвольными полями? Произвольный тип записи? Он необходим, так как на сайте есть несколько произвольных типов записей для организации контента. Я постараюсь лучше объяснить, что я имею в виду, через редактирование записи

Squadrons Squadrons
3 апр. 2012 г. 07:18:22

Извиняюсь за неправильный выбор слов. Произвольные поля доступны и для стандартных типов записей. Просто для произвольного типа записи вам нужен только 'post_type', который у вас уже есть. Верно ли, что вы хотите отображать последние записи первыми?

Rutwick Gangurde Rutwick Gangurde
3 апр. 2012 г. 07:27:40

это на самом деле не решает проблему, потому что если вы запрашиваете только 10 последних записей и используете сортировку ASC, вы получите 10 самых старых записей.

Jacob Raccuia Jacob Raccuia
27 июл. 2016 г. 02:42:36
5
    <?php
    $args = array(
        'post_type' => 'show',
        'posts_per_page' => 5,
        'order' => 'desc'
        );
    $home_shows = new WP_Query($args);
 //   var_dump($home_shows);

echo "<pre>";
print_r($home_shows->posts);
echo "</pre>";



$array_rev = array_reverse($home_shows->posts);
echo "<pre>";
print_r($array_rev);
echo "</pre>";
  ?>

Я попробовал вышеуказанный код для моего произвольного типа записей...

результаты ID записей: 240,239,238,237 для обратного порядка: 237,238,239,240

Должно быть что-то другое проблематично на вашей стороне......

3 апр. 2012 г. 09:28:58
Комментарии

По умолчанию параметр orderby установлен на дату!

Rutwick Gangurde Rutwick Gangurde
3 апр. 2012 г. 09:33:30

@RutwickGangurde отредактировал мой ответ...

Rajeev Vyas Rajeev Vyas
3 апр. 2012 г. 09:52:35

Зачем использовать reverse для массива? Просто измените порядок на ASC, и последние записи будут выводиться первыми.

Rutwick Gangurde Rutwick Gangurde
3 апр. 2012 г. 09:58:31

@RutwickGangurde Я думаю, вы не поняли его требования... он хочет получить последние 5 записей и отобразить их в таком порядке, чтобы из этих пяти записей сначала шла запись с самой ранней датой...

Rajeev Vyas Rajeev Vyas
3 апр. 2012 г. 10:03:56

Хорошо, не заметил этого раньше. Я только сейчас прочитал его уточнённый вопрос!

Rutwick Gangurde Rutwick Gangurde
3 апр. 2012 г. 10:15:04
0

Если вам нужно изменить порядок основного запроса, я рекомендую использовать следующий хук:

add_action('the_posts',function($posts,$query){
    
    // Проверяем, что это основной запрос
    if( $query->is_main_query() ){
        
        // Сортируем записи по дате изменения
        usort($posts,function ($a, $b) {
            
            return strtotime($b->post_modified) - strtotime($a->post_modified);
        });
    }
    
    return $posts;
    
},10,2);

В этом примере я сортирую записи по дате изменения (post_modified), но вы можете использовать другую логику.

31 янв. 2024 г. 04:58:43