Как эффективно запросить сообщение с несколькими условиями? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть посты с призывом к действию, которые я хочу отображать на своей главной странице.Я хотел бы запросить эти пользовательские типы сообщений и отобразить один из них с датой запуска <сегодняшняя дата и дата истечения> сегодняшней даты.Если нет таких, которые соответствуют этим условиям, я хочу отобразить призыв к действию, у которого нет даты истечения срока действия.

Есть ли способ запросить все сообщения с призывом к действиюзатем случайным образом отобразите одно из них, которое соответствует первому условию, а затем, если оно пустое, второе условие?

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

$today = date( "Ymd" );

// args
$condition1 = array(
    'posts_per_page'    => 1,
    'post_type'     => 'cta',
    'post-status'       => 'publish',
    'orderby'       => 'rand',
        'meta_query'        =>array(
            'relation' => 'AND',
            array(
                'key' => 'launch',
                'value' => $today,
                'compare' => '<'
            ),
                array(
                'key' => 'expiry',
                'value' => $today,
                'compare' => '>'
            ),
    )
);

$condition2 = array(
    'posts_per_page'    => 1,
    'post_type'     => 'cta',
    'post-status'       => 'publish',
    'orderby'       => 'rand',
    'meta_query'        =>array(
            array(
                'key' => 'launch',
                'value' => $today,
                'compare' => '<'
            ),
    )
);

// query
$cta1 = new WP_Query( $condition1 );
$cta2 = new WP_Query( $condition2 );

    if( !empty($cta1 -> have_posts()) ) :

        while( $cta1 -> have_posts() ) : $cta1 -> the_post(); global $post;

        // Display post with first condition

        endwhile; wp_reset_postdata();


    elseif( ( $cta2 -> have_posts() ) ) :

        while( $cta2 -> have_posts() ) : $cta2 -> the_post(); global $post;

        // Display post with second condition

        endwhile; wp_reset_postdata();

    endif;

1 Ответ

0 голосов
/ 29 апреля 2019

Вы можете использовать расширенный мета-запрос опция

$meta_query = array(
    'posts_per_page'    => 1,
    'post_type'     => 'cta',
    'post-status'       => 'publish',
    'orderby'       => 'rand',
        'meta_query'        =>array(
            'relation' => 'OR',
            array(
                'key' => 'launch',
                'value' => $today,
                'compare' => '<'
            ),
            array(
                'relation' => 'AND',
                array(
                    'key' => 'launch',
                    'value' => $today,
                    'compare' => '<'
                ),
                array(
                    'key' => 'expiry',
                    'value' => $today,
                    'compare' => '>'
                ),
            ),
    )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...