用两个CPT在搜索结果页面中筛选出一个元键

时间:2015-02-12 作者:Aaron

我有两个CPT:列表和事件。在事件中,我有用于开始和结束日期的自定义字段。我需要的是一种过滤掉超过当前日期的任何事件的方法。

我现在拥有的是:

function search_pre_get_posts( $query ) {   
    if ( is_search() && $query->is_main_query() ) {          
        $currentdate =  current_time(\'Ymd\');        
        global $wp_query;
        $args = array_merge( 
            $wp_query->query_vars, 
            array(
                \'meta_query\'=> array( array(
                    \'key\' => \'DTEND\',
                    \'compare\' => \'>=\',
                    \'value\' => $currentdate,
                )),
            )
        );
        query_posts( $args );
    }
}
add_action( \'pre_get_posts\', \'search_pre_get_posts\' );
这会过滤掉过去的事件,但也会删除所有列表。我需要的是一种添加IF 语句仅对“事件”运行此元查询。

有人知道怎么做吗?每当我把IF 语句,使用get_post_type(), 喜欢\'events\' == get_post_type(), 它破坏了整个过滤器。

3 个回复
最合适的回答,由SO网友:Jen 整理而成

您可以添加第二个数组来检查是否未设置“DTEND”值:

    $args = array_merge( 
        $wp_query->query_vars, 
        array(
            \'meta_query\'=> array( 
                \'relation\' => \'OR\',
                array(
                     \'key\' => \'DTEND\',
                     \'compare\' => \'>=\',
                     \'value\' => $currentdate,
                ),
                array(
                     \'key\' => \'DTEND\',
                     \'compare\' => \'NOT EXISTS\',
                )
            ),
        )
    );
这样,任何没有DTEND 也将允许元值。

SO网友:Aaron

好的,@guiniveretoo通过几处编辑完成了它:

好吧,@guiniveretoo,你成功了!

通过一些调整,这就是我所使用的,并且很有效:

function search_pre_get_posts( $query ) {
global $wp_query;
if ( is_search() && $query->is_main_query()   ) {

$currentdate =  current_time(\'Ymd\');

$args = array_merge( 
    $wp_query->query_vars, 
    array(
            \'meta_query\'=> array( 
            \'relation\' => \'OR\',
            array(
                 \'key\' => \'DTEND\',
                 \'compare\' => \'>=\',
                 \'value\' => $currentdate,
            ),
            array(
                 \'key\' => \'DTEND\',
                 \'compare\' => \'NOT EXISTS\',
            )
        ),
    )
);

     query_posts( $args );

}

}

add_action( \'pre_get_posts\', \'search_pre_get_posts\' );\'
现在,我只需要找出如何通过元键“DTSTART”对“events”CPT进行排序,以便首先列出即将出现的事件。。。。

SO网友:Manny Fleurmond

@Aaron,这是您的解决方案的另一个版本,包括排序:

function search_pre_get_posts( $query ) {
    if ( $query->is_search() && $query->is_main_query()   ) {   
        $currentdate =  current_time(\'Ymd\');
        $query->set( 
            \'meta_query\',
            array(
                \'relation\' => \'OR\',
                array(
                     \'key\' => \'DTEND\',
                     \'compare\' => \'>=\',
                     \'value\' => $currentdate,
                ),
                array(
                     \'key\' => \'DTEND\',
                     \'compare\' => \'NOT EXISTS\',
                )
            )
        );

        $query->set( \'orderby\', \'meta_value\' );
    }
}

add_action( \'pre_get_posts\', \'search_pre_get_posts\' );\'
差异很大:$query 是通过引用传递的,因此您无需调用$wp_queryquery_posts (无论如何你都不应该打电话)。此外,设置orderby 通过meta_value 将按元值对帖子进行排序。

结束

相关推荐

使用WP_LIST_TABLE和SEARCH_BOX():如何分页搜索到的搜索结果?

我正在使用自定义WP\\U List\\U Table-Class,以便在仪表板中显示包含酒店的自定义表格。我可以按预期在右上角跳过分页的页面。搜索表单还添加了$my_list_table_instance->search_box( \'Search\', \'search_id\' ); 它运行良好,但仅限于第一页。在表单中,我有两个隐藏的分页字段:// List and form output $page = filter_input( INPUT_GET, \'page\'