Widgets: Prevent fatal errors in PHP 8 when retrieve_widgets() and wp_map_sidebars_widgets() attempt to merge non-array values.

Props kesselb, lakshyajeet, hellofromTonya, janthiel, ikriv, audrasjb, mtg169, bartnv, pmbaldha, mindctrl, westonruter, jrf.
Fixes #57469.

Built from https://develop.svn.wordpress.org/trunk@60732


git-svn-id: http://core.svn.wordpress.org/trunk@60068 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Weston Ruter
2025-09-12 18:05:36 +00:00
parent 7f13088e92
commit 8526fb29fb
2 changed files with 15 additions and 1 deletions

View File

@@ -16,7 +16,7 @@
*
* @global string $wp_version
*/
$wp_version = '6.9-alpha-60731';
$wp_version = '6.9-alpha-60732';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.

View File

@@ -1350,6 +1350,13 @@ function retrieve_widgets( $theme_changed = false ) {
$sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids );
$sidebars_widgets = wp_map_sidebars_widgets( $sidebars_widgets );
// Replace non-array values inside the array with an empty array.
foreach ( $sidebars_widgets as $key => $value ) {
if ( ! is_array( $value ) ) {
$sidebars_widgets[ $key ] = array();
}
}
// Find hidden/lost multi-widget instances.
$shown_widgets = array_merge( ...array_values( $sidebars_widgets ) );
$lost_widgets = array_diff( $registered_widgets_ids, $shown_widgets );
@@ -1511,6 +1518,13 @@ function wp_map_sidebars_widgets( $existing_sidebars_widgets ) {
$old_sidebars_widgets = _wp_remove_unregistered_widgets( $old_sidebars_widgets );
// Replace non-array values inside the array with an empty array.
foreach ( $new_sidebars_widgets as $key => $value ) {
if ( ! is_array( $value ) ) {
$new_sidebars_widgets[ $key ] = array();
}
}
if ( ! empty( $old_sidebars_widgets ) ) {
// Go through each remaining sidebar...