WARNING: Version 2.0 has breaking changes! See changelog.
The default custom menu in WordPress only allows adding a link that leads to a list of posts and pages belonging to a taxonomy (category, tag, etc). If you want to list the posts and pages themselves and if you want WordPress to do this automatically for you, then I hope you will find this plugin useful.
Also works for custom taxonomies and custom post types!
Enable the plugin and go to either Appearance > Menus or Appearance > Customize. Add a category (or other taxonomy like tag or custom) to the menu. Next, you can choose if you would like to replace the category by the posts or pages themselves.
For each category in your menu, you now have the following extra configuration options:
- Replace by posts in the category y/n;
- specify the (maximum) number of posts you want to show for this item (1 to 10);
- their ordering ascending or descending by Title, Date or Menu Order;
- specify the title for the menu items. For this you can use %post_title, %post_author and other wildcards, see ‘Other Notes > Wildcards’.
You can control the title of the menu items generated by the plug-in with the following wildcards:
- %post_date for the unformatted post date: 2012-11-10 18:14:23
- %post_date() for a formatted post date with the following default formatting: November 10th, 2012
- %post_date(<your formatting here>) for custom date formatting. Example: %post_date(l jS \of F Y, h:i:s A). See https://codex.wordpress.org/Formatting_Date_and_Time for formatting options.
- %post_date_gmt(<your formatting here>)
category-posts-in-custom-menufolder to the
- Activate the plugin through the ‘Plugins’ menu in WordPress
How do I use it?
Here’s a walkthrough:
- Create a post with title “Post 1” and add a _new_ category “Category A”
- Save the post
- Go to Appearances > Menus (or via Appearance > Customize, in WordPress 5.4 or higher)
- Add your category named “Category A”
- Open the menu item and check “Replace by posts with this category.”
- Save the menu
If you now look at your website, “Category A” is replaced by “Post 1”. Add additional posts to Category A and you will see these additional posts in the menu.
Missing CSS classes
The CSS class ‘current-post-ancestor’ is not applied correctly. This is a bug in WordPress that I have reported here: https://core.trac.wordpress.org/ticket/32918 This is not something I am able to fix in the plugin, it has to be fixed in WordPress. I’m sorry for the inconvenience.
The plugin is potentially very expensive, especially when you decide to build your entire menu out of nothing but category posts.
The solution would be to cache the menu using transients, as reported here https://wordpress.org/support/topic/performance-problem-many-database-queries?replies=11#post-7829450
$my_cached_menu = get_transient( ‘my_cached_menu’);
if( $my_cached_menu === false )
$my_cached_menu = wp_nav_menu( … );
set_transient( “my_cached_menu_”, $my_cached_menu, YEAR_IN_SECONDS );
Can’t see it working in any way
Problem: “I can’t see what effect it has had. Nothing has changed (not that I can see) in the Appearance > Menu page. Just like before.”
If you are using a recent version of category Posts in Custom Menu and an updated version of WordPress, the problem can only occur due to your theme or other plugins conflicting with Category Posts in Custom Menu. Please disable all themes and plugins except CPCM; verify that the CPCM fields show; enable other plugins and themes one by one to determine which plugin/theme conflicts with CPCM.
Contributors & Developers
“Category Posts in Custom Menu” is open source software. The following people have contributed to this plugin.Contributors
Interested in development?
Verified compatibility with WordPress 6.4.
Free version now also supports sorting by Menu Order.
Verified compatibility with WordPress 6.3.
Also re-verified compatibility with older versions: Tested against 4.9.23 and 5.9.7
- Menus can now also be managed via Appearance > Customize (Requires WordPress 5.4 or higher)
WARNING: Version 2.0 has breaking changes! See changelog.
Bugfix: On some mobile themes, the dropdown caret did not show. (As reported here: https://wordpress.org/support/topic/mobile-sub-menu-3/, and here: https://wordpress.org/support/topic/not-working-on-mobile-devices-16/)
Split Free and Premium version:
- Premium has extra wildcards that Free doesn’t have.
- Premium allows expanding unlimited posts; Free is limited to 10 posts.
- Premium allows preserving the original menu item; Free always removes the category to replace it by the posts below it.
- Premium allows filtering out the subcategories; Free always returns posts in subcategories when the parent category is selected
- Premium supports HTML in the label field; Free only supports plaintext.
- Premium offers hooks to extend the plugin functionality; Free does not.
Now compatible with WordPress 5.7.
If you are on a WordPress version between 4.7 and 5.7.2, when encountering issues please report the WordPress version you’re running.
- Rename __empty to custom_empty to suppress PHP 7.0 validation warning as reported here: https://wordpress.org/support/topic/php-7-compability-2/
- Add another sample extension (from github)
- Update readme to reflect that it’s PHP7.0 compatible, as mentioned here: https://wordpress.org/support/topic/php-7-compability-2/
- Hide the options when ‘Create submenu …’ is not checked, thanks for contribution by websevendev
- Fix compatibility issue with 4.7, resulting in options not being shown.
- Allow users to plug-in their own wildcards to facilitate https://wordpress.org/support/topic/show-category-post_category?replies=3
- Edit readme to explain usage of the custom wp_nav_menu_item_custom_fields that several plugin authors have been using.
- Add example implementation to the sample extension that shows how to extend the CSS classes of the menu items
- Unit tests
- Only commit meta data for menu items that actually had a CPCM checkbox, reported here https://wordpress.org/support/topic/undefined-index-56
- Set default skip parameter to 0, as reported here https://wordpress.org/support/topic/posts-assigned-to-more-than-one-category-are-not-listed-correctly?replies=3
- Fixed serious bug in versioning, which resulted in version 1.1 having no settings at all anymore. This fix has been tested with both both the upgrade path 1.0.1 -> 1.2 and upgrade path 1.0.1 -> 1.1 -> 1.2, both upgrade paths should be fined now. My sincere apologies to all who experienced this issue.
- Fixed debug errors as reported here https://wordpress.org/support/topic/undefined-index-56?replies=7
- Process custom fields last, so that users cannot override the built-in options like %post_featured_image with a custom field named “featured_image”. As reported here https://wordpress.org/support/topic/category-lastes-post-with-images?replies=7#post-7052239
- Allow others to extend my CPCM plugin with their own fields. Also includes a sample that shows how to do this. https://wordpress.org/support/topic/exclude-single-posts?replies=5
- Some comments and code formatting
- Introduced plugin versioning in code in order to perform data conversion
- Converted “cpcm-” custom fields to “_cpcm-” so that they don’t show on post edit pages and the like.
- Update contact information
- Ensure that excluding subcategories now also works for custom taxonomies. Only show the dropdown for hierarchical taxonomies. (Tags no longer show ‘Subcategory posts’ dropdown.)
- Add custom CSS classes, as suggested here https://wordpress.org/support/topic/adding-css-classes-to-the-newly-displayed-menu-items
- Added hook wp_nav_menu_item_custom_fields for compatibility with other plug-ins adding fields to the Appearances > Menus page.
- Fix for CSS class bugs reported by brangelo in https://wordpress.org/support/topic/works-with-41-as-far-as-i-can-tell?replies=5.
- Bugfix: normal menu items that were below a menu item removed by cpcm, are now repositioned in the menu correctly.
- Bugfix for subcategories with a single post with setting remove=”only if empty”: “For example, I have a parent category A with sub categories A1, A2 and A3. I have all sub categories set to remove only if there are no posts. Subcat A1 displays with submenu of posts (2), subcats A2 and A3 do not display and their posts (1 each) show directly under the parent as posts links.”
- Bugfix: Correctly set the menu item parents. Relevant when nesting categories with ‘Create submenu’ checked.
- First implementation (WIP) for request: https://wordpress.org/support/topic/replace-category-link-with-link-to-first-post?replies=10
When the menu item is marked as remove “always” or “only if empty” and there was one post, then make sure that any childen of the menu item become children of this single post.
- Implement skip-parameter
- Implemented exclusion of subcategories, useful alternative to https://wordpress.org/support/topic/is-it-possible-to-get-sub-category-post-nested
- Fixed https://wordpress.org/support/topic/great-job-please-contact-me?replies=2. You can now specify 0 in ‘Number of posts’. That way, the category can be shown/hidden based on whether it is empty or not.
- Fixed https://wordpress.org/support/topic/post_date. Forward slash is now accepted in date formatting.
- Fix https://wordpress.org/support/topic/date-fields-for-menu-title-dont-work due to variable $string that has been moved out of the global scope in new WordPress release.
- Fix https://wordpress.org/support/topic/issue-with-default-wordpress-sidebar-menu
- Fix https://wordpress.org/support/topic/menu-do-not-include-the-current-menu-parent-class
- Add support for auto-generated image tags, see https://wordpress.org/support/topic/images-showing-url-instead-of-actual-image
- Fixed bug introduced in 0.9.1 with respect to old PHP versions (5.2 and before) https://wordpress.org/support/topic/unexpected-t_function-1
- Introduced an extra ordering option ‘Menu Order’, as suggested here: https://wordpress.org/support/topic/extend-orderby-to-menu_order
- Edits for strict mode (https://wordpress.org/support/topic/edits-for-strict-mode)
- Add thumbnail option with posts (https://wordpress.org/support/topic/add-thumbnail-option-with-posts)
- PHP 5.5 preg_replace() /e modifier deprecated (https://wordpress.org/support/topic/php-55-preg_replace-e-modifier-depricated)
- Fixed CSS ‘active’ class problem: CSS classes are no longer copied from the parent menu item to the menu item for the posts/pages.
- Added the option to keep or remove the original menu item. Initially, the original menu item was replaced by the list of its posts, but now you can choose for yourself whether this should be done (always / only if there are no posts / never)
- Bugfix: Fixed invalid argument error reported by macrocurio in Plugin Support.
- Bugfix: Link Target, CSS Classes, Link Relationship (XFN) and Description weren’t inherited from the original menu item. They are now.
- Added support for custom post types
- Fixed user_data bug
- Added date formatting options
- Added a bunch of wildcards: %post_feat_image (url only), %post_excerpt, %post_url, %post_date, %post_date_gmt, %post_status, %post_modified, %post_modified_gmt, %post_comment_count
- Enable custom taxonomies.
- Change plugin URL.
- Fix plugin bug for Tags, probably related to 3.2.2 update.
- Edit documentation
- Change some CSS to show checkbox next to label instead of above it.
- Edit text in menu item block to clarify use of custom fields.
- Extended the plugin for use of custom fields. Use a custom field with name ‘my field’ with wildcard %post_my_field. Note that if the post does not have this custom field, the wildcard is removed (it is not replaced by anything).
- Extended the plugin to post tags. Note that the plugin name has unfortunately not been changed to reflect this extension.
Added checkboxes, dropdowns and text fields to Appearance > Menu. It is now possible to:
- Enable/disable per taxonomy item whether you want to replace it by its posts
- Specify the (maximum) number of posts that should be displayed.
- Specify the ordering (Descending/Ascending) and the field to order by (ID, title, etc..)
- Set a title for the menu items. For this you can use the wildcards %post_title and %post_author.