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' );