Plugin Pulse Beta
← Pulse
C

Cat + Tag Filter

by ajayver · Search

Also makes 5 other plugins · 180+ installs across the portfolio →

This plugin adds a widget to your WordPress site that gives your visitors an ability to filter all your posts by a category or/and tag.

Try it live opens a temporary test site in your browser, which can take about 20 seconds to load. Plugins that rely on outside services or a full server may not work completely there.

⚠ Stale⚠ Likely abandoned

Health

D 45/100

Stale · Likely abandoned

Active installs

100+

≈150 estimated

Momentum

+1%

downloads vs prior 30d

Biggest opportunity: “categories”, “filter” and “tags” aren't earning a slot. You list them, but you're not in the first 24 results for those searches. WordPress.org counts only your first five tags, so free the slot for a search you can win.

How scoring works →
45 Health · D
Maintenance 3/100
Rating quality 76/100
Support 70/100

45 health vs 63 average across 978 Search plugins

Install conversion

How it's measured →

0.5%

of downloads still active

At least 100 of 20K lifetime downloads are still running, below its category: the median Search plugin keeps 0.7%, across 645 plugins.

Downloads count every update, not just first installs, so older and more frequently released plugins read lower. Compare against other Search plugins, not across the directory. wp.org reports active installs as the bottom of a band, so the real rate is this or higher.

High removal-risk signals

63/100

Maintenance and integrity signals that tend to precede a WordPress.org removal. Not an official status, a heads-up to act.

  • Long abandoned. No update in 13+ years — the top precursor to removal once a vulnerability is found.
  • Compatibility drift. Tested only up to WordPress 3.4.2, well behind 6.8.

Details

Version
0.9.1
Last updated
13.9y ago
Added
2011-02-14 · 15 yrs old
Requires WP
2.8
Tested up to
3.4.2
Requires PHP
—

Directory ranking optimization

How it's scored →

How well this listing is tuned to rank in WordPress.org search, on the factors an owner controls. Not popularity, optimization.

37 / 100

Under-optimized

Most to gain: Update recency

Update recency 0/100

Updated 5090 days ago, past the ~180 days where wp.org starts discounting

WP compatibility 1/100

Tested up to WordPress 3.4.2; the current branch is 6.8

Rating quality 63/100

4.2★ over 10 reviews, smoothed to 4.12★ and held back under 25 reviews

Listing tuning 92/100

4 of 5 tags set · short description in place

To rank higher: Last updated 5090 days ago — ship an update; wp.org decays a listing's search weight after ~180 days.

Get the full rank-higher report →

Daily downloads

Since 5 Oct 2022 · 1,488 days · wp.org + Plugin Pulse archive

+1% vs prior 30d
531 Oct 2026

30-day downloads

Rolling 30-day volume · peak 80 · peaks are release surges

8031 Oct 2026

Directory rank

Ranked about #13,300 to #16,400, alongside the other plugins at 100+ installs. Plugins with the same install count swap places between wp.org requests, so this is where most of them sit. Checked monthly, last on 21 Oct 2026.

Rating trend

Star average over time · dips mark rough releases

4.231 Oct 2026

Update activity

How busy the existing users are, measured as downloads in the last 30 days for every 1,000 active sites. A spike means a new release everyone's pulling; a long, slow decline means an aging user base that updates less.

80031 Oct 2026

Release cadence

No release in a year
from wp.org release tags

How often this plugin actually ships. A steady rhythm is the maintenance signal a single "last updated" date can't show.

0

releases in the last 12 months

13.9y ago

latest release · v0.9.1 · 23 Nov 2012

21

tagged releases on record

Recent releases

0.9.1 · 23 Nov 20120.9 · 12 Nov 20120.8.5 · 7 Oct 20120.8.4 · 3 Oct 20120.8.3 · 30 Sep 20120.8.2 · 30 Sep 20120.8.1 · 30 Sep 20120.8 · 30 Sep 20120.7 · 25 May 20120.6 · 2 May 20120.5 · 8 Mar 20120.4.2 · 8 Mar 20120.4.1 · 7 Mar 20120.4 · 27 Feb 2012

