Opened 18 months ago
Last modified 8 months ago
#58932 reviewing defect (bug)
wp_setup_nav_menu_item() throws PHP warning when using virtual menu-items
Reported by: | apedog | Owned by: | joemcgill |
---|---|---|---|
Milestone: | Awaiting Review | Priority: | normal |
Severity: | normal | Version: | 5.4 |
Component: | Menus | Keywords: | has-patch reporter-feedback |
Focuses: | Cc: |
Description
I believe this bug was introduced in 47211
TLDR
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.
Details
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 https://www.ibenic.com/understanding-wordpress-menu-items/ 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.
wp-admin/includes/template.php:2288 get_post_states() wp-includes/nav-menu.php:839 wp_setup_nav_menu_item() wp-includes/nav-menu.php:839 array_map() wp-includes/nav-menu.php:727 wp_get_nav_menu_items() wp-admin/nav-menus.php:596
Attachments (1)
Change History (6)
This ticket was mentioned in Slack in #core by joemcgill. View the logs.
8 months ago
This ticket was mentioned in PR #6743 on WordPress/wordpress-develop by @joemcgill.
8 months ago
#4
This refreshes https://core.trac.wordpress.org/attachment/ticket/58932/changeset-58932.diff submitted by apedog.
Trac ticket: https://core.trac.wordpress.org/ticket/58932
Perhaps a similar sanity check could be added to
get_post_states()
if parameter$post
is null.