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?

Related posts

Leave a Reply

2 comments

  1. 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 );
    
  2. You can store the time range using some global/static/class variable & then retrieve it from there

    or use filters (the concept wordpress is built on). Here is an example

    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
    }