From 08adf0c69626b1759ae2a08c66e90abc5117e3fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20W=C3=BCnsch?= Date: Fri, 31 Jul 2026 14:36:37 +0200 Subject: [PATCH 1/2] Code Modernization: Use array_key_first() to read the first key of an array. Reading the first key of an array through `array_keys()` builds a complete array of every key only to keep one entry and throw the rest away. Replace that with `array_key_first()`, which reads the first bucket directly. --- src/wp-admin/import.php | 3 +-- src/wp-admin/includes/class-plugin-upgrader.php | 4 +--- src/wp-admin/includes/media.php | 6 ++---- src/wp-admin/includes/plugin-install.php | 3 +-- src/wp-admin/includes/revision.php | 3 +-- src/wp-admin/plugin-editor.php | 3 +-- src/wp-admin/widgets-form.php | 3 +-- src/wp-includes/class-wp-query.php | 5 ++--- src/wp-includes/cron.php | 6 ++---- .../endpoints/class-wp-rest-block-directory-controller.php | 4 +--- src/wp-includes/widgets/class-wp-widget-tag-cloud.php | 3 +-- 11 files changed, 14 insertions(+), 29 deletions(-) diff --git a/src/wp-admin/import.php b/src/wp-admin/import.php index ce17a70f20cf3..98ecd9bb3836a 100644 --- a/src/wp-admin/import.php +++ b/src/wp-admin/import.php @@ -118,8 +118,7 @@ // Looks like an importer is installed, but not active. $plugins = get_plugins( '/' . $plugin_slug ); if ( ! empty( $plugins ) ) { - $keys = array_keys( $plugins ); - $plugin_file = $plugin_slug . '/' . $keys[0]; + $plugin_file = $plugin_slug . '/' . array_key_first( $plugins ); $url = wp_nonce_url( add_query_arg( array( diff --git a/src/wp-admin/includes/class-plugin-upgrader.php b/src/wp-admin/includes/class-plugin-upgrader.php index f5290ff5258f6..5361c63821c14 100644 --- a/src/wp-admin/includes/class-plugin-upgrader.php +++ b/src/wp-admin/includes/class-plugin-upgrader.php @@ -542,9 +542,7 @@ public function plugin_info() { } // Assume the requested plugin is the first in the list. - $plugin_files = array_keys( $plugin ); - - return $this->result['destination_name'] . '/' . $plugin_files[0]; + return $this->result['destination_name'] . '/' . array_key_first( $plugin ); } /** diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index c2d15d758ef2e..80553319ffed9 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -762,8 +762,7 @@ function media_upload_form_handler() { $errors = null; if ( isset( $_POST['send'] ) ) { - $keys = array_keys( $_POST['send'] ); - $send_id = (int) reset( $keys ); + $send_id = (int) array_key_first( $_POST['send'] ); } if ( ! empty( $_POST['attachments'] ) ) { @@ -1643,8 +1642,7 @@ function get_media_item( $attachment_id, $args = null ) { $title = esc_attr( $post->post_title ); $post_mime_types = get_post_mime_types(); - $keys = array_keys( wp_match_mime_types( array_keys( $post_mime_types ), $post->post_mime_type ) ); - $type = reset( $keys ); + $type = array_key_first( wp_match_mime_types( array_keys( $post_mime_types ), $post->post_mime_type ) ); $type_html = ""; $form_fields = get_attachment_fields_to_edit( $post, $parsed_args['errors'] ); diff --git a/src/wp-admin/includes/plugin-install.php b/src/wp-admin/includes/plugin-install.php index dc232f1df7018..42bffa45d507d 100644 --- a/src/wp-admin/includes/plugin-install.php +++ b/src/wp-admin/includes/plugin-install.php @@ -593,8 +593,7 @@ function install_plugin_information() { // Default to the Description tab, Do not translate, API returns English. $section = isset( $_REQUEST['section'] ) ? wp_unslash( $_REQUEST['section'] ) : 'description'; if ( empty( $section ) || ! isset( $api->sections[ $section ] ) ) { - $section_titles = array_keys( (array) $api->sections ); - $section = reset( $section_titles ); + $section = array_key_first( (array) $api->sections ); } iframe_header( __( 'Plugin Installation' ) ); diff --git a/src/wp-admin/includes/revision.php b/src/wp-admin/includes/revision.php index 2f15f1c9e2faf..ec58011f7a3a0 100644 --- a/src/wp-admin/includes/revision.php +++ b/src/wp-admin/includes/revision.php @@ -325,8 +325,7 @@ function wp_prepare_revisions_for_js( $post, $selected_revision_id, $from = null if ( ! $compare_two_mode ) { $found = array_search( $selected_revision_id, array_keys( $revisions ), true ); if ( $found ) { - $from = array_keys( array_slice( $revisions, $found - 1, 1, true ) ); - $from = reset( $from ); + $from = array_key_first( array_slice( $revisions, $found - 1, 1, true ) ); } else { $from = 0; } diff --git a/src/wp-admin/plugin-editor.php b/src/wp-admin/plugin-editor.php index 4beee7b8409da..b129a7652b28b 100644 --- a/src/wp-admin/plugin-editor.php +++ b/src/wp-admin/plugin-editor.php @@ -71,8 +71,7 @@ $plugin = $file; } } else { - $plugin = array_keys( $plugins ); - $plugin = $plugin[0]; + $plugin = array_key_first( $plugins ); } } diff --git a/src/wp-admin/widgets-form.php b/src/wp-admin/widgets-form.php index e47905c5d0099..25ee8215b9678 100644 --- a/src/wp-admin/widgets-form.php +++ b/src/wp-admin/widgets-form.php @@ -229,8 +229,7 @@ if ( isset( $_GET['addnew'] ) ) { // Default to the first sidebar. - $keys = array_keys( $wp_registered_sidebars ); - $sidebar = reset( $keys ); + $sidebar = array_key_first( $wp_registered_sidebars ); if ( isset( $_GET['base'] ) && isset( $_GET['num'] ) ) { // Multi-widget. // Copy minimal info from an existing instance of this widget to a new instance. diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php index 244cf84e9b810..01dfe73ebf0f8 100644 --- a/src/wp-includes/class-wp-query.php +++ b/src/wp-includes/class-wp-query.php @@ -4013,9 +4013,8 @@ public function get_queried_object() { } else { // For other tax queries, grab the first term from the first clause. if ( ! empty( $this->tax_query->queried_terms ) ) { - $queried_taxonomies = array_keys( $this->tax_query->queried_terms ); - $matched_taxonomy = reset( $queried_taxonomies ); - $query = $this->tax_query->queried_terms[ $matched_taxonomy ]; + $matched_taxonomy = array_key_first( $this->tax_query->queried_terms ); + $query = $this->tax_query->queried_terms[ $matched_taxonomy ]; if ( ! empty( $query['terms'] ) ) { if ( 'term_id' === $query['field'] ) { diff --git a/src/wp-includes/cron.php b/src/wp-includes/cron.php index 3fb6a29cb8dc7..9de48bf2681cd 100644 --- a/src/wp-includes/cron.php +++ b/src/wp-includes/cron.php @@ -929,8 +929,7 @@ function spawn_cron( $gmt_time = 0 ) { return false; } - $keys = array_keys( $crons ); - if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { + if ( array_key_first( $crons ) > $gmt_time ) { return false; } @@ -1059,8 +1058,7 @@ function _wp_cron() { } $gmt_time = microtime( true ); - $keys = array_keys( $crons ); - if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { + if ( array_key_first( $crons ) > $gmt_time ) { return 0; } diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php index c2c92efbbcd22..31267f9600671 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php @@ -200,9 +200,7 @@ protected function find_plugin_for_slug( $slug ) { return ''; } - $plugin_files = array_keys( $plugin_files ); - - return $slug . '/' . reset( $plugin_files ); + return $slug . '/' . array_key_first( $plugin_files ); } /** diff --git a/src/wp-includes/widgets/class-wp-widget-tag-cloud.php b/src/wp-includes/widgets/class-wp-widget-tag-cloud.php index c56a774b111a4..aeb3c09ce8e10 100644 --- a/src/wp-includes/widgets/class-wp-widget-tag-cloud.php +++ b/src/wp-includes/widgets/class-wp-widget-tag-cloud.php @@ -169,8 +169,7 @@ public function form( $instance ) { // Just a single tag cloud supporting taxonomy found, no need to display a select. case 1: - $keys = array_keys( $taxonomies ); - $taxonomy = reset( $keys ); + $taxonomy = array_key_first( $taxonomies ); ?> Date: Sat, 1 Aug 2026 09:43:38 +0200 Subject: [PATCH 2/2] Code Modernization: Keep $type a string in get_media_item(). wp_match_mime_types() returns an empty array for an attachment whose mime type falls outside the buckets get_post_mime_types() defines. array_key_first() then yields null where reset() previously yielded false. The escaping chain itself is unaffected, as both wp_check_invalid_utf8() and _wp_specialchars() cast to string before anything else. But esc_attr() passes the raw value on to the 'attribute_escape' filter as its second argument, documented as string. Core hooks nothing there, while a plugin callback handing that argument to an internal string function would hit the PHP 8.1+ null deprecation that false did not trigger. Default to an empty string, and split the expression so the guard stays visible instead of trailing a 120-character line. --- src/wp-admin/includes/media.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index 80553319ffed9..39e0cf8e28254 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -1642,7 +1642,8 @@ function get_media_item( $attachment_id, $args = null ) { $title = esc_attr( $post->post_title ); $post_mime_types = get_post_mime_types(); - $type = array_key_first( wp_match_mime_types( array_keys( $post_mime_types ), $post->post_mime_type ) ); + $matched_types = wp_match_mime_types( array_keys( $post_mime_types ), $post->post_mime_type ); + $type = array_key_first( $matched_types ) ?? ''; $type_html = ""; $form_fields = get_attachment_fields_to_edit( $post, $parsed_args['errors'] );