Запрос WP для отображения событий и пользовательского типа записи в заданном порядке

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

У меня есть следующие аргументы для загрузки событий и уведомлений из плагина The Events Calendar и зарегистрированного пользовательского типа записей в моей пользовательской теме. Запрос должен сначала загружать события с отмеченным флажком “Избранное”, затем обычные не избранные события, происходящие сегодня или в будущем, и, наконец, текущие и предстоящие уведомления. В настоящее время это не происходит. Уведомления отображаются первыми, а после них отображается только избранное событие.

Аргументы запроса

$args = array(
  'post_type' => array(
    'tribe_events',
    'notice',
  ),
  'post_status' => 'publish',
  'posts_per_page' => -1,
  'orderby' => array(
    '_tribe_featured' => 'DESC',
    '_EventStartDate' => 'ASC',
    'date' => 'DESC',
  ),
  'meta_query' => array(
    'relation' => 'OR',
    array(
      'relation' => 'AND',
      array(
        'key' => '_tribe_featured',
        'value' => '1',
        'compare' => '=',
      ),
      array(
        'key' => '_EventStartDate',
        'compare' => 'EXISTS',
      ),
    ),
    array(
      'relation' => 'AND',
      array(
        'key' => '_tribe_featured',
        'compare' => 'NOT EXISTS',
      ),
      array(
        'key' => '_EventStartDate',
        'value' => current_time('Y-m-d H:i:s'),
        'compare' => '>=',
        'type' => 'DATETIME',
      ),
    ),
    array(
      'relation' => 'AND',
      array(
        'key' => '_EventStartDate',
        'compare' => 'NOT EXISTS',
      ),
    ),
  ),
  'tax_query' => array(
    'relation' => 'OR',
    array(
      'taxonomy' => 'notice-type',
      'field' => 'term_id',
      'terms' => array( 48, 49, 50, 51, 60 ),
    ),
    array(
      'taxonomy' => 'tribe_events_cat',
      'field' => 'term_id',
      'terms' => array( 61, 62 ),
    ),
  ),
);

Есть идеи, почему это не работает так, как ожидалось?

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

Чтобы решить проблему с неправильным отображением событий и пользовательских типов записей в WordPress, необходимо более детально рассмотреть структуру и параметры вашего WP Query. Ваша задача — обеспечить правильный порядок вывода: сначала должны отображаться события с флажком "Featured", затем обычные события, которые происходят сегодня или в будущем, и в конце — текущие и предстоящие уведомления.

Теория

WP Query — это мощный инструмент в WordPress, позволяющий настраивать выборку записей на основе различных параметров. Используя его, можно настроить порядок отображения записей с помощью параметров orderby и meta_query. Однако, важно понимать, как использовать orderby с метаполями, так как это может повлиять на ожидаемый результат.

В вашем случае, приоритет должен быть задан следующим образом:

  1. Показывать события с установленным ‘_tribe_featured’ первыми.
  2. Показывать события, которые произойдут сегодня и в будущем.
  3. Выводить уведомления после всех событий.

Обращаем внимание на то, как вы упорядочиваете записи по метаполям (_tribe_featured, _EventStartDate). Проблема может заключаться в последовательности и логике этих параметров.

Пример

Рассмотрим, как должно быть настроено значение массива $args для достижения нужного результата:

$args = array(
  'post_type' => array(
    'tribe_events',
    'notice',
  ),
  'post_status' => 'publish',
  'posts_per_page' => -1,
  'meta_query' => array(
    'relation' => 'OR',
    // События с флажком 'Featured'
    array(
      'relation' => 'AND',
      array(
        'key' => '_tribe_featured',
        'value' => '1',
        'compare' => '=',
      ),
      array(
        'key' => '_EventStartDate',
        'compare' => 'EXISTS',
      ),
    ),
    // Обычные события
    array(
      'relation' => 'AND',
      array(
        'key' => '_tribe_featured',
        'compare' => 'NOT EXISTS',
      ),
      array(
        'key' => '_EventStartDate',
        'value' => current_time('Y-m-d H:i:s'),
        'compare' => '>=',
        'type' => 'DATETIME',
      ),
    ),
    // Уведомления
    array(
      'relation' => 'AND',
      array(
        'key' => '_EventStartDate',
        'compare' => 'NOT EXISTS',
      ),
    ),
  ),
  'orderby' => array(
    'meta_value' => 'DESC', // Указать для сортировки по метаполям 
    '_tribe_featured' => 'DESC',
    '_EventStartDate' => 'ASC',
  ),
  'tax_query' => array(
    'relation' => 'OR',
    array(
      'taxonomy' => 'notice-type',
      'field' => 'term_id',
      'terms' => array( 48, 49, 50, 51, 60 ),
    ),
    array(
      'taxonomy' => 'tribe_events_cat',
      'field' => 'term_id',
      'terms' => array( 61, 62 ),
    ),
  ),
);

Таким образом, ключевой момент заключается в правильной настройке параметров meta_query и orderby. Поле meta_value в orderby работает только если вы хотите указать по какому полю метаполя должна производиться сортировка. В вашем случае _tribe_featured должен стоять первым в списке для сортировки, чтобы в первую очередь отображались записи с установленным этим флагом.

Применение

Обратите внимание на правильную работу с мультимассивами в meta_query и sort_query. При построении объектов запросов, нужно убедиться, что orderby действительно учитывает все необходимые поля, особенно когда используются пользовательские поля (как в вашем случае _tribe_featured и _EventStartDate). Экспериментируйте с порядком аргументов, проверяйте результат и настройте их до нужного вам эффекта. Если результат по-прежнему не соответствует ожиданиям, может быть полезно использовать дополнительные хуки или фильтры для изменения поведения WP Query. Также рассмотрите возможность использования дополнительных механизмов, таких как использование фильтров pre_get_posts, если они более соответствуют вашим бизнес-процессам.

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

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