Use the Time Parameters in WP_Query()
Quoting example from the Codex:
Return posts from the last 30 days:
// This takes your current query, that will have the filtering part added to.
$query_string = array(
'post_type' => 'post',
'tax_query' => array(array( 'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array('post-format-image'))),
'cat' => '-173',
'post_status' => 'publish');
// Create a new filtering function that will add our where clause to the query
function filter_where( $where = '' ) {
// posts in the last 30 days
$where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
return $where;
}
add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );
Edit
(in response to the OP's updated question).
Avoid using query_posts. You can use the above technique to alter your main query (subject to some extra conditionals - is home page, is a page called 'foobar' etc. ):
function wpse52070_filter_where( $where = '' , $query) {
if( $query->is_main_query() && is_page( 'foobar' ) ){
// posts in the last 30 days
$where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
}
return $where;
}
add_filter( 'posts_where', 'wpse52070_filter_where' );