Site icon Web Niraj

WordPress Loop – Include / Exclude Tags Globally

After my post about filtering certain posts by tags, I wondered how you could hide / show posts globally across WordPress. For example, I wanted to show all the posts tagged as ‘PlayStation Vita’ on my XTREME PSVita website. Why? The XTREME PSVita website uses the same database as XTREME PSP, but I didn’t want the posts to appear in both areas at once.

I created a simple plugin that only showed tagged posts on one website, and not the other. This plugin works on a global level, so even posts in the WordPress Admin area are filtered, and it will continue to work if you change or update your theme too.

Solution

// function to filter tags
function filter_xtreme_tags( $query ) {

    // determine which website we are on
    if ( isset( $_SERVER['HTTP_HOST'] ) && strstr( $_SERVER['HTTP_HOST'], 'xtremepsvita.com' ) ) {
        // are we looking at a post? this bit is important
	if ( $query->is_post ) {
             // only show posts tagged as 'PlayStation Vita'
             $query->set( 'tag__in', array(163) );
        }
    } else {
        // we are on xtremepsp.com
        // don't show posts tagged as 'not-xtremepsp'
        $query->set( 'tag__not_in', array(200) );
    }
}

// add the filter to wordpress
add_action( 'pre_get_posts', 'filter_xtreme_tags' );

Modification

The tag__in an tag__not_in parameters only accept arrays, so you can easily include or exclude multiple tags from your blog.

If you want to filter by categories instead, replace the $query-set part of the code to something like:

// only show posts from cat 3
$query->set( 'cat', '3' );

// hide posts from cat 3
$query->set( 'cat', '-5' );
Exit mobile version