对Pre_Get_POST上的元数据使用POSTS_WHERE

时间:2014-07-29 作者:patrickzdb

假设您有一些代码可以使用pre_get_posts

e、 g。

add_action( \'pre_get_posts\', \'be_exclude_category_from_blog\' );

function be_exclude_category_from_blog( $query ) {

    if( $query->is_main_query() && $query->is_home() ) {
        $query->set( \'cat\', \'-4\' );
    }

}
我发现了一段很好的代码,可以让您进一步过滤这些帖子,直到最后90天:

add_action( \'pre_get_posts\', \'be_exclude_category_from_blog\' );

function be_exclude_category_from_blog( $query ) {

    if( $query->is_main_query() && $query->is_home() ) {
        add_filter( \'posts_where\', \'filter_date\' );
        $query->set( \'cat\', \'-4\' );
    }

}

function filter_date( $where = \'\' ) {
    $where .= " AND post_date > \'" . date(\'Y-m-d\', strtotime(\'-90 days\')) . "\'";
    return $where;
}
这非常有效。但是,如果我想使用相同的方法来定位帖子的元数据,而不仅仅是post\\u date,该怎么办?这可能吗?从…起this answer 看起来你应该这样做:

add_action( \'pre_get_posts\', \'be_exclude_category_from_blog\' );

function be_exclude_category_from_blog( $query ) {

    if( $query->is_main_query() && $query->is_home() ) {
        add_filter( \'posts_where\', \'filter_date\' );
        $query->set( \'cat\', \'-4\' );
    }

}

function filter_date( $where = \'\' ) {
    global $wpdb;  
    $where .= " AND ($wpdb->postmeta.meta_key = \'_length\' AND $wpdb->postmeta.meta_value = \'61\')";
    return $where;
}
然而,这对我不起作用,它返回零结果。尽管我知道有些帖子的元键是_length 值为61.

有人能给我指出正确的方向吗?

干杯

1 个回复
SO网友:Rarst

我怀疑这是否真的奏效了。WP_Query 对posts数据库表进行操作。在底层SQL级别上,要使用post元数据,您不仅需要说明要查找哪些元数据,还需要指示MySQL元数据表如何连接到post表(JOIN 领域)。

我会尝试继续为初学者操纵查询参数,您的条件似乎没有那么复杂(至少从您引用的内容来看)。

另外,不要忘记在之后删除过滤器,否则会弄乱其他查询。

结束

相关推荐

Usage of filters

在下面的示例中(从WordPress.org)获取提要后,为什么要删除过滤器<?php function return_7200( $seconds ) { // change the default feed cache recreation period to 2 hours return 7200; } add_filter( \'wp_feed_cache_transient_lifetime\' , \'return_720