Opened 4 years ago
Last modified 2 weeks ago
#56254 new defect (bug)
PHP Warning: Undefined array key 1 wp-admin\menu-header.php on line 202
| Reported by: |
|
Owned by: | |
|---|---|---|---|
| Milestone: | Awaiting Review | Priority: | normal |
| Severity: | normal | Version: | |
| Component: | Administration | Keywords: | php81 has-patch needs-unit-tests |
| Focuses: | Cc: |
Description
i get the above warning when i use php version 8.1.6 in iis server,for php7.427 the code works , am using wordpress 6.0.1 released on jul 12 2022, am unable to fix it , kindly support , i get this error after succesfull login as admimistrator in plugin.php page , and other admin pages.
Change History (6)
This ticket was mentioned in PR #3140 on WordPress/wordpress-develop by Tabrisrp.
4 years ago
#2
- Keywords has-patch added
Check for non-empty array key 1 before using it with current_user_can() to avoid PHP warning
Trac ticket: https://core.trac.wordpress.org/ticket/56254
#3
@
4 years ago
- Keywords needs-unit-tests added
- Version trunk deleted
Adding needs-unit-tests since some were requested in the PR.
#4
@
3 years ago
The code in the foreach was introduced in [8691] over 15 years ago:
// 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes.
foreach ( $submenu_items as $sub_key => $sub_item ) {
if ( ! current_user_can( $sub_item[1] ) ) {
I wonder: Why would the capability element be missing in the $sub_item?
Adding defensive code before attempting to access it is good, but can hide a potential problem. I'm hesitant to move forward with the patch without first understanding the root cause.
Seems this code is expecting the format identified which includes the capability element being at index 1.
I'm wondering ..
- Should sub items always be an array with element
1as the capability? - Are there checks or set up of the array structure where the menu is created, i.e. executing before the above code runs?
- If yes, then this is likely a plugin or theme doing it wrong?
The answers will take investigation.
@pras88in more information is needed for contributors like me to investigate:
- Can you share the steps of how to reproduce the issue?
- Can you share the backtrace call stack given with the PHP error? Copy and paste the full error message here.
- After deactivating all of the plugins, does the issue go away? If yes, then one or more of the plugins is the issue. You can reactivate each plugin one-by-one to discover which is causing the problem. Then report the issue to the plugin author.
#5
@
3 years ago
Is this issue an incompatibility with PHP 8.1?
I don't think there's enough information to know if this is an issue in Core. Thus, I'm not adding the php-compatibility focus to list it in exclusions of PHP 8.1 compatibility.
#6
@
2 weeks ago
Reproduction Report
Description
This report validates whether the issue described in Trac #56254 can be reproduced.
Environment
- WordPress: 7.1-alpha-62161-src
- PHP: 8.3.30
- Server: nginx/1.29.7
- Database: mysqli (Server: 8.4.8 / Client: mysqlnd 8.3.30)
- Browser: Chrome 146.0.0.0
- OS: macOS
- Theme: Twenty Twenty-Five 1.4
- MU Plugins: None activated
- Plugins: None activated
Steps to Reproduce
- Install and activate the plugin below.
- Log in as an administrator and navigate to any wp-admin page.
- Observe the PHP warning in the debug log or on screen.
Minimal Reproduction Code
<?php /** * Plugin Name: Reproduce Trac #56254 */ add_action( 'admin_menu', 'r56254_register_menus' ); function r56254_register_menus(): void { add_menu_page( 'Reproduce #56254', // page title 'Reproduce #56254', // menu title 'manage_options', // capability 'reproduce-56254', // menu slug 'r56254_page_callback', // callback 'dashicons-warning', // icon 80 // position ); add_submenu_page( 'reproduce-56254', 'Good Submenu', 'Good Submenu', 'manage_options', // capability present 'reproduce-56254-good', 'r56254_page_callback' ); // Malformed submenu - missing capability global $submenu; // The array structure core expects: [title, capability, slug, page_title] // We deliberately omit index 1 (capability) to trigger the warning. $submenu['reproduce-56254'][] = [ 0 => 'Broken Submenu', // menu title // 1 => capability - INTENTIONALLY MISSING (triggers the bug) 2 => 'reproduce-56254-broken', // slug 3 => 'Broken Submenu', // page title ]; } function r56254_page_callback(): void { echo '<div class="wrap"><h1>Reproduce Trac #56254</h1></div>'; }
Actual Results
- ✅ Error condition occurs (reproduced).
Additional Notes
- The warning is reproducible, but this may be expected behavior on the core side.
add_submenu_page()enforces a non-empty capability as a required parameter, meaning the$sub_item[1]slot is always populated under normal usage. The missing key only appears when a plugin or theme bypasses the API and writes directly into the global$submenuarray with a malformed entry. This suggests the root cause likely lives in a third-party plugin rather than in WordPress core. The defensive guard proposed in PR would still be a reasonable hardening measure, but the underlying fault is arguably the misbehaving plugin.
Hi and welcome to Trac!
If you want site support, the support forums would be a better place to ask:
https://wordpress.org/support/forums/
However, I'll leave this ticket open for now. The undefined key is the user capability needed to display a sub-menu item in the side admin menu, and maybe the condition needs to check whether the key is set/non-empty before using
current_user_can().