WordPress: Using Filters With get_posts()

Something I just learned and thought I’d share to save others the trouble: if you’re attempting to filter the results of get_posts(), for example with the posts_where filter, you need to disable suppress_filters.

For example, here’s how to fetch some posts from within the past 30 days (based on an example from the Codex):

<?php

function last_thirty_days( $where = '' ) {
	global $wpdb;

	$where .= $wpdb->prepare( " AND post_date > %s", date( 'Y-m-d', strtotime('-30 days') ) );

	return $where;
}

add_filter( 'posts_where', 'last_thirty_days' );

$some_posts = get_posts( array( 'suppress_filters' => false ) );

// Important to avoid modifying other queries
remove_filter( 'posts_where', 'last_thirty_days' );

?>

23 thoughts on “WordPress: Using Filters With get_posts()

  1. Pingback: WordPress Picks for the Week [02/03] | Techtites

    • It’s one of the function’s optional arguments. Setting it to false will disable the function from not using any filters on it’s query and results like it normally does.

  2. this was just enough information to get me in trouble!

    I ended up having filters for posts_where, post_limits, posts_orderby, posts_join, posts_groupby all working together in my plugin!

    thanks for the post, it really helped!

  3. Oh man! I was pulling hairs out for an hour over this until I found your post.

    Thanks so much, this allows for so many possibilities. Altering the where clause is really powerful.

    Question though: if I only want it to apply to one get_posts() and no others, or, say have different get_posts()’s on different parts of the theme have different where filters, should I do something like:

    function filter_where( $where = '' ) {
    	// posts in the last 30 days
    	$where .= " AND post_date > '" . date('Y-m-d', strtotime('-60 days')) . "'";
    	return $where;
    }
    add_filter( 'posts_where', 'filter_where' );
    			$posts = get_posts(array(
    				'suppress_filters' => false,
    				'numberposts' => -1,
    				'category__not_in' => explode(',',$subscriber->categories_excluded),
    				'post_type' => $post_types_included
    				)
    			);
    remove_filter( 'posts_where', 'filter_where' )
    

    (removing the filter so it doesn’t affect other suppress_filter get_posts()’s)

    I’m thinking this is necessary otherwise this filter will be carried out sitewide…

  4. Pingback: WordPress - Showing Ads only on Old Posts

  5. I’m trying to get the 6 previous posts in my single.php in relation to the post being displayed. Would you have an idea on how to use your code to achieve that task?

  6. I like this code a lot, but I am trying to add the filter inside a function and it doesn’t seem to be working, even if I remove the conditional. Is that something WordPress doesn’t allow for?

    function sr_get_submenu( $args, $sr_last_fourteen_days = false, $image_size = 'small_thumb' ) {
    	$output = '';
    	if($sr_last_fourteen_days) 
    	add_filter( 'posts_where', 'sr_last_fourteen_days' );
    	
    	$posts = get_posts( $args );
    	........
    
    	if($sr_last_fourteen_days) remove_filter( 'posts_where', 'sr_last_14_days' );
    	
    }
    
    function sr_last_fourteen_days( $where = '' ) {
        global $wpdb;
        $where .= $wpdb->prepare( " AND post_date > %s", date( 'Y-m-d', strtotime('-14 days') ) ); 
        return $where;
    }
    
  7. Thanks. I was wondering why the results weren’t filtered. So by default get_posts removes filters. I learned something !

  8. Pingback: Welcart??????????????? | Welcart ??????

  9. Pingback: WordPress Picks for the Week [02/03] | Techtites

Leave a Reply