Description
Turn your WordPress post categories into a search powerhouse! This plugin gives you a set of dropdown menus based on parent categories and their sub-categories. Users select one sub-category per parent, and the plugin filters posts matching the selected combination.
Available as:
- Gutenberg Block — “Multi-Category Filter” in the block inserter (new in v4)
- Classic Widget — “Multi-Category Selection” in Appearance > Widgets
- Shortcode —
[mcsw]on any page or post
Features:
- AND / OR category filtering — find posts matching ALL or ANY selected categories
- AJAX chained drilldown — selecting a parent dynamically loads its children
- Pretty permalink URLs (
/categories/3,5/search_type/and/order/title/) - Ordering by title or default
- Configurable blank search behavior
- Exclude specific categories
- Lightweight — no jQuery, no external dependencies
- Pagination support
- Display form above results on category pages (optional)
Sample use case:
Real estate — set up parent categories like “Bedrooms”, “Bathrooms”, “Price Range” with sub-categories beneath them. Users filter listings by selecting from each dropdown.
Upgrading from v3.x:
- PHP sessions have been removed entirely — the URL now carries all state, which means better compatibility with caching plugins, load balancers, and modern hosting
- jQuery has been replaced with vanilla JavaScript
- CSS classes have changed from
wpmcsw/wpmmto BEM-stylemcsw-*classes — update any custom CSS - The old
select-chain.jsin the plugin root has been replaced byjs/select-chain.js
Blocks
This plugin provides 1 block.
- Multi-Category Filter Filter posts by selecting multiple categories using dropdown menus.
Installation
- Upload the plugin folder to
/wp-content/plugins/ - Activate through the Plugins menu
- Create parent categories with sub-categories beneath them
- Add posts and assign them to the sub-categories
As a block:
In the block editor, search for “Multi-Category Filter” and add it.
As a widget:
Go to Appearance > Widgets and add “Multi-Category Selection” to a sidebar.
As a shortcode:
Add [mcsw] to any page or post. Configure the shortcode form settings under Settings > Multiple Category Selection.
AJAX chaining example:
Create a category hierarchy like:
Country
– Australia
– State
– Vic
– NSW
– New Zealand
– State
– Auckland
– Wellington
Enable “AJAX Chaining” in Settings > Multiple Category Selection. Selecting “Australia” will dynamically show the Australian states.
FAQ
-
ANY vs ALL is not working?
-
Click the “Reset” button first to clear the current filter, then try again.
-
The dropdowns aren’t appearing
-
Dropdowns only appear for parent categories that have sub-categories with published posts. Make sure your categories have posts assigned.
-
Can I style the dropdowns?
-
Yes. The form uses
.mcsw-form, each dropdown is in.mcsw-select-wrap, and AJAX-chained results use.mcsw-chained. See the plugin’scss/style.cssfor the full class list.
Reviews
Contributors & Developers
“Multiple Category Selection Widget” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Multiple Category Selection Widget” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
4.0.0
- New: Gutenberg block — “Multi-Category Filter” available in the block editor
- New: Lightweight CSS file with clean BEM-style classes
- Removed: PHP sessions — all search state now carried in URL query parameters
- Removed: jQuery dependency — AJAX chaining rewritten in vanilla JavaScript
- Fixed: AJAX chaining now sends the nonce (was broken since v3.2.0)
- Fixed: Shortcode now returns output instead of echoing (proper shortcode behavior)
- Fixed: Rewrite rules no longer flushed on every page load (only on activation)
- Fixed: AJAX handler uses wp_send_json_success() instead of print/die
- Changed: Admin settings page uses dedicated slug instead of FILE
- Changed: All redirect calls use wp_safe_redirect()
- Changed: Requires WordPress 6.0+
- Security: Tightened input validation with sanitize_key(), absint(), whitelist checks
3.2.0
- PHP 8.x compatibility: replaced create_function() with anonymous function
- Security: ABSPATH guards, nonce verification, input sanitization, output escaping
- Replaced get_bloginfo(‘url’) with home_url()
3.1.6
- Tested in WP 4.3.1
- Updated widget implementation to PHP 5 methodology
3.1.5
- Tested in WP 3.8
- Fixed overriding the navigation menu WP script
3.1.4
- Tested in WP 3.7
- Fixed media library files missing after plugin search
3.1.3
- Tested in WP 3.5.2
- Fixed AND/IN rewrite rules
3.1.1
- Extensive testing on any/all search
- Reverted select box layout
3.1
- Created admin settings page
- Added shortcode [mcsw]
- AJAX on/off toggle
- Form display above results toggle
3.0
- Support for multiple forms on a page
- Shortcode support
- Rewrite rule fixes
2.4
- Rewrite rules only flush on activation
2.3
- Fixed variable checking
- Added title ordering
2.2
- AJAX chained select boxes
2.1
- WordPress 2.8+ widget class with multiple instances
2.0
- Fixed permalink issues
- All-in-one-SEO and WP Smart Sort compatibility
1.0
- First release