How to get override the WP Admin Syndication feed limit for a custom feed?

I need to override the setting in the WP Admin for the number of recent posts in the Syndication settings under General -> Admin.

I’m using the following code, which gets all posts, but I don’t need that many. Can someone give me an example of how to retrieve 50 posts? This should only affect this one feed and not all the others.

Read More
function no_limits_for_feed( $limits ) {
    return '';
}

add_filter( 'post_limits', 'no_limits_for_feed' );

UPDATE: Here’s an example of the code I am using, which is from the Feed JSON WordPress plug-in:

class feed_json {
    function feed_json() {
        global $wp_rewrite;

        add_action('init', array(&$this, 'add_feed_json'));
        add_action('do_feed_json', array(&$this, 'do_feed_json'), 10, 1);
        add_filter('template_include', array(&$this, 'template_json'));
        add_filter('query_vars', array(&$this, 'add_query_vars'));

        $plugin_basename = plugin_basename(__FILE__);
        add_action('activate_' . $plugin_basename, array(&$this, 'add_feed_json_once'));
        add_action('deactivate_' . $plugin_basename, array(&$this, 'remove_feed_json'));
    }

    function add_feed_json_once() {
        global $wp_rewrite;
        $this->add_feed_json();
        $wp_rewrite->flush_rules();
    }

    function remove_feed_json() {
        global $wp_rewrite;
        $feeds = array();
        foreach ( $wp_rewrite->feeds as $feed ) {
            if ( $feed !== 'json' ) {
                $feeds[] = $feed;
            }
        }
        $wp_rewrite->feeds = $feeds;
        $wp_rewrite->flush_rules();
    }

    function add_query_vars($qvars) {
      $qvars[] = 'callback';
      $qvars[] = 'limit';
      return $qvars;
    }

    function add_feed_json() {
        add_feed('json', array(&$this, 'do_feed_json'));
    }

    function do_feed_json() {
        load_template($this->template_json(dirname(__FILE__) . '/feed-json-template.php'));
    }

    function template_json( $template ) {
        $template_file = false;
        if (get_query_var('feed') === 'json') {
            $template_file = '/feed-json.php';
            if (function_exists('get_stylesheet_directory') && file_exists(get_stylesheet_directory() . $template_file)) {
                $template_file = get_stylesheet_directory() . $template_file;
            } elseif (function_exists('get_template_directory') && file_exists(get_template_directory() . $template_file)) {
                $template_file = get_template_directory() . $template_file;
            } elseif (file_exists(dirname(__FILE__) . '/feed-json-template.php')) {
                $template_file = dirname(__FILE__) . '/feed-json-template.php';
            } else {
                $template_file = false;
            }
        }

        return (
            $template_file !== false
            ? $template_file
            : $template
            );
    }
}
new feed_json();

Related posts

Leave a Reply

1 comment

  1. I thought you could hook into pre_get_posts, but if it is a feed the posts_per_page value gets overwritten later. So just hook into post_limits, check for your feed, and return a different LIMIT part if needed.

    add_filter( 'post_limits', 'so6230475_post_limits', 10, 2 );
    function so6230475_post_limits( $limits, &$wp_query )
    {
        if ( $wp_query->is_feed( 'json' ) ) {
            $limits = 'LIMIT 50';
        }
        return $limits;
    }