Проблемы с WP_Query, циклом, условием и количеством записей на странице

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

Я создаю веб-сайт, и у меня есть пользовательские типы (плагин: Types). Эти пользовательские типы называются ‘Veranstaltungen’ –> это События.

У всех этих Событий есть дата начала ( start-datum ) и дата окончания ( end-datum ), которые являются пользовательскими полями.

На главной странице моего веб-сайта я хочу отобразить 3 из этих Событий.

Я заставил цикл работать с моим порядком сортировки и могу ограничить его тремя с помощью этого:

$loop = new WP_Query( array(                
    'post_type'        => 'veranstaltungen',    
    'posts_per_page'   => '3',
    'orderby'          => 'meta_key',
    'order'            => 'ASC',
    'key'              => 'start-datum',
) );

Показываются События Прошлого.

Следующие 3 События согласно пользовательскому полю start-datum должны появиться.

Я добавил эту логику if:

while( $link->have_posts() ) :
    $link->the_post(); 

    if( date( 'm d,Y',strtotime( "today" ) ) <= types_render_field( 'end-datum', array( 'format' => 'm d, Y' ) ) )
    {
        ...

Это работает, но Цикл учитывает “устаревшие записи” и портит мой posts_per_page.

Если мы подумаем о сегодня, и у меня есть 2 События в прошлом, я увижу только 1 Событие.

Как я могу решить эту проблему?


Я попытался сделать это вместо условия и попытался исключить мои записи в Цикле, но это не сработало. Это просто сортирует мои записи и выводит все:

$loop = new WP_Query( array(                
    'post_type'     => 'veranstaltungen',   
    'posts_per_page'=> '3',
    'orderby'       => 'meta_key',
    'order'         => 'ASC',
    'key'           => 'end-datum',
    'value'         =>  date( 'F j,Y',strtotime( "today" ) ),
    'compare'       => '>=',
    'type'          => 'DATE',              
) );

Просто для вашего сведения.
Я переключил свой плагин на Advanced Custom Fields и создал запрос вот так. Возможно, это было из-за знака “-” в моем пользовательском поле или из-за формата даты.

$today = date('Ymd');
$args=array(
   'post_type' => 'veranstaltungen',
   'posts_per_page' => 3,   
   'meta_query' => array(
        array(
       'key' =>  'ende',
       'compare' => '>=',
       'value' => $today,   
        ),      
    ),  
       'meta_key' =>  'start',
       'orderby' => 'meta_value',
       'order' => 'ASC',   
);
$loop = new WP_Query($args);            
?>
<?php while ( $loop->have_posts() ) : $loop->the_post();

Спасибо всем, кто попытался помочь! 🙂

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

Проблемы с WP_Query, циклом, условиями и количеством постов на странице

Создание динамичных веб-сайтов на WordPress, особенно с использованием пользовательских типов записей и полей, может иногда привести к трудностям. Ваша задача – отображение предстоящих мероприятий на главной странице с определенными условиями. Рассмотрим подробно вашу ситуацию и обеспечим решение.

Текущая ситуация

Вам нужно отобразить три предстоящих события, используя пользовательский тип записей "veranstaltungen". Вы уже создали запрос с помощью WP_Query, но столкнулись с проблемой, когда в результаты попадают события, которые уже завершены. Давайте рассмотреть ваши запросы и логику, которые могут привести к этой проблеме.

Проблемы с вашим текущим кодом

  1. Неправильное использование условий в цикле: Ваше условие на основе даты сравнивает каждую запись только после выполнения цикла. Если событий в прошлом больше, чем три, вы просто не получите желаемый итог (например, если существуют два завершившихся события и одно предстоящее, вы получите только одно отображение). Это происходит потому, что вы не исключили устаревшие события на этапе выбора, что влияет на конечный результат.

  2. Проблемы с запросом POST: Используя orderby с meta_key, вы не можете добавить условие по дате непосредственно в запрос. Это приводит к тому, что outdated events всё равно возвращаются, так как логика фильтрации происходит только на этапе вывода.

Рекомендации по исправлению

Для обеспечения правильного отображения предстоящих событий, вам нужно установить условия фильтрации уже на этапе запроса. Позвольте мне предложить переработанный код:

$today = date('Ymd');
$args = array(
    'post_type'      => 'veranstaltungen',
    'posts_per_page' => 3,
    'meta_query'     => array(
        array(
            'key'     => 'end-datum',
            'value'   => $today,
            'compare' => '>=',
            'type'    => 'DATE'
        ),
    ),
    'meta_key'       => 'start-datum',
    'orderby'        => 'meta_value',
    'order'          => 'ASC',
);

$loop = new WP_Query($args);

if ($loop->have_posts()) {
    while ($loop->have_posts()) {
        $loop->the_post();
        // Ваш код для отображения поста
    }
} else {
    echo 'Нет предстоящих событий.';
}

wp_reset_postdata(); // Не забудьте сбросить данные после цикла

Объяснение решения

  1. Использование meta_query: Этот блок фильтрации создает условие, позволяющее выбирать только те события, которые заканчиваются сегодня или позже. Это значит, что все устаревшие события будут исключены на этапе выбора, тем самым гарантируя, что вы получите именно три актуальных события.

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

  3. Оптимизация запроса: Убедитесь, что ваша структура данных оптимизирована для быстрого доступа, что улучшит производительность запроса и сайта в целом.

Заключение

Используя предложенное решение, вы сможете избежать проблем с устаревшими записями и гарантировать, что ваша страница будет показывать актуальные события. Настройка пользовательского фильтра meta_query на этапе запроса – ключ к успешной реализации вашей задачи. Надеюсь, что этот ответ будет вам полезен и поможет вам продолжить успешную разработку вашего веб-сайта.

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

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