如何有效地查询具有多个条件的帖子?

时间:2019-04-29 01:56:01

标签: php wordpress

我有一些号召性用语帖子要显示在我的首页上。我想查询这些自定义帖子类型,并显示其中一种启动日期<今天的日期,而到期日期>今天的日期。如果没有满足这些条件的产品,我想显示一个没有到期日期的号召性用语。

有没有一种方法可以查询所有号召性用语,然后随机显示满足第一个条件的内容,然后显示空白,则显示第二个条件?

我已成功尝试查询两次,每种条件一次(请参见下文)。但是我想我只查询数据库一次。这样,我可以根据需要添加更多条件,而无需进行无数查询。还是这种方法不明智?

$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 :(得分:0)

您可以使用高级meta query选项

$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' => '>'
                ),
            ),
    )
);