What its installed base runs

via wordpress.org

Share of active installs on each version of this plugin · 100% run the current release. Green is the current release; a big slice on older versions is a user base that has stopped updating.

v0.9 100%

Estimated active installs

The public count shows “100+”. Our estimate pins where the real number sits.

tracked estimate
100–200 ≈150

Crossed into this band 22 months ago; a band this size takes about a year or more to cross, which places it about 50% of the way through.

Install history since 21 Jul 2019

10031 Oct 2026

Recent reviews

All reviews on wp.org ↗
  1. ★★★★★ loginwith2
    9mo ago

    Such a wonderfull plugin. Very like it. Thanks @ajayver and hope you are fine.Here is an updated code with PHP8.3 fix. Use on your own risk. Removed the links here for comment approval, but keep them on your file – its the creditsReplace the code of cat-tag-filter.php with the following code: <?php/*Plugin Name: Cat + Tag FilterPlugin URI: wordpress dot org/extend/plugins/cat-tag-filter-widget/Description: This plugin adds a widget to your WordPress site that allows your visitors to filter posts by category and tag.Author: Ajay VermaVersion: 0.9.1Author URI: ajayver dot com/*//* Copyright 2011 Verma Ajay (email : ajayverma1986@gmail dot com)*/if (isset($_POST["ctf_submit"]) && $_POST["ctf_submit"] == 1) { //if submit button was pressedrequire( '../../../wp-load.php' ); //require wordpress core functions$cat = ''; //initialize variables for category and tag parts of the url$tag = '';$tag_prefix = $_POST["tag_prefix"] .'/'; //get tag and category prefix$cat_prefix = $_POST["cat_prefix"] .'/';if ($_POST["tag_logic"] == 1) $tag_logic = '+'; //logic for tags (AND or OR)else $tag_logic = ',';if ($_POST["cat"] != -1) { //if a category was chosen$_POST['cat'] = get_term($_POST['cat'], $_POST['category_tax']); //get category slug from it's id$cat = '/'. $cat_prefix . $_POST['cat']->slug; //add it to category part of the url$tag_prefix = '/' . $_POST["tag_prefix"] . '/'; //add & to tag part of url}if ($_POST["tag"] && $_POST["tag"][0] != -1) { //if any tags were chosen$tag .= $tag_prefix; //add tag prefix to tag part of url$i = 0;foreach ($_POST["tag"] as $tags){if ($i > 0) $tag .= $tag_logic; //add all tags with ',' or '+' between them depends on logic$tag .= $tags;$i++;}}if ($cat == '' && $tag == '' && $_POST["blog_url"] != '') $url = $_POST["home_url"] . '/' . $_POST["blog_url"]; //if no category or no tag was chosen, just create a link to blogelse $url = $_POST["home_url"]. '/' . $cat . $tag; //else, create a link to blog + category and tag argumentsheader('Location: ' . $url); //redirect user to the created urlexit;}else {if (basename($_SERVER['SCRIPT_NAME']) == basename(__FILE__)) exit('Please do not load this page directly');}function current_tax() { //determine current tag and categoryglobal $wp_query, $ctf_options, $current_tax;$queries = $wp_query->tax_query->queries;if(!empty($queries)){foreach ($queries as $query) {if ($query['taxonomy'] == $ctf_options['tag_tax']) $current_tax['tags'] = $query['terms'];else if ($query['taxonomy'] == $ctf_options['category_tax']) $current_tax['cats'] = $query['terms'];}if(!empty($current_tax['cats'])){foreach ($current_tax['cats'] as $current_cat => $value) {$cat_id = get_term_by('slug', $value, $ctf_options['category_tax']);$current_tax['cats'][$current_cat] = $cat_id->term_id;}}return $current_tax;}}function cat_options(){ //get categories dropdown listglobal $ctf_options, $categories, $current_tax;$args = array('show_option_none' => $ctf_options['all_cats_text'],'taxonomy' => $ctf_options['category_tax'],'show_count' => $ctf_options['cats_count'],'pad_counts' => 1,'hierarchical' => 1,'selected' => $current_tax['cats'][0],$ctf_options['clude_cats'] => $ctf_options['exclude_cats'],'orderby' => 'name');wp_dropdown_categories($args);}function tag_options($type){ //get tagsglobal $ctf_options, $current_tax;$there_are_tags = true;$args = array();if(!empty($current_tax['cats'][0]) && $ctf_options['corresponding_tags'] == 1){$cat_args = array('cat' => $current_tax['cats'][0],'posts_per_page' => -1);query_posts($cat_args);if(have_posts()): while (have_posts()) : the_post();$all_tag_objects = get_the_terms($post->ID, $ctf_options['tag_tax']);if($all_tag_objects){foreach($all_tag_objects as $tag) {if($tag->count > 0) $all_tag_ids[] = $tag->term_id;echo '<!--' . $tag->term_id . '-->';}}endwhile;endif;wp_reset_query();if (isset($all_tag_ids)){$tags = array_unique($all_tag_ids);$include = '';if ($ctf_options['exclude_tags'] != ''){$ctf_options['exclude_tags'] = str_replace(" ", "", $ctf_options['exclude_tags']);$exclude = explode(',', $ctf_options['exclude_tags']);if ($ctf_options['clude_tags'] == 'include') {foreach ($tags as $tag){if (in_array($tag, $exclude)) $include .= $tag . ',';}}else if ($ctf_options['clude_tags'] == 'exclude') {foreach ($tags as $tag){if (!in_array($tag, $exclude)) $include .= $tag . ',';}}if ($include == '') $there_are_tags = false;}else {foreach ($tags as $tag){$include .= $tag . ',';}}$include = substr($include, 0, -1);$args['include'] = $include;}else $there_are_tags = false;}else {$args[$ctf_options['clude_tags']] = $ctf_options['exclude_tags'];}if ($there_are_tags) $tags = get_terms($ctf_options['tag_tax'],$args);$options = '';if ($type == 1){if ($there_are_tags){$options .= '<ul>';foreach ($tags as $tag) {$options .= '<li>';$options .= '<input type="checkbox" name="';$options .= "tag[]";$options .= '" value="' . $tag->slug . '"';if (is_array($current_tax['tags'])) {if (in_array($tag->slug, $current_tax['tags'])) $options .= ' checked ';}$options .= '>';$options .= $tag->name;if ($ctf_options['tags_count'] == 1) $options .= ' (' . $tag->count . ')';$options .= '</li>';}$options .= '</ul>';}else $options .= '<ul><li><input type="checkbox" name="tag[]" value="-1" disabled>' . __('No tags here', 'cat-tag-filter') . '</li></ul>';}else {if ($there_are_tags){$options .= '<select name="' . "tag[]" . '" id="ctf-tag-select" ><option value="-1">';if ($ctf_options['all_tags_text'] != '') $options .= $ctf_options['all_tags_text'];else $options .=__('Any tag', 'cat-tag-filter');$options .= '</option>';foreach ($tags as $tag) {$options .= '<option value="' . $tag->slug . '"';if (is_array($current_tax['tags'])) {if (in_array($tag->slug, $current_tax['tags'])) $options .= ' selected="selected" ';}$options .= '>';$options .= $tag->name;if ($ctf_options['tags_count'] == 1) $options .= ' (' . $tag->count . ')';$options .= '</option>';}$options .= '</select>';}else $options .= '<select name="tag[]" id="ctf-tag-select" disabled ><option value="-1">' . __('No tags here', 'cat-tag-filter') . '</option></select>';}return $options;}function ctf_widget(){global $ctf_options;current_tax();?><form action="<?php echo get_bloginfo('wpurl') . '/' . PLUGINDIR . '/' . dirname(plugin_basename(__FILE__)) . '/cat-tag-filter.php'; ?>" method="post"><div id="ctf-category-selector" <?php if ($ctf_options['cat_list_hide']) echo 'style="display:none;"'; ?> ><?php if ($ctf_options['cat_list_label']) echo '<label for="ctf-cat-select">' . $ctf_options['cat_list_label'] . '</label>'; ?><?php cat_options(); ?></div><div id="ctf-tag-selector"><?php if ($ctf_options['tag_list_label']) echo '<label for="ctf-tag-select">' . $ctf_options['tag_list_label'] . '</label>'; ?><?php echo tag_options($ctf_options['tag_type']); ?></div><input type="hidden" name="ctf_submit" value="1" /><input type="hidden" name="home_url" value="<?php bloginfo('url'); ?>" /><input type="hidden" name="blog_url" value="<?php $blog_url = get_option( 'page_for_posts'); if ($blog_url != 0) echo get_page_uri($blog_url); ?>" /><input type="hidden" name="tag_logic" value="<?php echo $ctf_options['tag_logic'] ?>" /><?php $taxonomies=get_taxonomies('','',''); ?><input type="hidden" name="tag_prefix" value="<?php echo $taxonomies[$ctf_options['tag_tax']]->rewrite['slug'] ?>" /><input type="hidden" name="category_tax" value="<?php echo $ctf_options['category_tax'] ?>" /><input type="hidden" name="cat_prefix" value="<?php echo $taxonomies[$ctf_options['category_tax']]->rewrite['slug'] ?>" /><input id="ctf-submit" class="button" type="submit" value="<?php echo $ctf_options['button_title']; ?>"/></form><?php}/*** Cat + Tag Filter Class*/class cat_tag_filter extends WP_Widget {/** constructor */function __construct() {$widget_ops = array('classname' => 'cat-tag-filter', 'description' => __('Filter posts by category and tag', 'cat_tag_filter') );parent::__construct(false, $name = 'Cat + Tag Filter', $widget_ops);}static function install() {flush_rewrite_rules();}/** @see WP_Widget::widget */function widget($args, $instance) {$defaults = array( 'title' => __('Filter', 'cat-tag-filter'), 'button_title' => __('Show posts', 'cat-tag-filter'), 'cat_list_hide' => false, 'cat_list_label' => __('Show posts from:', 'cat-tag-filter'), 'tag_list_label' => __('With tag:', 'cat-tag-filter'), 'all_cats_text' => __('Any category', 'cat-tag-filter'), 'all_tags_text' => __('Any tag', 'cat-tag-filter'), 'corresponding_tags' => '1', 'cats_count' => 1, 'tags_count' => 0, 'tag_logic' => 1, 'tag_type' => 0, 'exclude_tags' => '', 'exclude_cats' => '', 'clude_tags' => 'exclude', 'clude_cats' => 'exclude', 'tag_tax' => 'post_tag', 'category_tax' => 'category');$instance = wp_parse_args( (array) $instance, $defaults );extract( $args );global $ctf_options;$ctf_options['title'] = apply_filters('widget_title', $instance['title']);$ctf_options['button_title'] = apply_filters('widget_title', $instance['button_title']);$ctf_options['cat_list_hide'] = $instance['cat_list_hide'];$ctf_options['cat_list_label'] = apply_filters('widget_title', $instance['cat_list_label']);$ctf_options['tag_list_label'] = apply_filters('widget_title', $instance['tag_list_label']);$ctf_options['all_cats_text'] = apply_filters('widget_title', $instance['all_cats_text']);$ctf_options['all_tags_text'] = apply_filters('widget_title', $instance['all_tags_text']);$ctf_options['cats_count'] = $instance['cats_count'];$ctf_options['corresponding_tags'] = $instance['corresponding_tags'];$ctf_options['tags_count'] = $instance['tags_count'];$ctf_options['tag_logic'] = $instance['tag_logic'];$ctf_options['tag_type'] = $instance['tag_type'];$ctf_options['exclude_tags'] = $instance['exclude_tags'];$ctf_options['clude_tags'] = $instance['clude_tags'];$ctf_options['exclude_cats'] = $instance['exclude_cats'];$ctf_options['clude_cats'] = $instance['clude_cats'];$ctf_options['category_tax'] = $instance['category_tax'];$ctf_options['tag_tax'] = $instance['tag_tax'];echo $before_widget;if ( $ctf_options['title'] ) echo $before_title . $ctf_options['title'] . $after_title;ctf_widget();echo $after_widget;}/** @see WP_Widget::update */function update($new_instance, $old_instance) {$instance = $old_instance;$instance['title'] = strip_tags($new_instance['title']);$instance['button_title'] = strip_tags($new_instance['button_title']);$instance['cat_list_hide'] = $new_instance['cat_list_hide'];$instance['cat_list_label'] = strip_tags($new_instance['cat_list_label']);$instance['tag_list_label'] = strip_tags($new_instance['tag_list_label']);$instance['all_cats_text'] = strip_tags($new_instance['all_cats_text']);$instance['all_tags_text'] = strip_tags($new_instance['all_tags_text']);$instance['cats_count'] = $new_instance['cats_count'];$instance['corresponding_tags'] = $new_instance['corresponding_tags'];$instance['tags_count'] = $new_instance['tags_count'];$instance['tag_logic'] = $new_instance['tag_logic'];$instance['tag_type'] = $new_instance['tag_type'];$instance['exclude_tags'] = $new_instance['exclude_tags'];$instance['exclude_cats'] = $new_instance['exclude_cats'];$instance['clude_tags'] = $new_instance['clude_tags'];$instance['clude_cats'] = $new_instance['clude_cats'];$instance['category_tax'] = $new_instance['category_tax'];$instance['tag_tax'] = $new_instance['tag_tax'];flush_rewrite_rules();return $instance;}/** @see WP_Widget::form */function form($instance) {$defaults = array( 'title' => __('Filter', 'cat-tag-filter'), 'button_title' => __('Show posts', 'cat-tag-filter'), 'cat_list_hide' => false, 'cat_list_label' => __('Show posts from:', 'cat-tag-filter'), 'tag_list_label' => __('With tag:', 'cat-tag-filter'), 'all_cats_text' => __('Any category', 'cat-tag-filter'), 'all_tags_text' => __('Any tag', 'cat-tag-filter'), 'corresponding_tags' => '1', 'cats_count' => 1, 'tags_count' => 0, 'tag_logic' => 1, 'tag_type' => 0, 'exclude_tags' => '', 'exclude_cats' => '', 'clude_tags' => 'exclude', 'clude_cats' => 'exclude', 'tag_tax' => 'post_tag', 'category_tax' => 'category' );$instance = wp_parse_args( (array) $instance, $defaults );?><p><strong>Please consider donating 10 cents if you like this plugin! :)</strong> </p><p><a href="goo dot gl/SCdKg"><img src="paypalobjects dot com/en_US/i/btn/btn_donateCC_LG.gif" alt="donate" /></a></p><p><label for="ctf-widget-title"><?php _e('Widget title', 'cat-tag-filter'); ?>:</label><input type="text" id="ctf-widget-title" name="<?php echo $this->get_field_name('title'); ?>" value="<?php echo esc_attr($instance['title']);?>" /></p><p><input type="checkbox" id="ctf-cat-list-hide" name="<?php echo $this->get_field_name('cat_list_hide'); ?>" value="true" <?php if ($instance['cat_list_hide'] == true) echo "checked ";?>/><label for="ctf-cat-list-hide"><?php _e('Hide categories dropdown', 'cat-tag-filter'); ?></label></p><p><label for="ctf-cat-list-title"><?php _e('Categories dropdown label', 'cat-tag-filter'); ?>:</label><input type="text" id="ctf-cat-list-title" name="<?php echo $this->get_field_name('cat_list_label'); ?>" value="<?php echo esc_attr($instance['cat_list_label']);?>" /></p><p><label for="ctf-all-cats-text"><?php _e('All categories option text', 'cat-tag-filter'); ?>:</label><input type="text" id="ctf-all-cats-text" name="<?php echo $this->get_field_name('all_cats_text'); ?>" value="<?php echo esc_attr($instance['all_cats_text']);?>" /></p><p><input type="checkbox" id="ctf-cats-count" name="<?php echo $this->get_field_name('cats_count'); ?>" value="1" <?php if ($instance['cats_count'] == 1) echo "checked ";?>/><label for="ctf-cats-count"><?php _e('Show categories post count', 'cat-tag-filter'); ?></label></p><p><label for="ctf-exclude_cats"><?php _e('Coma separated category id\'s to ', 'cat-tag-filter'); ?><select name="<?php echo $this->get_field_name('clude_cats'); ?>" id="ctf-clude-cats" ><option value="exclude" <?php if ($instance['clude_cats'] == 'exclude') echo 'selected="selected" ';?> ><?php _e('exclude', 'cat-tag-filter'); ?></option><option value="include" <?php if ($instance['clude_cats'] == 'include') echo 'selected="selected" ';?> ><?php _e('include', 'cat-tag-filter'); ?></option></select>:</label><input type="text" id="ctf-exclude_cats" name="<?php echo $this->get_field_name('exclude_cats'); ?>" value="<?php echo esc_attr($instance['exclude_cats']);?>" /></p><p><label for="ctf-tag-list-title"><?php _e('Tags dropdown label', 'cat-tag-filter'); ?>:</label><input type="text" id="ctf-tag-list-title" name="<?php echo $this->get_field_name('tag_list_label'); ?>" value="<?php echo esc_attr($instance['tag_list_label'])?>" /></p><p><label for="ctf-all-tags-text"><?php _e('All tags option text', 'cat-tag-filter'); ?>:</label><input type="text" id="ctf-all-tags-text" name="<?php echo $this->get_field_name('all_tags_text'); ?>" value="<?php echo esc_attr($instance['all_tags_text']);?>" /></p><p><label for="ctf-tag-type"><?php _e('How to show tags:', 'cat-tag-filter'); ?></label><select name="<?php echo $this->get_field_name('tag_type'); ?>" id="ctf-tag-type" ><option value="0" <?php if ($instance['tag_type'] == 0) echo 'selected="selected" ';?> ><?php _e('Dropdown list', 'cat-tag-filter'); ?></option><option value="1" <?php if ($instance['tag_type'] == 1) echo 'selected="selected" ';?> ><?php _e('Checkboxes', 'cat-tag-filter'); ?></option></select></p><p><label for="ctf-tag-logic"><?php _e('Logic operator for multiple tags:', 'cat-tag-filter'); ?></label><select name="<?php echo $this->get_field_name('tag_logic'); ?>" id="ctf-tag-logic" ><option value="0" <?php if ($instance['tag_logic'] == 0) echo 'selected="selected" ';?> ><?php _e('OR', 'cat-tag-filter'); ?></option><option value="1" <?php if ($instance['tag_logic'] == 1) echo 'selected="selected" ';?> ><?php _e('AND', 'cat-tag-filter'); ?></option></select></p><p><input type="checkbox" id="ctf-tags-count" name="<?php echo $this->get_field_name('tags_count'); ?>" value="1" <?php if ($instance['tags_count'] == 1) echo "checked ";?>/><label for="ctf-tags-count"><?php _e('Show tags post count', 'cat-tag-filter'); ?></label></p><p><input type="checkbox" id="ctf-corresponding-tags" name="<?php echo $this->get_field_name('corresponding_tags'); ?>" value="1" <?php if ($instance['corresponding_tags'] == 1) echo "checked ";?>/><label for="ctf-corresponding-tags"><?php _e('Show only corresponding tags for current category', 'cat-tag-filter'); ?></label></p><p><label for="ctf-exclude_tags"><?php _e('Coma separated tag id\'s to ', 'cat-tag-filter'); ?><select name="<?php echo $this->get_field_name('clude_tags'); ?>" id="ctf-clude-tags" ><option value="exclude" <?php if ($instance['clude_tags'] == 'exclude') echo 'selected="selected" ';?> ><?php _e('exclude', 'cat-tag-filter'); ?></option><option value="include" <?php if ($instance['clude_tags'] == 'include') echo 'selected="selected" ';?> ><?php _e('include', 'cat-tag-filter'); ?></option></select>:</label><input type="text" id="ctf-exclude_tags" name="<?php echo $this->get_field_name('exclude_tags'); ?>" value="<?php echo esc_attr($instance['exclude_tags']);?>" /></p><p><label for="ctf-tag-tax"><?php _e('Custom taxonomy name for tags', 'cat-tag-filter'); ?>:</label><input type="text" id="ctf-tag-tax" name="<?php echo $this->get_field_name('tag_tax'); ?>" value="<?php echo esc_attr($instance['tag_tax']);?>" /></p><p><label for="ctf-category-tax"><?php _e('Custom taxonomy name for categories', 'cat-tag-filter'); ?>:</label><input type="text" id="ctf-category-tax" name="<?php echo $this->get_field_name('category_tax'); ?>" value="<?php echo esc_attr($instance['category_tax']);?>" /></p><ul><?php _e('List of registered taxonomies', 'cat-tag-filter'); ?>:<?php$taxonomies=get_taxonomies('','names');foreach ($taxonomies as $taxonomy ) {echo '<li>'. $taxonomy. '</li>';}?></ul><p><label for="ctf-button-title"><?php _e('Button title', 'cat-tag-filter'); ?>:</label><input type="text" id="ctf-button-title" name="<?php echo $this->get_field_name('button_title'); ?>" value="<?php echo esc_attr($instance['button_title']);?>" /></p><?php}} // class Cat + Tag Filter// register Cat + Tag Filter widgetif (function_exists('load_plugin_textdomain')){load_plugin_textdomain('cat-tag-filter', '/' .PLUGINDIR. '/' .dirname(plugin_basename(__FILE__)) . '/languages/' );}add_action('widgets_init', function() { return register_widget("cat_tag_filter"); });function add_rewrite_rules() {global $wp_rewrite;$ctf_options = get_option('widget_cat_tag_filter');foreach ($ctf_options as $widget_options){if ($widget_options['category_tax']){$taxonomies = get_taxonomies('','','');$new_rules = array($taxonomies[$widget_options['category_tax']]->rewrite['slug'] . '/(.+?)/' . $taxonomies[$widget_options['tag_tax']]->rewrite['slug'] . '/(.+?)/page/?([0-9]{1,})/?$' => 'index.php?' . $taxonomies[$widget_options['category_tax']]->query_var . '=' . $wp_rewrite->preg_index(1) . '&' . $taxonomies[$widget_options['tag_tax']]->query_var . '=' . $wp_rewrite->preg_index(2) . '&paged=' . $wp_rewrite->preg_index(3),$taxonomies[$widget_options['category_tax']]->rewrite['slug'] . '/(.+?)/' . $taxonomies[$widget_options['tag_tax']]->rewrite['slug'] . '/(.+?)/?$' => 'index.php?' . $taxonomies[$widget_options['category_tax']]->query_var . '=' . $wp_rewrite->preg_index(1) . '&' . $taxonomies[$widget_options['tag_tax']]->query_var . '=' . $wp_rewrite->preg_index(2));$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;}}}add_action( 'generate_rewrite_rules', 'add_rewrite_rules' );register_activation_hook( 'cat-tag-filter-widget/cat-tag-filter.php', array('cat_tag_filter', 'install') );?>

    Read on wp.org ↗
  2. ★★★★★ paulus244
    4.8y ago

    still working with current WP version

    Read on wp.org ↗
  3. ★★★★★ photoburt
    8.6y ago

    <p>Doesn’t work on php8</p> This topic was modified 3 years, 4 months ago by photoburt. Reason: upgraded to php 8 This topic was modified 3 years, 4 months ago by photoburt. This topic was modified 3 years, 4 months ago by photoburt. This topic was modified 3 years, 4 months ago by photoburt.

    Read on wp.org ↗
  4. ★★★★★ ororo
    12.4y ago

    I’ve used this plugin to let the user filter between custom taxonomies associated to custom post: it do its job in an amazing way, also with permalinks and smart urls. Thanks for your job, and good luck!

    Read on wp.org ↗
  5. ★★★★★ cr8tivNomad - Al Harji
    12.6y ago

    nice plugin, thank you

    Read on wp.org ↗
  6. ★★★★★ Bob
    13.6y ago

    This plugin has been abandoned by the developer because of insufficient donations.

    Read on wp.org ↗
  7. ★★★★★ loudcow
    13.7y ago

    The plugin says it is not compatible up to 3.5.1 but I’ve not encountered any problems. A very simple sorting functionality concept for visitors to a WP Site to sort and list posts via specific categories and posts – can’t believe it’s the only one I could find in the plugin repository that could do this? SO thanks a bunch to the developer.

    Read on wp.org ↗
  8. ★★★★★ Christian Rodríguez
    13.9y ago

    The plugin now creates a pretty URL combining different taxonomies. Just PERFECT! Thank you so much : D

    Read on wp.org ↗

Behavioral tests

via WP Hive

Automated install-time checks, tested on PHP 7.2.16 · WP 5.2.4

✓ Low memory footprint
✓ Low page-speed impact
✕ Runs on latest PHP + WP
✕ No PHP errors
✓ No JS errors
✓ Activates cleanly
✓ No resource errors
✓ No external HTTP errors
✓ Optimized database use
✕ Frequently updated

AI assistants

How it's measured →

Whether ChatGPT and Claude name this plugin when asked the category question, and whether the readme gives them something to quote.

Not measured yet for this plugin’s topics. Its tracked searches are not among the measured topics. See the topics measured so far.

Readme readiness

2 of 8 pass · checked 29 Oct 2026

Can an assistant quote this readme? Eight deterministic checks over the wp.org listing, no model involved.

  • ✓ Says what it does "This plugin adds a widget to your WordPress site that gives your visitors an ability to filter all your pos..."
  • ! Has a FAQ No FAQ section.
  • ! FAQ asks real questions No FAQ to judge.
  • ! Names who it is for Never says who the plugin is for or what they use it for.
  • ! Names what it works with Names no plugin, service or platform it works with.
  • ! Headings and lists 0 headings and 0 lists; assistants quote headed sections and bullet lists, not paragraphs.
  • ! Enough to quote 983 characters of description; under 1,000 there is little to quote.
  • ✓ Tags match the text All 4 tags appear in the text.

Growth timeline

Install-tier crossings we have observed, and how long each tier took to outgrow

  1. 2025-01-06 200+ → 100+ down after 14 days in tier
  2. 2024-12-23 100+ → 200+ up after 3 days in tier
  3. 2024-12-20 200+ → 100+ down after 4 days in tier
  4. 2024-12-16 100+ → 200+ up after 7 days in tier
  5. 2024-12-09 200+ → 100+ down after 35 days in tier
  6. 2024-11-04 100+ → 200+ up after 1 days in tier
  7. 2024-11-03 200+ → 100+ down after 505 days in tier
  8. 2023-06-17 300+ → 200+ down after 256 days in tier

Competes with

The plugins that solve the same job, ranked by shared tags then reach, closest match first. The letter on the right is each plugin's health grade (A best, F worst).

Embed this report card

Drop a live Pulse card for Cat + Tag Filter into a readme, a review or a deck. It updates itself.

<iframe src="https://plugins.wpmayor.com/embed/cat-tag-filter-widget" width="480" height="300" style="border:0" loading="lazy" title="Cat + Tag Filter — Plugin Pulse"></iframe>
Preview card ↗

Cat + Tag Filter: 100+ active installs, 4.2★ (10 reviews). Plugin Pulse (WP Mayor), as of 2026-10-31. https://plugins.wpmayor.com/plugin/cat-tag-filter-widget

Spotted a number that looks wrong? Report a data issue and we'll check it against the source.