Custom time range for the posts_where filter

I’m creating a function that displays the most viewed posts and would like to be able to show posts based on how old they are. Modifying the query is not really a problem. But since I can’t pass any arguments to the function I can’t modify the “-30 days” part.

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;
}

I guess I could store the value in the DB and then retrieve it, but that would feel ugly. Any ideas?

2 Answers
2

You can set your own custom query vars in a query, then use that value to set a class variable that you later read in the filter:

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();

Then for your query:

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

Leave a Comment