POSTS_WHERE过滤器的自定义时间范围

时间:2012-10-19 作者:John

我正在创建一个功能,显示浏览次数最多的帖子,并希望能够根据帖子的年龄显示帖子。修改查询并不是一个真正的问题。但由于我无法将任何参数传递给函数,因此无法修改“-30天”部分。

function print_stuff($args) {
    add_filter( \'posts_where\', \'filter_where\');
    $posts = new WP_query($args);
    remove_filter( \'posts_where\', \'filter_where\' );
    // The loop
}

function filter_where($where = \'\') {
    $where .= " AND post_date > \'" . date(\'Y-m-d\', strtotime(\'-30 days\')) . "\'";
    return $where;
}
我想我可以将值存储在DB中,然后检索它,但这会让人觉得很难受。有什么想法吗?

2 个回复
SO网友:Milo

您可以在查询中设置自己的自定义查询变量,然后使用该值设置稍后在过滤器中读取的类变量:

class WPA69844_where {
    var $days;

    public function __construct(){
        add_action( \'parse_query\', array( $this, \'parse_query\' ) );
    }

    public function parse_query( $query ) {
        if( isset( $query->query_vars[\'my_days_var\'] ) ):
            $this->days = $query->query_vars[\'my_days_var\'];
            add_filter( \'posts_where\', array( $this, \'filter_where\' ) );
            add_filter( \'posts_selection\', array( $this, \'remove_where\' ) );
        endif;
    }

    public function filter_where($where = \'\') {
        $where .= " AND post_date > \'" . date(\'Y-m-d\', strtotime(\'-\' . $this->days . \' days\')) . "\'";
        return $where;
    }

    public function remove_where() {
        remove_filter( \'posts_where\', array( $this, \'filter_where\' ) );
    }


}
$wpa69844_where = new WPA69844_where();
那么对于您的查询:

$args = array( \'my_days_var\' => 30 );
$posts = new WP_query( $args );

SO网友:Mridul Aggarwal

您可以使用一些全局/静态/类变量存储时间范围&;然后从那里取回它

或者使用过滤器(wordpress的概念就是基于此构建的)。下面是一个示例

function filter_where($where = \'\') {
    $time = apply_filters(\'custom_where_clause\', \'-30days\');
    if(!$time)
        $time = \'-30days\';

    $where .= " AND post_date > \'" . date(\'Y-m-d\', strtotime($time)) . "\'";
    return $where;
}

add_filter(\'custom_where_clause\', \'custom_where_clause_logic\');
function custom_where_clause_logic($time) {
    // put your logic here
    // make sure you return the value
}

结束

相关推荐