Exclude Status Posts From RSS Feed in WordPress

I added a notes feature to my blog using WordPress’ status post format.

At some point I might create a separate RSS feed for those posts, but for now I wanted to exclude them from the general RSS feed, to keep it somewhat clean, containing only proper blog posts.

This is how I implemented it:

function my_theme_exclude_status_posts_from_feed( $wp_query ) {
    if ( $wp_query->is_feed ) {
        $status_posts = get_posts( [
            'posts_per_page' => -1,
            'tax_query' => [
                [
                    'taxonomy' => 'post_format',
                    'terms' => [ 'post-format-status' ],
                    'field' => 'slug',
                    'operator' => 'IN',
                ]
            ],
            'fields' => 'ids'
        ] );
    $wp_query->set( 'post__not_in', $status_posts );
}

return $wp_query;

}

add_filter( ‘pre_get_posts’, ‘my_theme_exclude_status_posts_from_feed’ );

Please let me know, if you know of a better/cleaner way to achieve this.


Update: After some input from Mark, I rewrote it, with one query less:

function my_theme_exclude_status_posts_from_feed( $wp_query ) {
    if ( $wp_query->is_feed ) {
    $filter = [
        'taxonomy' => 'post_format',
        'terms' => [ 'post-format-status' ],
        'field' => 'slug',
        'operator' => 'NOT IN',
    ];

    $tax_query = $wp_query->get( 'tax_query' );

    if ( is_array( $tax_query ) ) {
        $tax_query[] = $filter;
    }
    else {
        $tax_query = [ $filter ];
    }

    $wp_query->set( 'tax_query', $tax_query );
}

return $wp_query;

}

add_filter( ‘pre_get_posts’, ‘my_theme_exclude_status_posts_from_feed’ );


Comment via Email or Mastodon