From e3f59a14e46b2a28e14f2c1070e0dbbe2d0ba164 Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Thu, 4 Jun 2026 17:31:07 -0400 Subject: [PATCH 01/17] Refactor: Extract `wp_delete_inactive_widgets()` for reuse in widget cleanup --- src/wp-admin/includes/ajax-actions.php | 15 ++----------- src/wp-admin/includes/widgets.php | 31 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/wp-admin/includes/ajax-actions.php b/src/wp-admin/includes/ajax-actions.php index 2af08fba70af9..935902553fc12 100644 --- a/src/wp-admin/includes/ajax-actions.php +++ b/src/wp-admin/includes/ajax-actions.php @@ -2489,19 +2489,8 @@ function wp_ajax_delete_inactive_widgets() { /** This action is documented in wp-admin/widgets-form.php */ do_action( 'sidebar_admin_setup' ); - $sidebars_widgets = wp_get_sidebars_widgets(); - - foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) { - $pieces = explode( '-', $widget_id ); - $multi_number = array_pop( $pieces ); - $id_base = implode( '-', $pieces ); - $widget = get_option( 'widget_' . $id_base ); - unset( $widget[ $multi_number ] ); - update_option( 'widget_' . $id_base, $widget ); - unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] ); - } - - wp_set_sidebars_widgets( $sidebars_widgets ); + require_once ABSPATH . 'wp-admin/includes/widgets.php'; + wp_delete_inactive_widgets(); wp_die(); } diff --git a/src/wp-admin/includes/widgets.php b/src/wp-admin/includes/widgets.php index e751602866b0d..9ff79f2d9f353 100644 --- a/src/wp-admin/includes/widgets.php +++ b/src/wp-admin/includes/widgets.php @@ -326,3 +326,34 @@ function wp_widget_control( $sidebar_args ) { function wp_widgets_access_body_class( $classes ) { return "$classes widgets_access "; } + +/** + * Removes all widgets from the inactive widgets sidebar and their corresponding settings. + * + * @since 6.7.0 + * + * @return void + */ +function wp_delete_inactive_widgets() { + $sidebars_widgets = wp_get_sidebars_widgets(); + + if ( empty( $sidebars_widgets['wp_inactive_widgets'] ) || ! is_array( $sidebars_widgets['wp_inactive_widgets'] ) ) { + return; + } + + foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) { + $pieces = explode( '-', $widget_id ); + $multi_number = array_pop( $pieces ); + $id_base = implode( '-', $pieces ); + $widget = get_option( 'widget_' . $id_base ); + + if ( is_array( $widget ) ) { + unset( $widget[ $multi_number ] ); + update_option( 'widget_' . $id_base, $widget ); + } + + unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] ); + } + + wp_set_sidebars_widgets( $sidebars_widgets ); +} From fb40fd95ce7d7093401df6ea3aa2ed7344bb9489 Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Fri, 5 Jun 2026 11:11:42 -0400 Subject: [PATCH 02/17] Change version number to 7.1.0 in docblock Update version number in docblock for wp_delete_inactive_widgets function. --- src/wp-admin/includes/widgets.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/includes/widgets.php b/src/wp-admin/includes/widgets.php index 9ff79f2d9f353..d22e3744f58cd 100644 --- a/src/wp-admin/includes/widgets.php +++ b/src/wp-admin/includes/widgets.php @@ -330,7 +330,7 @@ function wp_widgets_access_body_class( $classes ) { /** * Removes all widgets from the inactive widgets sidebar and their corresponding settings. * - * @since 6.7.0 + * @since 7.1.0 * * @return void */ From a4da5208697b1823b93d6c5738988d0031847247 Mon Sep 17 00:00:00 2001 From: Aki Hamano Date: Sun, 2 Aug 2026 16:28:13 +0900 Subject: [PATCH 03/17] Add void return type to wp_delete_inactive_widgets() --- src/wp-admin/includes/widgets.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/wp-admin/includes/widgets.php b/src/wp-admin/includes/widgets.php index d22e3744f58cd..9f11cfb1da148 100644 --- a/src/wp-admin/includes/widgets.php +++ b/src/wp-admin/includes/widgets.php @@ -331,10 +331,8 @@ function wp_widgets_access_body_class( $classes ) { * Removes all widgets from the inactive widgets sidebar and their corresponding settings. * * @since 7.1.0 - * - * @return void */ -function wp_delete_inactive_widgets() { +function wp_delete_inactive_widgets(): void { $sidebars_widgets = wp_get_sidebars_widgets(); if ( empty( $sidebars_widgets['wp_inactive_widgets'] ) || ! is_array( $sidebars_widgets['wp_inactive_widgets'] ) ) { From 3fab2e44a358a09fd306719b7ae4015d538b341d Mon Sep 17 00:00:00 2001 From: Aki Hamano Date: Sun, 2 Aug 2026 16:28:23 +0900 Subject: [PATCH 04/17] Simplify inactive widgets guard clause using null coalescing --- src/wp-admin/includes/widgets.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/includes/widgets.php b/src/wp-admin/includes/widgets.php index 9f11cfb1da148..02731d4ef46c8 100644 --- a/src/wp-admin/includes/widgets.php +++ b/src/wp-admin/includes/widgets.php @@ -335,11 +335,12 @@ function wp_widgets_access_body_class( $classes ) { function wp_delete_inactive_widgets(): void { $sidebars_widgets = wp_get_sidebars_widgets(); - if ( empty( $sidebars_widgets['wp_inactive_widgets'] ) || ! is_array( $sidebars_widgets['wp_inactive_widgets'] ) ) { + $inactive_widgets = $sidebars_widgets['wp_inactive_widgets'] ?? array(); + if ( count( $inactive_widgets ) === 0 ) { return; } - foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) { + foreach ( $inactive_widgets as $widget_id ) { $pieces = explode( '-', $widget_id ); $multi_number = array_pop( $pieces ); $id_base = implode( '-', $pieces ); From 6904654026b0584fa4ed544eda9445bd113e57d6 Mon Sep 17 00:00:00 2001 From: Aki Hamano Date: Sun, 2 Aug 2026 16:28:53 +0900 Subject: [PATCH 05/17] Empty inactive widgets array instead of unsetting each key --- src/wp-admin/includes/widgets.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/wp-admin/includes/widgets.php b/src/wp-admin/includes/widgets.php index 02731d4ef46c8..3029fc8d6750d 100644 --- a/src/wp-admin/includes/widgets.php +++ b/src/wp-admin/includes/widgets.php @@ -350,9 +350,8 @@ function wp_delete_inactive_widgets(): void { unset( $widget[ $multi_number ] ); update_option( 'widget_' . $id_base, $widget ); } - - unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] ); } + $sidebars_widgets['wp_inactive_widgets'] = array(); wp_set_sidebars_widgets( $sidebars_widgets ); } From ab7e373071f6708ad044e56d255eae95aa93ceee Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Tue, 11 Aug 2026 10:30:25 -0400 Subject: [PATCH 06/17] Update src/wp-admin/includes/widgets.php Co-authored-by: Aki Hamano <54422211+t-hamano@users.noreply.github.com> --- src/wp-admin/includes/widgets.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/includes/widgets.php b/src/wp-admin/includes/widgets.php index 3029fc8d6750d..5d93d2a4b9eb8 100644 --- a/src/wp-admin/includes/widgets.php +++ b/src/wp-admin/includes/widgets.php @@ -336,7 +336,7 @@ function wp_delete_inactive_widgets(): void { $sidebars_widgets = wp_get_sidebars_widgets(); $inactive_widgets = $sidebars_widgets['wp_inactive_widgets'] ?? array(); - if ( count( $inactive_widgets ) === 0 ) { + if ( ! is_array( $inactive_widgets ) || 0 === count( $inactive_widgets ) ) { return; } From 34c7ecad738481b0f511abc0f9d42a5270f8b2d1 Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Tue, 11 Aug 2026 11:10:58 -0400 Subject: [PATCH 07/17] Refactor: Replace inlined widget cleanup logic with `wp_delete_inactive_widgets()` --- src/wp-admin/widgets-form.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/wp-admin/widgets-form.php b/src/wp-admin/widgets-form.php index e47905c5d0099..8d974352ce062 100644 --- a/src/wp-admin/widgets-form.php +++ b/src/wp-admin/widgets-form.php @@ -206,16 +206,7 @@ check_admin_referer( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' ); if ( $_POST['removeinactivewidgets'] ) { - foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) { - $pieces = explode( '-', $widget_id ); - $multi_number = array_pop( $pieces ); - $id_base = implode( '-', $pieces ); - $widget = get_option( 'widget_' . $id_base ); - unset( $widget[ $multi_number ] ); - update_option( 'widget_' . $id_base, $widget ); - unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] ); - } - + wp_delete_inactive_widgets(); wp_set_sidebars_widgets( $sidebars_widgets ); } From dc5a1711d63aff15e087124f84e7c1b637682f6a Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Fri, 14 Aug 2026 11:59:15 -0400 Subject: [PATCH 08/17] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/wp-admin/includes/widgets.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/includes/widgets.php b/src/wp-admin/includes/widgets.php index 5d93d2a4b9eb8..d9b9756fa2655 100644 --- a/src/wp-admin/includes/widgets.php +++ b/src/wp-admin/includes/widgets.php @@ -330,7 +330,7 @@ function wp_widgets_access_body_class( $classes ) { /** * Removes all widgets from the inactive widgets sidebar and their corresponding settings. * - * @since 7.1.0 + * @since 7.2.0 */ function wp_delete_inactive_widgets(): void { $sidebars_widgets = wp_get_sidebars_widgets(); From 6054978876787b3cfc013fc3ead0e606279240cd Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Fri, 14 Aug 2026 11:59:48 -0400 Subject: [PATCH 09/17] Update widgets-form.php --- src/wp-admin/widgets-form.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wp-admin/widgets-form.php b/src/wp-admin/widgets-form.php index 8d974352ce062..1cf13aba5e508 100644 --- a/src/wp-admin/widgets-form.php +++ b/src/wp-admin/widgets-form.php @@ -207,7 +207,6 @@ if ( $_POST['removeinactivewidgets'] ) { wp_delete_inactive_widgets(); - wp_set_sidebars_widgets( $sidebars_widgets ); } wp_redirect( admin_url( 'widgets.php?message=0' ) ); From ac8dd6d4b3fc8ec4f18103a547c85b95d6d708f4 Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Fri, 14 Aug 2026 12:33:07 -0400 Subject: [PATCH 10/17] Add unit tests for `wp_delete_inactive_widgets()` functionality --- .../tests/widgets/wpDeleteInactiveWidgets.php | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php diff --git a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php new file mode 100644 index 0000000000000..bd163f37510d2 --- /dev/null +++ b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php @@ -0,0 +1,66 @@ +assertEmpty( wp_get_sidebars_widgets()['wp_inactive_widgets'] ); + } + + /** + * Tests that wp_delete_inactive_widgets() removes inactive widgets and their settings. + */ + public function test_wp_delete_inactive_widgets_removes_widgets() { + require_once ABSPATH . 'wp-admin/includes/widgets.php'; + + // Set up some inactive widgets. + $widget_id_1 = 'search-2'; + $widget_id_2 = 'text-3'; + $widget_id_3 = 'no-option-4'; + + update_option( 'widget_search', array( 2 => array( 'title' => 'Search' ), '_multiwidget' => 1 ) ); + update_option( 'widget_text', array( 3 => array( 'text' => 'Some text' ), '_multiwidget' => 1 ) ); + + $sidebars_widgets = wp_get_sidebars_widgets(); + $sidebars_widgets['wp_inactive_widgets'] = array( $widget_id_1, $widget_id_2, $widget_id_3 ); + $sidebars_widgets['sidebar-1'] = array( 'search-3' ); + update_option( 'widget_search', array( + 2 => array( 'title' => 'Search' ), + 3 => array( 'title' => 'Active Search' ), + '_multiwidget' => 1 + ) ); + + wp_set_sidebars_widgets( $sidebars_widgets ); + + // Run the function. + wp_delete_inactive_widgets(); + + $updated_sidebars = wp_get_sidebars_widgets(); + $this->assertEmpty( $updated_sidebars['wp_inactive_widgets'], 'Inactive widgets sidebar should be empty.' ); + $this->assertContains( 'search-3', $updated_sidebars['sidebar-1'], 'Active widgets should remain.' ); + + $search_option = get_option( 'widget_search' ); + $this->assertArrayNotHasKey( 2, $search_option, 'Inactive search widget setting should be removed.' ); + $this->assertArrayHasKey( 3, $search_option, 'Active search widget setting should remain.' ); + + $text_option = get_option( 'widget_text' ); + $this->assertArrayNotHasKey( 3, $text_option, 'Inactive text widget setting should be removed.' ); + } +} From ea769495e0a5ef6d25ca9c2f3c29b4612dcd452b Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Fri, 14 Aug 2026 12:39:08 -0400 Subject: [PATCH 11/17] Format widget option updates in unit tests for better readability --- .../tests/widgets/wpDeleteInactiveWidgets.php | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php index bd163f37510d2..5525e868a6dea 100644 --- a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php +++ b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php @@ -35,17 +35,40 @@ public function test_wp_delete_inactive_widgets_removes_widgets() { $widget_id_2 = 'text-3'; $widget_id_3 = 'no-option-4'; - update_option( 'widget_search', array( 2 => array( 'title' => 'Search' ), '_multiwidget' => 1 ) ); - update_option( 'widget_text', array( 3 => array( 'text' => 'Some text' ), '_multiwidget' => 1 ) ); + update_option( + 'widget_search', + array( + 2 => array( + 'title' => 'Search' + ), + '_multiwidget' => 1 + ) + ); + update_option( + 'widget_text', + array( + 3 => array( + 'text' => 'Some text' + ), + '_multiwidget' => 1 + ) + ); $sidebars_widgets = wp_get_sidebars_widgets(); $sidebars_widgets['wp_inactive_widgets'] = array( $widget_id_1, $widget_id_2, $widget_id_3 ); $sidebars_widgets['sidebar-1'] = array( 'search-3' ); - update_option( 'widget_search', array( - 2 => array( 'title' => 'Search' ), - 3 => array( 'title' => 'Active Search' ), - '_multiwidget' => 1 - ) ); + update_option( + 'widget_search', + array( + 2 => array( + 'title' => 'Search' + ), + 3 => array( + 'title' => 'Active Search' + ), + '_multiwidget' => 1 + ) + ); wp_set_sidebars_widgets( $sidebars_widgets ); From bcdbcca329fd80493b6a3ec3ddd22a436981c267 Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Fri, 14 Aug 2026 12:52:15 -0400 Subject: [PATCH 12/17] Align indentation in `wp_delete_inactive_widgets` unit tests for consistency and readability --- .../tests/widgets/wpDeleteInactiveWidgets.php | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php index 5525e868a6dea..e3a29937c86be 100644 --- a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php +++ b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php @@ -15,7 +15,7 @@ public function tear_down() { * Tests that wp_delete_inactive_widgets() does nothing when there are no inactive widgets. */ public function test_wp_delete_inactive_widgets_empty() { - $sidebars_widgets = wp_get_sidebars_widgets(); + $sidebars_widgets = wp_get_sidebars_widgets(); $sidebars_widgets['wp_inactive_widgets'] = array(); wp_set_sidebars_widgets( $sidebars_widgets ); @@ -38,35 +38,35 @@ public function test_wp_delete_inactive_widgets_removes_widgets() { update_option( 'widget_search', array( - 2 => array( - 'title' => 'Search' + 2 => array( + 'title' => 'Search', ), - '_multiwidget' => 1 + '_multiwidget' => 1, ) ); update_option( 'widget_text', array( - 3 => array( - 'text' => 'Some text' + 3 => array( + 'text' => 'Some text', ), - '_multiwidget' => 1 + '_multiwidget' => 1, ) ); - $sidebars_widgets = wp_get_sidebars_widgets(); + $sidebars_widgets = wp_get_sidebars_widgets(); $sidebars_widgets['wp_inactive_widgets'] = array( $widget_id_1, $widget_id_2, $widget_id_3 ); - $sidebars_widgets['sidebar-1'] = array( 'search-3' ); + $sidebars_widgets['sidebar-1'] = array( 'search-3' ); update_option( 'widget_search', array( - 2 => array( - 'title' => 'Search' + 2 => array( + 'title' => 'Search', ), - 3 => array( - 'title' => 'Active Search' + 3 => array( + 'title' => 'Active Search', ), - '_multiwidget' => 1 + '_multiwidget' => 1, ) ); From 32a4737ff2229ec3e2e4b3b78c4fe9c84414066b Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:27:22 +0900 Subject: [PATCH 13/17] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php index e3a29937c86be..cb1bddc353650 100644 --- a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php +++ b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php @@ -7,10 +7,10 @@ * @covers ::wp_delete_inactive_widgets */ class Tests_Widgets_WpDeleteInactiveWidgets extends WP_UnitTestCase { - public function tear_down() { - parent::tear_down(); + public function set_up() { + parent::set_up(); + require_once ABSPATH . 'wp-admin/includes/widgets.php'; } - /** * Tests that wp_delete_inactive_widgets() does nothing when there are no inactive widgets. */ From 4b9758708759f36da6a2fc1658a4602d911f9eaa Mon Sep 17 00:00:00 2001 From: Aki Hamano Date: Tue, 18 Aug 2026 18:29:42 +0900 Subject: [PATCH 14/17] Tests: Remove the redundant `widgets.php` require in the inactive widgets test. The file is already loaded in `set_up()` for the whole test case, so the per-test `require_once` is unnecessary. Co-Authored-By: Claude --- tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php index cb1bddc353650..e7aa42006320a 100644 --- a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php +++ b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php @@ -28,8 +28,6 @@ public function test_wp_delete_inactive_widgets_empty() { * Tests that wp_delete_inactive_widgets() removes inactive widgets and their settings. */ public function test_wp_delete_inactive_widgets_removes_widgets() { - require_once ABSPATH . 'wp-admin/includes/widgets.php'; - // Set up some inactive widgets. $widget_id_1 = 'search-2'; $widget_id_2 = 'text-3'; From 1ccf2df4fb55ea052f750a2879153adff29596b5 Mon Sep 17 00:00:00 2001 From: Aki Hamano Date: Tue, 18 Aug 2026 18:29:59 +0900 Subject: [PATCH 15/17] Coding Standards: Add a blank line after `set_up()` in the inactive widgets test. Co-Authored-By: Claude --- tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php index e7aa42006320a..f7d03f8d95689 100644 --- a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php +++ b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php @@ -11,6 +11,7 @@ public function set_up() { parent::set_up(); require_once ABSPATH . 'wp-admin/includes/widgets.php'; } + /** * Tests that wp_delete_inactive_widgets() does nothing when there are no inactive widgets. */ From 0728eb69efdb6fdeddbfcc102efd54d66fe24302 Mon Sep 17 00:00:00 2001 From: Aki Hamano Date: Tue, 18 Aug 2026 18:31:32 +0900 Subject: [PATCH 16/17] Tests: Remove a redundant `widget_search` option update in the inactive widgets test. The option was written twice, the first value being immediately overwritten by the second one. Fold the active widget instance into the initial call instead. Co-Authored-By: Claude --- .../tests/widgets/wpDeleteInactiveWidgets.php | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php index f7d03f8d95689..1e2a52718b5d7 100644 --- a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php +++ b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php @@ -40,6 +40,9 @@ public function test_wp_delete_inactive_widgets_removes_widgets() { 2 => array( 'title' => 'Search', ), + 3 => array( + 'title' => 'Active Search', + ), '_multiwidget' => 1, ) ); @@ -56,19 +59,6 @@ public function test_wp_delete_inactive_widgets_removes_widgets() { $sidebars_widgets = wp_get_sidebars_widgets(); $sidebars_widgets['wp_inactive_widgets'] = array( $widget_id_1, $widget_id_2, $widget_id_3 ); $sidebars_widgets['sidebar-1'] = array( 'search-3' ); - update_option( - 'widget_search', - array( - 2 => array( - 'title' => 'Search', - ), - 3 => array( - 'title' => 'Active Search', - ), - '_multiwidget' => 1, - ) - ); - wp_set_sidebars_widgets( $sidebars_widgets ); // Run the function. From 4fa891b508813912b6038b8fd8f980ae13baba75 Mon Sep 17 00:00:00 2001 From: Aki Hamano Date: Tue, 18 Aug 2026 18:33:14 +0900 Subject: [PATCH 17/17] Tests: Assert that a widget without a stored option is not created on deletion. Co-Authored-By: Claude --- tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php index 1e2a52718b5d7..31e8e5e481282 100644 --- a/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php +++ b/tests/phpunit/tests/widgets/wpDeleteInactiveWidgets.php @@ -74,5 +74,7 @@ public function test_wp_delete_inactive_widgets_removes_widgets() { $text_option = get_option( 'widget_text' ); $this->assertArrayNotHasKey( 3, $text_option, 'Inactive text widget setting should be removed.' ); + + $this->assertFalse( get_option( 'widget_no-option' ), 'A missing widget option should not be created.' ); } }