The custom menu 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! PHP 7.0 compatible
Enable the plugin and go to Appearance > Menus. Create your Custom Menu. Add a taxonomy (category/tag/custom) to the menu. Next, you can choose if you would like to replace the original link (to a page that lists the items) by the posts and pages themselves.
For each Category or Post Tag item in the menu, you now have the following extra configuration options:
- replace the link by a list of posts in the menu y/n;
- specify the (maximum) number of posts you want to show for this item (-1 = all, 0 also allowed now);
- their ordering ascending or descending by ID, Author, Title and other properties. See ‘Other Notes > Ordering’;
- keep or remove the original menu item (always / only if there are no posts / never);
- specify the title for the menu items. For this you can use %post_title, %post_author and other wildcards, see ‘Other Notes > Wildcards’.
This plugin uses the wp_nav_menu_objects filter hook to remove and replace category items in the menu by the posts in that category. It extends Walker_Nav_Menu_Edit to add input fields to Appearance > Menus and adds some CSS to style this properly.
The plugin now supports the wp_nav_menu_item_custom_fields hook and should be compatible with other plugins that also use this hook.
You can control the title of the menu items generated by the plug-in with the following wildcards:
- %post_featured_image (insers an HTML ‘img’ tag with the featured image or nothing if there is none)
- %post_featured_image_thumb (insers an HTML ‘img’ tag with the featured image thumbnail or nothing if there is none)
- %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>)
- %post_modified(<your formatting here>)
- %post_modified_gmt(<your formatting here>)
- wildcards for custom fields, like %post_my_field, where ‘my field’ or ‘my_field’ is a custom field
The following wildcards are deprecated:
- %post_feat_image (url only)
- %post_feat_image_thumb (url only)
You can control the ordering of the items in the menu by sorting ascending or descending on the following properties:
- Last Modified
- Post/Page parent ID
- Random Order
- Number of Comments
- Menu Order – Ordering by menu order is only possible for hierarchical types, such as pages. These have the ‘Order’ option when editing, this is the menu order.
Extend the plugin
The plugin behavior can be extended.
To extend the backend with your own controls and use them in the posts query, add the following:
- Action “cpcm_custom_fields”: Use this to extend the custom fields to add to the Category Posts in Custom Menu container in Appearance > Menus
- Filter “cpcm_filter_posts_query”: This filter is called when the menu_item is of taxonomy type and the “Create submenu containing links to posts in this category” is checked. Here, you can add or modify the posts query to your liking.
To add your own wildcards, add the following:
- Filter “cpcm_replace_user_wildcards”: Called after all default CPCM wildcards have been processed.
You can see an example in the sample-cpcm-extension directory, included in the plugin code.
- Activate the plugin through the ‘Plugins’ menu in WordPress
How do I use it?
Here’s a walkthrough:
- Enable the Twenty Eleven theme.
- Disable all plugins except Category Posts in Custom Menu.
- Create a post with title “Post 1” and add a _new_ category “Category A”
- Save the post
- Go to Appearances > Menus
- Click “create a new menu”
- Add the category “Category A” by opening “Categories”, checking that category and clicking “Add to menu”
- Open the menu item and check “Create submenu containing links to posts with this tag.”
- Do not change anything else about the menu item
- Scroll all the way down and check under “Theme Locations” the checkbox “Primary Menu”
- Save the menu
If you now look at your blog, you will have a menu with only one item: “Category A”. If you hover over that item with the mouse, it will open, and a post is displayed titled “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 );
When another plugin or theme, other than CPCM, has a higher priority than CPCM and overwrite sthe fields in Appearances > Menus, this means CPCM’s fields won’t show. (Verify by disabling all plugins and check if the CPCM fields now show.)
There is no way to go around this with native WordPress hooks. A proposed solution is for all plugin and theme users to start calling and using a custom hook. CPCM does this. The proposed hook is
wp_nav_menu_item_custom_fields. Several plugin authors are using this hook. If another plugin is not compatible, contact the author and request they start using this hook. Also see https://core.trac.wordpress.org/ticket/18584#comment:62
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.”
This problem should only occur if:
- Your WordPress version is 3.0 or before: Issue 14527 (https://core.trac.wordpress.org/ticket/14527) may be the cause. When adding a menu item but before saving it, you will indeed see none of the promised checkboxes. So be sure to save your menu after you add a Category/Tag to your menu. Then you’ll see the added functionality. Please update your WordPress version to at least 3.0.1.
- You’re using an old version of Category Posts in Custom Menu. Please update to the latest version of CPCM.
- Other theme or plugin conflicts. 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?
After a long hiatus, 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.