Make WordPress Core

Opened 10 months ago

Last modified 10 months ago

#58932 new defect (bug)

wp_setup_nav_menu_item() throws PHP warning when using virtual menu-items

Reported by: apedog's profile apedog Owned by:
Milestone: Awaiting Review Priority: normal
Severity: normal Version: 5.4
Component: Menus Keywords: has-patch
Focuses: Cc:


I believe this bug was introduced in 47211


wp_setup_nav_menu_item() calls get_post() but does no sanity checking before calling get_post_states() with what might be a null. Adding a simple if ( $menu_post !== null ) before calling get_post_states() resolves this issue.

I've added a patch.


I have an old plugin (pre-dating above commit) that renders custom dynamically-generated drop-down menus (eg. recent posts, yearly archives).
The plugin is somewhat based on but is a bit more involved. It's a stable and simple plugin.

The way the plugin works is it adds a single menu-item meta-box in the Menu editor page. However on the front it dynamically generates submenu items that don't show on the Edit Menu page. On the front the plugin creates virtual/fake WP_Post objects at runtime that are fed into Walker_Nav_Menu_Checklist. Therefore these objects have no corresponding $menu_post in the database.

Since WordPress 5.4, core throws multiple Attempt to read property "post_status|ID" on null notices on every page load. These notices have been upgraded to warnings in PHP 8.


Attachments (1)

changeset-58932.diff (671 bytes) - added by apedog 10 months ago.

Download all attachments as: .zip

Change History (2)

#1 @apedog
10 months ago

Perhaps a similar sanity check could be added to get_post_states() if parameter $post is null.

Note: See TracTickets for help on using tickets.