{"id":3578,"date":"2008-08-23T22:15:30","date_gmt":"2008-08-23T22:15:30","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/multiple-category-selection-widget\/"},"modified":"2026-02-23T10:01:41","modified_gmt":"2026-02-23T10:01:41","slug":"multiple-category-selection-widget","status":"publish","type":"plugin","link":"https:\/\/kin.wordpress.org\/plugins\/multiple-category-selection-widget\/","author":255626,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"4.0.0","stable_tag":"4.0.0","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Multiple Category Selection Widget","header_author":"Isaac Rowntree","header_description":"","assets_banners_color":"","last_updated":"2026-02-23 10:01:41","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/zackdesign.biz","header_plugin_uri":"https:\/\/zackdesign.biz","header_author_uri":"https:\/\/zackdesign.biz","rating":2.7,"author_block_rating":0,"active_installs":100,"downloads":77721,"num_ratings":14,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.9":{"tag":"0.9","author":"zackdesign","date":"2008-08-23 22:45:10"},"0.9.1":{"tag":"0.9.1","author":"zackdesign","date":"2008-08-24 12:53:59"},"1.0":{"tag":"1.0","author":"zackdesign","date":"2009-02-05 03:23:17"},"1.1":{"tag":"1.1","author":"zackdesign","date":"2009-02-07 04:00:04"},"1.2":{"tag":"1.2","author":"zackdesign","date":"2009-02-09 05:36:13"},"2.0":{"tag":"2.0","author":"zackdesign","date":"2009-11-13 05:20:18"},"2.1":{"tag":"2.1","author":"zackdesign","date":"2010-01-28 05:20:14"},"2.1.1":{"tag":"2.1.1","author":"zackdesign","date":"2010-02-16 00:47:19"},"2.2":{"tag":"2.2","author":"zackdesign","date":"2010-07-19 06:37:50"},"2.2.1":{"tag":"2.2.1","author":"zackdesign","date":"2010-08-23 03:59:14"},"2.2.2":{"tag":"2.2.2","author":"zackdesign","date":"2010-08-24 23:24:42"},"2.2.3":{"tag":"2.2.3","author":"zackdesign","date":"2010-11-08 03:21:25"},"2.3":{"tag":"2.3","author":"zackdesign","date":"2011-01-15 04:52:56"},"2.4":{"tag":"2.4","author":"zackdesign","date":"2011-04-12 23:55:13"},"3":{"tag":"3","author":"zackdesign","date":"2011-06-09 06:45:51"},"3.1":{"tag":"3.1","author":"zackdesign","date":"2011-06-18 04:45:22"},"3.1.1":{"tag":"3.1.1","author":"zackdesign","date":"2011-06-23 03:48:37"},"3.1.3":{"tag":"3.1.3","author":"zackdesign","date":"2013-04-01 04:52:35"},"3.1.4":{"tag":"3.1.4","author":"zackdesign","date":"2014-08-21 05:40:15"},"3.1.5":{"tag":"3.1.5","author":"zackdesign","date":"2014-08-21 05:59:45"},"3.1.6":{"tag":"3.1.6","author":"zackdesign","date":"2015-09-23 08:34:33"},"3.2.0":{"tag":"3.2.0","author":"zackdesign","date":"2026-02-23 09:32:05"},"4.0.0":{"tag":"4.0.0","author":"zackdesign","date":"2026-02-23 10:01:41"}},"upgrade_notice":[],"ratings":{"1":"7","2":"1","3":"1","4":"1","5":"5"},"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"mcsw\/filter":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"mcsw\/filter","version":"4.0.0","title":"Multi-Category Filter","category":"widgets","icon":"category","description":"Filter posts by selecting multiple categories using dropdown menus.","attributes":{"excludedCats":{"type":"string","default":""},"defaultCategory":{"type":"number","default":0},"searchType":{"type":"string","default":"in","enum":["in","and"]},"blankSearch":{"type":"string","default":"none","enum":["none","all"]},"orderBy":{"type":"string","default":"default","enum":["default","title"]},"userChoice":{"type":"boolean","default":false}},"supports":{"html":false,"align":["wide","full"]},"textdomain":"mcsw","editorScript":"file:.\/js\/block-editor.js","style":"file:.\/css\/style.css"}},"tagged_versions":null,"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Widget settings in Appearance &gt; Widgets","2":"Category filter form on the frontend","3":"Block settings in the editor sidebar"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[89,2236,86,13353,162],"plugin_category":[43],"plugin_contributors":[81812],"plugin_business_model":[],"class_list":["post-3578","plugin","type-plugin","status-publish","hentry","plugin_tags-category","plugin_tags-filter","plugin_tags-post","plugin_tags-subcategory","plugin_tags-widget","plugin_category-customization","plugin_contributors-zackdesign","plugin_committers-zackdesign"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/multiple-category-selection-widget.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>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.<\/p>\n\n<p><strong>Available as:<\/strong><\/p>\n\n<ul>\n<li><strong>Gutenberg Block<\/strong> \u2014 \"Multi-Category Filter\" in the block inserter (new in v4)<\/li>\n<li><strong>Classic Widget<\/strong> \u2014 \"Multi-Category Selection\" in Appearance &gt; Widgets<\/li>\n<li><strong>Shortcode<\/strong> \u2014 <code>[mcsw]<\/code> on any page or post<\/li>\n<\/ul>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>AND \/ OR category filtering \u2014 find posts matching ALL or ANY selected categories<\/li>\n<li>AJAX chained drilldown \u2014 selecting a parent dynamically loads its children<\/li>\n<li>Pretty permalink URLs (<code>\/categories\/3,5\/search_type\/and\/order\/title\/<\/code>)<\/li>\n<li>Ordering by title or default<\/li>\n<li>Configurable blank search behavior<\/li>\n<li>Exclude specific categories<\/li>\n<li>Lightweight \u2014 no jQuery, no external dependencies<\/li>\n<li>Pagination support<\/li>\n<li>Display form above results on category pages (optional)<\/li>\n<\/ul>\n\n<p><strong>Sample use case:<\/strong><\/p>\n\n<p>Real estate \u2014 set up parent categories like \"Bedrooms\", \"Bathrooms\", \"Price Range\" with sub-categories beneath them. Users filter listings by selecting from each dropdown.<\/p>\n\n<p><strong>Upgrading from v3.x:<\/strong><\/p>\n\n<ul>\n<li>PHP sessions have been removed entirely \u2014 the URL now carries all state, which means better compatibility with caching plugins, load balancers, and modern hosting<\/li>\n<li>jQuery has been replaced with vanilla JavaScript<\/li>\n<li>CSS classes have changed from <code>wpmcsw<\/code>\/<code>wpmm<\/code> to BEM-style <code>mcsw-*<\/code> classes \u2014 update any custom CSS<\/li>\n<li>The old <code>select-chain.js<\/code> in the plugin root has been replaced by <code>js\/select-chain.js<\/code><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate through the Plugins menu<\/li>\n<li>Create parent categories with sub-categories beneath them<\/li>\n<li>Add posts and assign them to the sub-categories<\/li>\n<\/ol>\n\n<p><strong>As a block:<\/strong>\nIn the block editor, search for \"Multi-Category Filter\" and add it.<\/p>\n\n<p><strong>As a widget:<\/strong>\nGo to Appearance &gt; Widgets and add \"Multi-Category Selection\" to a sidebar.<\/p>\n\n<p><strong>As a shortcode:<\/strong>\nAdd <code>[mcsw]<\/code> to any page or post. Configure the shortcode form settings under Settings &gt; Multiple Category Selection.<\/p>\n\n<p><strong>AJAX chaining example:<\/strong><\/p>\n\n<p>Create a category hierarchy like:\nCountry\n - Australia\n   - State\n     - Vic\n     - NSW\n - New Zealand\n   - State\n     - Auckland\n     - Wellington<\/p>\n\n<p>Enable \"AJAX Chaining\" in Settings &gt; Multiple Category Selection. Selecting \"Australia\" will dynamically show the Australian states.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"any%20vs%20all%20is%20not%20working%3F\"><h3>ANY vs ALL is not working?<\/h3><\/dt>\n<dd><p>Click the \"Reset\" button first to clear the current filter, then try again.<\/p><\/dd>\n<dt id=\"the%20dropdowns%20aren%27t%20appearing\"><h3>The dropdowns aren't appearing<\/h3><\/dt>\n<dd><p>Dropdowns only appear for parent categories that have sub-categories with published posts. Make sure your categories have posts assigned.<\/p><\/dd>\n<dt id=\"can%20i%20style%20the%20dropdowns%3F\"><h3>Can I style the dropdowns?<\/h3><\/dt>\n<dd><p>Yes. The form uses <code>.mcsw-form<\/code>, each dropdown is in <code>.mcsw-select-wrap<\/code>, and AJAX-chained results use <code>.mcsw-chained<\/code>. See the plugin's <code>css\/style.css<\/code> for the full class list.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>4.0.0<\/h4>\n\n<ul>\n<li>New: Gutenberg block \u2014 \"Multi-Category Filter\" available in the block editor<\/li>\n<li>New: Lightweight CSS file with clean BEM-style classes<\/li>\n<li>Removed: PHP sessions \u2014 all search state now carried in URL query parameters<\/li>\n<li>Removed: jQuery dependency \u2014 AJAX chaining rewritten in vanilla JavaScript<\/li>\n<li>Fixed: AJAX chaining now sends the nonce (was broken since v3.2.0)<\/li>\n<li>Fixed: Shortcode now returns output instead of echoing (proper shortcode behavior)<\/li>\n<li>Fixed: Rewrite rules no longer flushed on every page load (only on activation)<\/li>\n<li>Fixed: AJAX handler uses wp_send_json_success() instead of print\/die<\/li>\n<li>Changed: Admin settings page uses dedicated slug instead of <strong>FILE<\/strong><\/li>\n<li>Changed: All redirect calls use wp_safe_redirect()<\/li>\n<li>Changed: Requires WordPress 6.0+<\/li>\n<li>Security: Tightened input validation with sanitize_key(), absint(), whitelist checks<\/li>\n<\/ul>\n\n<h4>3.2.0<\/h4>\n\n<ul>\n<li>PHP 8.x compatibility: replaced create_function() with anonymous function<\/li>\n<li>Security: ABSPATH guards, nonce verification, input sanitization, output escaping<\/li>\n<li>Replaced get_bloginfo('url') with home_url()<\/li>\n<\/ul>\n\n<h4>3.1.6<\/h4>\n\n<ul>\n<li>Tested in WP 4.3.1<\/li>\n<li>Updated widget implementation to PHP 5 methodology<\/li>\n<\/ul>\n\n<h4>3.1.5<\/h4>\n\n<ul>\n<li>Tested in WP 3.8<\/li>\n<li>Fixed overriding the navigation menu WP script<\/li>\n<\/ul>\n\n<h4>3.1.4<\/h4>\n\n<ul>\n<li>Tested in WP 3.7<\/li>\n<li>Fixed media library files missing after plugin search<\/li>\n<\/ul>\n\n<h4>3.1.3<\/h4>\n\n<ul>\n<li>Tested in WP 3.5.2<\/li>\n<li>Fixed AND\/IN rewrite rules<\/li>\n<\/ul>\n\n<h4>3.1.1<\/h4>\n\n<ul>\n<li>Extensive testing on any\/all search<\/li>\n<li>Reverted select box layout<\/li>\n<\/ul>\n\n<h4>3.1<\/h4>\n\n<ul>\n<li>Created admin settings page<\/li>\n<li>Added shortcode [mcsw]<\/li>\n<li>AJAX on\/off toggle<\/li>\n<li>Form display above results toggle<\/li>\n<\/ul>\n\n<h4>3.0<\/h4>\n\n<ul>\n<li>Support for multiple forms on a page<\/li>\n<li>Shortcode support<\/li>\n<li>Rewrite rule fixes<\/li>\n<\/ul>\n\n<h4>2.4<\/h4>\n\n<ul>\n<li>Rewrite rules only flush on activation<\/li>\n<\/ul>\n\n<h4>2.3<\/h4>\n\n<ul>\n<li>Fixed variable checking<\/li>\n<li>Added title ordering<\/li>\n<\/ul>\n\n<h4>2.2<\/h4>\n\n<ul>\n<li>AJAX chained select boxes<\/li>\n<\/ul>\n\n<h4>2.1<\/h4>\n\n<ul>\n<li>WordPress 2.8+ widget class with multiple instances<\/li>\n<\/ul>\n\n<h4>2.0<\/h4>\n\n<ul>\n<li>Fixed permalink issues<\/li>\n<li>All-in-one-SEO and WP Smart Sort compatibility<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>First release<\/li>\n<\/ul>","raw_excerpt":"Filter posts by selecting multiple categories using dropdown menus. Available as a widget, block, or shortcode.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/3578","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=3578"}],"author":[{"embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/zackdesign"}],"wp:attachment":[{"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=3578"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=3578"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=3578"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=3578"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=3578"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=3578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}