Multiple Category Selection Widget

This widget makes it easy for your site users to drill down into your WordPress post categories.

Author:zackdesign (profile at wordpress.org)
WordPress version required:6.0
WordPress version tested:6.9.1
Plugin version:4.0.0
Added to WordPress repository:23-08-2008
Last updated:23-02-2026
Rating, %:58
Rated by:14
Plugin URI:https://zackdesign.biz
Total downloads:77 710
Active installs:200+
plugin download
Click to start download

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/wpmm to BEM-style mcsw-* classes — update any custom CSS
  • The old select-chain.js in the plugin root has been replaced by js/select-chain.js

FAQ
ChangeLog