Упорядочьте посты по более чем одной переменной (meta_key и дате И времени публикации).

Вопрос или проблема

На cascadeoc.org/results у меня есть результаты, отсортированные по пользовательскому полю “event_date_results”, что соответствует дате, когда произошло событие (а не дате публикации поста). Однако, когда есть несколько результатов за один день, я хотел бы дополнительно управлять порядком постов по дате и ВРЕМЕНИ публикации. Как я могу добавить этот второй фильтр orderby?

Вот что у меня есть:

<?php

    $query = new WP_Query( array(

        'post_type' => 'result',
        'posts_per_page' => 100,
        //'paged'          => $paged,
        'meta_key'   => 'event_date_results',
        'orderby'    => 'meta_value_num',
        'order'      => 'DESC',
        'meta_value'    => date('Ymd'),
        'meta_compare'  => '<',
        'date_query'    => array(
            array(
                    'key' => 'date',
                    'value' => date('Ymd'),
                    'compare' => '<', //less than
                    'type' => 'DATETIME'
                )
            ),

        ) );

    ?>

Я нашел эту ссылку о “более мощном ORDER BY в WordPress 4.0“, и это привело меня к попытке использовать этот код:

        <?php

    $query = new WP_Query( array(

        'post_type' => 'result',
        'posts_per_page' => 100,
        //'paged'          => $paged,
        'meta_key'   => 'event_date_results',
        'orderby'    => array( 'meta_value_num' => 'DESC', 'post_date' => 'DESC'),
        //'order'      => 'DESC',
        'meta_value'    => date('Ymd'),
        'meta_compare'  => '<',
        'date_query'    => array(
            array(
                    'key' => 'date',
                    'value' => date('Ymd'),
                    'compare' => '<', //less than
                    'type' => 'DATETIME'
                )
            ),

        ) );

    ?>

Строка ‘orderby’ — это единственное, что я изменил (и я закомментировал другую строку ‘DESC’, которую мог бы теперь удалить.)

…не обращайте внимания на мой закомментированный фрагмент ‘paged’… Я всё ещё разбираюсь, как реализовать пагинацию. 😉

Ответ или решение

Вопрос о сортировке записей в WordPress на основании нескольких переменных, таких как метаполе event_date_results, дата и время публикации, представляет собой интересную и частую задачу в веб-разработке. Это особенно актуально для проектов, где важен точный порядок вывода информации, например, в случае списка результатов событий на сайте cascadeoc.org/results.

Теория

В WordPress сортировка записей может осуществляться по различным критериям, которые определяются с помощью параметра orderby в классе WP_Query. Этот параметр позволяет задавать как одиночные, так и множественные условия сортировки. В нашем случае нам необходимо сортировать результаты по метаполю event_date_results, затем дополнительно применять сортировку по дате и времени публикации поста, чтобы у нас была возможность упорядочить записи с одинаковой датой события. Для этого используем возможности, появившиеся в WordPress 4.0, которые позволяют комбинировать несколько условий сортировки.

Пример

Ваш код для организации сортировки:

$query = new WP_Query( array(
    'post_type' => 'result',
    'posts_per_page' => 100,
    'meta_key' => 'event_date_results',
    'orderby' => array(
        'meta_value_num' => 'DESC',
        'post_date' => 'DESC'
    ),
    'meta_value' => date('Ymd'),
    'meta_compare' => '<',
    'date_query' => array(
        array(
            'key' => 'date',
            'value' => date('Ymd'),
            'compare' => '<',
            'type' => 'DATETIME'
        )
    ),
) );

Вы используете WP_Query для выборки записей с определённым типом result, устанавливаете количество записей на странице, и затем настраиваете сортировку с помощью параметра orderby. Сортировка по meta_value_num обрабатывает числовые значения вашего метаполя event_date_results, а сортировка по post_date отвечает за порядок по дате и времени публикации.

Применение

Чтобы применить данный подход в реальном проекте, нужно учесть несколько ключевых аспектов:

  1. Корректная структура метаполей: Убедитесь, что значения в вашем метаполе event_date_results хранятся в числовом формате, который может быть правильно интерпретирован в SQL-запросах, т.е., в формате Ymd (например, 20231021 для 21 октября 2023).

  2. Использование современных возможностей WordPress: Версия WordPress 4.0 и выше поддерживает использование массива в параметре orderby, что позволяет комбинировать несколько методов сортировки. Это особенно полезно, если необходимо выполнять точную сортировку по нескольким критериям.

  3. Тестирование на производительность: При использовании сложных запросов важно тестировать их на производительность, особенно когда количество записей большое. Убедитесь, что запросы возвращаются быстро и не нагружают сервер.

  4. Пагинация: Важно правильно настроить пагинацию, особенно если результатов много. В вашем коде уже указано возможное использование пагинации через $paged, но без полной реализации. Это нужно доработать, чтобы пользователи могли с лёгкостью перемещаться по страницам с результатами.

  5. Совместимость с плагинами и темами: Убедитесь, что ваше решение совместимо с установленными плагинами и используемой темой, чтобы избежать конфликтов, которые могут повлиять на работу вашего сайта.

  6. Обработка ошибок: Настройте обработку ошибок в случае, если ваш запрос будет возвращать пустой результат или столкнётся с проблемой выполнения. Это улучшит пользовательский опыт и упростит диагностику проблем.

Исходя из вышеизложенной теории и примера, ваша задача будет состоять в тщательном тестировании и возможной оптимизации кода, чтобы реализовать быструю и эффективную сортировку записей по заданным критериям. Рассмотрите возможность использования дополнительных инструментов кеширования результатов, если замечаете замедление работы сайта при увеличении объёмов данных.

Оцените материал
Добавить комментарий

Капча загружается...