WordPress.org

Make WordPress Core

Opened 4 weeks ago

Closed 4 weeks ago

#51697 closed defect (bug) (reported-upstream)

[PHP8] Uncaught TypeError: array_flip():

Reported by: bph Owned by:
Milestone: 5.6 Priority: normal
Severity: normal Version: 5.6
Component: Administration Keywords: php8
Focuses: Cc:

Description (last modified by SergeyBiryukov)

while using trunk on php8 I ran into this error, when i try to access wp-admin pages.

Fatal error: Uncaught TypeError: array_flip(): Argument #1 ($array) must be of type array, null given in public_html/wp-admin/includes/menu.php:280 

Stack trace: 
#0 public_html/wp-admin/includes/menu.php(280): array_flip(NULL) 
#1 public_html/wp-admin/menu.php(327): require_once('/home/customer/...') 
#2 public_html/wp-admin/admin.php(158): require('/home/customer/...') 
#3 public_html/wp-admin/index.php(10): require_once('/home/customer/...') 
#4 {main} thrown in public_html/wp-admin/includes/menu.php on line 280

Change History (8)

#1 @bph
4 weeks ago

  • Version set to trunk

#2 @hellofromTonya
4 weeks ago

  • Keywords php8 added

#3 @davidbaumwald
4 weeks ago

  • Component changed from General to Menus

#4 @SergeyBiryukov
4 weeks ago

  • Component changed from Menus to Administration
  • Description modified (diff)
  • Milestone changed from Awaiting Review to 5.6

#5 @jrf
4 weeks ago

Hi @bph, thanks for reporting this!

This is not necessarily an issue with WP Core, but more likely an issue with a plugin or theme doing it wrong.

Relevant code in wp-admin/includes/menu.php:

<?php
        $menu_order = array();
        foreach ( $menu as $menu_item ) {
                $menu_order[] = $menu_item[2];
        }
        unset( $menu_item );
        $default_menu_order = $menu_order;

        $menu_order         = apply_filters( 'menu_order', $menu_order );
        $menu_order         = array_flip( $menu_order );
        $default_menu_order = array_flip( $default_menu_order );

$menu_order is an array and get pulled through the menu_order filter just before the array_flip(), so one of the functions filtering the variable will have broken things by either not returning anything or by returning null.

Now, it is tempting to add an (array) cast to fix this or to wrap the rest of the body of the condition in an if ( is_array( $menu_order ) ) {}, but that would only serve to hide the problem, not actually fix it.

This is a typical example of a filter which would really benefit from a type safe variant of apply_filters() as proposed in #51525.

For now, @bph, I'd like to ask you gather some more information either by using the Query Monitor or by using the Debug Bar Actions & Filter addon.

To figure out which plugin/theme/Core is causing the issue, we need to know what functions are hooked into the menu_order filter and where they are coming from (plugin/theme/Core) and if plugin/theme, preferably including information on which version of the plugin/theme you are using.

Once that information is available, all functions listed will need to be examined to figure out the culprit.

Last edited 4 weeks ago by jrf (previous) (diff)

#6 @noisysocks
4 weeks ago

Noting that I was seeing a warning to this effect while running PHP 7.4.12. GB26643 fixed it.

#7 @bph
4 weeks ago

Thank you @jrf for the detailed instructions on how to troubleshoot this further.
First, I will double-check on possible the fix @noisysocks indicates.

#8 @bph
4 weeks ago

  • Resolution set to reported-upstream
  • Status changed from new to closed

Tested with Gutenberg from master. PR 26643 fixed this instance. Closing it.

Note: See TracTickets for help on using tickets.