Intereting Posts
Добавьте возможности к роли, поэтому пользователь может просматривать только свои собственные сообщения Добавить пользовательский столбец для столбца списка Shortcode для вытягивания определенного внешнего контура заголовка сообщения, когда идентификатор передается в Неопределенное уведомление индекса при использовании параметра $ args в add_settings_field () Как изменить уведомление по электронной почте для комментариев Как добавить плагин GEO для членства в плагин? блочное тестирование пароля администратора Переназначьте пользователя, используя «wp_login_failed» действие, если ошибка «empty_username» или «empty_password» Настройка языка RSS-канала Как получить данные формы? Как установить более одного блога WordPress на EC2? Как использовать две разные страницы для просмотра содержимого сообщения? Изменение заголовков в Uploader для "Posts" Дополнительный вариант для администратора пользовательского заголовка Ограничить область действия WP-кода в плагине

Сортировка и ограничение с помощью pre_get_posts

Это мой третий вопрос относительно запросов WP и pre_get_posts (извините за это), но я не могу отказаться от одного шага перед полным успехом 🙂

Итак, рассказ – мой запрос ограничивает сообщения на первой странице только теми, у которых есть изображения. Все идет нормально. Моя последняя цель – сортировать эти сообщения по настраиваемому полю, заказывать их в заказе ASC и показывать только сообщения, которые имеют дату metakey / custom field через 30 дней. Пока это мой код вместе с моими попытками, но, похоже, я даже не закрываю …

Текущая сортировка хаотична. Для второй части, показывающей только сообщения в течение следующих 30 дней, я имею в виду, чтобы установить один var, удерживающий текущую дату + 30 дней, одну переменную с пользовательской полевой датой и проверить, что первая больше, чем вторая, но как я может получить пользовательское поле в этой функции и где поставить это, если проверить? Вероятно, этот вопрос прост, но я борюсь. Спасибо за ваше время и за обмен знаниями.

add_action( 'pre_get_posts', function ( $q ) { if ( $q->is_home() // Target the home page only && $q->is_main_query() // Target only the main query || $q->is_category() ) { $meta_query = array( array( 'key' => '_thumbnail_id', ) ); $q->set( 'meta_query', $meta_query ); $q->set('orderby','meta_value_num'); $q->set('meta_key', 'event_date'); $q->set('order', 'ASC'); } }); 

Solutions Collecting From Web of "Сортировка и ограничение с помощью pre_get_posts"

Прежде чем мы перейдем к деталям, давайте рассмотрим проблему.

  • Прежде всего, любой допустимый формат даты действителен в настраиваемом поле, если вы не собираетесь использовать его для сравнения и сортировки

  • Когда вы собираетесь сортировать по дате или делать сравнения по дате в настраиваемом поле, указать точку пули следует игнорировать. Есть только два рабочих формата, которые будут работать, если вы собираетесь сортировать по пользовательской дате поля. Они есть:

    • Unix Timestamp (который я предпочитаю из личного мнения), который является целочисленным значением и соответствует количеству секунд, прошедших с 1 января 1970 года. Сохранение даты в этом формате является наиболее точным, на мой взгляд, и любая временная метка может быть легко преобразована в любой формат, используя класс DateTime . В настоящее время поддерживается только даты между 01 января 1970 года и 19 января 2038 года

    • Ymd H:i:s или Ymd или H:i:s . Любой другой формат не будет работать. Параметр orderby сортируется буквально, поэтому в основном, первое число данных строк сравнивается и сортируется по возрастанию или по убыванию в соответствии с параметром order , если они совпадают, второе число сравнивается и т. Д. До тех пор, пока не будут найдены несоответствующие числа и порядок сортировки возвращается. Рекомендуется установить правильное значение параметра type в meta_query соответствии с вашим конкретным форматом. Эти значения параметров type : DATE , DATETIME и TIME которые будут обрабатывать ваш точный формат при запросе этих конкретных полей

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

Теперь, когда формат отсортирован, нам нужно записать на простом английском то, что нам нужно. Я склонен использовать этот метод, если что-то становится сложным или слишком сложным. Это очень помогает. Итак, на простом английском языке это то, что должен делать ваш запрос.

Все сообщения с эскизами должны быть показаны. Этот параметр сохраняется как настраиваемое поле _thumbnail_id . Кроме того, эти должности должны также иметь даты в будущем, а точнее, в течение следующих тридцати дней. Это также зависит от настраиваемого поля. Эти сообщения также должны сортироваться в соответствии с датами в пользовательском поле

Отлично, поэтому это означает, что в нашей meta_query наши сообщения должны иметь эскиз И ( это будет наша связь между настраиваемыми полями ) и должны иметь значение даты поля в поле BETWEEN текущего времени и 30 дней с текущего времени

Давайте поместим это в код: ( Примечание: Caveat: это непроверено и требуется, по крайней мере, PHP 5.3 работать из-за использования DateInterval . Кроме того, это настраивается с помощью Ymd H:i:s в вашем настраиваемом поле. Сохраняйте формат даты равномерно, иначе он не будет работать )

 add_action( 'pre_get_posts', function( $q ) { if ( $q->is_home() // Target the home page only && $q->is_main_query() // Target only the main query || $q->is_category() // NO IDEA WHY YOU ADDED THIS! ARE YOU TARGETING CATEGORY PAGES AS WELL? ) { $current_time = new DateTime(); // Get the current date and time $current_time_format = $current_time->format( 'Ymd H:i:s' ); // This is the current date and time $after_thirty_days = new DateTime(); // Create the date after 30 days $after_thirty_days->add( new DateInterval( 'P30D' ) ); // Adds 30 days to the current date and time $date_after_thirty_days = $after_thirty_days->format( 'Ymd H:i:s' ); $meta_query = array( //Default relation is AND, no need to set it. So posts should match both conditions set in the two sets of arrays array( // Our first array of conditions set to get posts with a thumbnail 'key' => '_thumbnail_id' ), array( // Our second array of conditions. Posts should also have these conditions in addition to the first array of conditions 'key' => 'event_date', 'value' => array( $current_time_format, $date_after_thirty_days ), // Add todays date and date after 30 days as an array 'compare' => 'BETWEEN', // Will look for valid values between the array of dates given in the value parameter 'type' => 'DATETIME' // We will use the date and time format to compare our dates ), ); $q->set( 'meta_query', $meta_query ); $q->set( 'orderby', 'meta_value_num' ); $q->set( 'meta_key', 'event_date' ); $q->set( 'order', 'ASC' ); } }); 

ПОСЛЕДНИЕ НЕСКОЛЬКИЕ ПРИМЕЧАНИЯ:

  • Как я уже отмечал, это непроверено, поэтому оно может не работать прямо из коробки. Это может потребовать некоторых корректировок.

  • Я использовал формат Ymd H:i:s здесь. Вы можете просто использовать Ymd здесь. Просто отрегулируйте запрос и даты соответственно. Если вы собираетесь использовать временные метки, не забудьте преобразовать даты сравнения в метку времени

  • Поскольку вы используете бесконечную прокрутку, вам нужно будет запомнить эту функцию соответствующим образом, иначе страница 2 и вверх будут отображать неправильные сообщения

РЕДАКТИРОВАТЬ

Вышеприведенный код теперь протестирован и работает как ожидается с форматами дат Ymd H:i:s и Ymd . Я должен был исправить одну или две небольшие ошибки. Надеюсь, поможет