Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
3949674
Code Quality: Remove `null` from `validate_another_blog_signup()` ret…
mukeshpanchal27 Nov 3, 2026
d8ddbb1
Merge branch 'trunk' into fix/validate-another-blog-signup-return-type
mukeshpanchal27 Nov 4, 2026
3041f54
Code Quality: Document arrays in the `plugins_api_result` filter.
mukeshpanchal27 Nov 4, 2026
8c42ca1
Code Quality: Remove `WP_Error` from `_fix_attachment_links()` return…
mukeshpanchal27 Nov 4, 2026
41ba355
Code Quality: Remove `array` from `get_preferred_from_update_core()` …
mukeshpanchal27 Nov 4, 2026
6349af4
Code Quality: Correct the `$tag_list` type in the `the_tags` filter.
mukeshpanchal27 Nov 4, 2026
37dc5ce
Code Quality: Accept `null` in the `_make_cat_compat()` parameter type.
mukeshpanchal27 Nov 4, 2026
5e739c4
Code Quality: Remove `false` from `recovery_mode_hash()` return type.
mukeshpanchal27 Nov 4, 2026
be0e86b
Code Quality: Document `false` in the `wp_code_editor_settings` filter.
mukeshpanchal27 Nov 4, 2026
ec8f929
Code Quality: Correct the `get_post_gallery()` return and filter types.
mukeshpanchal27 Nov 4, 2026
d3760b9
Code Quality: Document `false` in the `wp_mime_type_icon` filter.
mukeshpanchal27 Nov 4, 2026
8b55de8
Code Quality: Remove `false` from `_set_preview()` return type.
mukeshpanchal27 Nov 4, 2026
beb353a
Code Quality: Correct the `get_term_to_edit()` return type.
mukeshpanchal27 Nov 4, 2026
c95d168
Code Quality: Document `WP_Error` in the `allow_password_reset` filter.
mukeshpanchal27 Nov 4, 2026
a6d0682
Build/Test Tools: Remove the `return.unusedType` PHPStan baseline.
mukeshpanchal27 Nov 4, 2026
f378672
Merge branch 'fix/validate-another-blog-signup-return-type' of https:…
mukeshpanchal27 Nov 4, 2026
fc5d8c1
Code Quality: Fix docblock continuation alignment.
mukeshpanchal27 Nov 4, 2026
d788afa
Merge branch 'trunk' into fix/validate-another-blog-signup-return-type
westonruter Nov 11, 2026
9656fad
Add conditional return type to sanitize_term()
westonruter Nov 11, 2026
768c852
Document sanitize_term() as taking a string-keyed array
westonruter Nov 11, 2026
59b545a
Document sanitize_term_field() as accepting int values
westonruter Nov 11, 2026
4b86354
Always pass string|false to the wp_mime_type_icon filter
westonruter Nov 11, 2026
9ebbee7
Document wp_match_mime_types() return as string-keyed lists
westonruter Nov 11, 2026
e2a0d82
Only use string icon URLs from the cached icon files list
westonruter Nov 11, 2026
676a4a1
Remove the unreachable is_object() guard from _set_preview()
westonruter Nov 11, 2026
0eec625
Use a truly nonexistent attachment ID in the mime type icon test
westonruter Nov 11, 2026
c78ec67
Allow integer keys in wp_match_mime_types() return type
westonruter Nov 11, 2026
3fc39aa
Regenerate baselines
westonruter Nov 11, 2026
5b21ead
Note that the icon filter's post ID is 0 for a missing attachment
westonruter Nov 11, 2026
467827f
Move sanitize_term()'s term type into its regular @param
westonruter Nov 11, 2026
9bdb8d3
Add a conditional return type to get_post_gallery()
westonruter Nov 11, 2026
ccd0bce
Allow integer keys in get_post_gallery() data arrays
westonruter Nov 12, 2026
1dfd08d
Test that wp_mime_type_icon() ignores non-string cached icons
westonruter Nov 12, 2026
103ad9f
Realign sanitize_term() parameter docs
westonruter Nov 12, 2026
7aa5ea9
Clarify when the icon filter's MIME type and post ID are 0
westonruter Nov 12, 2026
3ed0c7b
Merge branch 'trunk' into fix/validate-another-blog-signup-return-type
westonruter Nov 12, 2026
e91c525
Simplify wp_match_mime_types() return type to array<string[]>
westonruter Nov 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion phpstan.neon.dist
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ includes:
- tests/phpstan/baselines/property.notFound.neon
- tests/phpstan/baselines/property.private.neon
- tests/phpstan/baselines/return.type.neon
- tests/phpstan/baselines/return.unusedType.neon
- tests/phpstan/baselines/varTag.noVariable.neon
- tests/phpstan/baselines/variable.undefined.neon
# phpstan:baselines end
Expand Down Expand Up @@ -132,6 +131,18 @@ parameters:
path: src/wp-includes/compat.php
reportUnmatched: false

# Level 4:
# wp_imagecreatetruecolor() returns whatever imagecreatetruecolor() returns: a resource on PHP 7.4 and a
# GdImage instance on PHP 8.0+. Its docblock lists both, which is correct for WP's 7.4+ range. Because
# `phpVersion.min` is 70400, PHPStan reads the function from its pre-8.0 map, sees only a resource, and
# reports GdImage as unused. Removing GdImage would make the docblock wrong on every PHP 8 install.
# `reportUnmatched: false` so this entry lapses quietly if PHPStan stops reporting it.
-
message: '#^Function wp_imagecreatetruecolor\(\) never returns GdImage so it can be removed from the return type\.$#'
identifier: return.unusedType
path: src/wp-includes/media.php
reportUnmatched: false

# Level 5:
# substr_compare()'s $length has always accepted null, meaning "compare the full length". PHP 7.4 spelled
# that `int $length = null`, where the null default makes the parameter implicitly nullable, and PHP 8.0
Expand Down
6 changes: 3 additions & 3 deletions src/wp-admin/includes/plugin-install.php
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,9 @@ function plugins_api( $action, $args = array() ) {
*
* @since 2.7.0
*
* @param object|WP_Error $res Response object or WP_Error.
* @param string $action The type of information being requested from the Plugin Installation API.
* @param object $args Plugin API arguments.
* @param object|array|WP_Error $res Response object or array, or WP_Error on failure.
* @param string $action The type of information being requested from the Plugin Installation API.
* @param object $args Plugin API arguments.
*/
return apply_filters( 'plugins_api_result', $res, $action, $args );
}
Expand Down
2 changes: 1 addition & 1 deletion src/wp-admin/includes/post.php
Original file line number Diff line number Diff line change
Expand Up @@ -1163,7 +1163,7 @@ function update_meta( $meta_id, $meta_key, $meta_value ) {
* @access private
*
* @param int|WP_Post $post Post ID or post object.
* @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success.
* @return void|int Void if nothing fixed. 0 on update failure. The post ID on update success.
*/
function _fix_attachment_links( $post ) {
$post = get_post( $post, ARRAY_A );
Expand Down
2 changes: 1 addition & 1 deletion src/wp-admin/includes/update.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
*
* @since 2.7.0
*
* @return object|array|false The response from the API on success, false on failure.
* @return object|false The response from the API on success, false on failure.
*/
function get_preferred_from_update_core() {
$updates = get_core_updates();
Expand Down
11 changes: 6 additions & 5 deletions src/wp-includes/category-template.php
Original file line number Diff line number Diff line change
Expand Up @@ -1224,11 +1224,12 @@ function get_the_tag_list( $before = '', $sep = '', $after = '', $post_id = 0 )
*
* @since 2.3.0
*
* @param string $tag_list List of tags.
* @param string $before String to use before the tags.
* @param string $sep String to use between the tags.
* @param string $after String to use after the tags.
* @param int $post_id Post ID.
* @param string|false|WP_Error $tag_list A list of tags on success, false if there are no terms,
* WP_Error on failure.
* @param string $before String to use before the tags.
* @param string $sep String to use between the tags.
* @param string $after String to use after the tags.
* @param int $post_id Post ID.
*/
return apply_filters( 'the_tags', $tag_list, $before, $sep, $after, $post_id );
}
Expand Down
2 changes: 1 addition & 1 deletion src/wp-includes/category.php
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ function clean_category_cache( $id ) {
* @since 4.4.0 The `$category` parameter now also accepts a WP_Term object.
* @access private
*
* @param array|object|WP_Term $category Category row object or array.
* @param array|object|WP_Term|null $category Category row object or array. Null is left unchanged.
*/
function _make_cat_compat( &$category ) {
if ( is_object( $category ) && ! is_wp_error( $category ) ) {
Expand Down
2 changes: 1 addition & 1 deletion src/wp-includes/class-wp-recovery-mode-cookie-service.php
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ private function generate_cookie() {
* @since 5.2.0
*
* @param string $data Data to hash.
* @return string|false The hashed $data, or false on failure.
* @return string The hashed $data.
*/
private function recovery_mode_hash( $data ) {
$default_keys = array_unique(
Expand Down
6 changes: 3 additions & 3 deletions src/wp-includes/general-template.php
Original file line number Diff line number Diff line change
Expand Up @@ -4760,9 +4760,9 @@ function wp_get_code_editor_settings( $args ) {
*
* @since 4.9.0
*
* @param array $settings The array of settings passed to the code editor.
* A falsey value disables the editor.
* @param array $args {
* @param array|false $settings The array of settings passed to the code editor.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good. This matches the return value for wp_get_code_editor_settings():

@return array|false Settings for the code editor.

* A falsey value disables the editor.
* @param array $args {
* Args passed when calling `get_code_editor_settings()`.
*
* @type string $type The MIME type of the file to be edited.
Expand Down
13 changes: 9 additions & 4 deletions src/wp-includes/media.php
Original file line number Diff line number Diff line change
Expand Up @@ -5587,7 +5587,11 @@ function get_post_galleries( $post, $html = true ) {
*
* @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
* @param bool $html Optional. Whether to return HTML or data. Default is true.
* @return string|array Gallery data and srcs parsed from the expanded shortcode.
* @return string|array|false Gallery HTML or an array of gallery data and srcs parsed from
* the expanded shortcode, depending on `$html`. False if the post has
* no gallery.
*
* @phpstan-return ( $html is false ? array<mixed>|false : string|false )
*/
function get_post_gallery( $post = 0, $html = true ) {
$galleries = get_post_galleries( $post, $html );
Expand All @@ -5598,9 +5602,10 @@ function get_post_gallery( $post = 0, $html = true ) {
*
* @since 3.6.0
*
* @param array $gallery The first-found post gallery.
* @param int|WP_Post $post Post ID or object.
* @param array $galleries Associative array of all found post galleries.
* @param string|array<mixed>|false $gallery The first-found post gallery, or false if the post has no gallery.
* An HTML string when `$html` is true, otherwise an array.
* @param int|WP_Post $post Post ID or object.
* @param array $galleries Associative array of all found post galleries.
*/
return apply_filters( 'get_post_gallery', $gallery, $post, $galleries );
}
Expand Down
23 changes: 14 additions & 9 deletions src/wp-includes/post.php
Original file line number Diff line number Diff line change
Expand Up @@ -3895,7 +3895,7 @@ function get_post_mime_types() {
* @param string|string[] $wildcard_mime_types Mime types, e.g. `audio/mpeg`, `image` (same as `image/*`),
* or `flash` (same as `*flash*`).
* @param string|string[] $real_mime_types Real post mime type values.
* @return array array(wildcard=>array(real types)).
* @return array<string[]> array(wildcard=>array(real types)).
*/
function wp_match_mime_types( $wildcard_mime_types, $real_mime_types ) {
$matches = array();
Expand Down Expand Up @@ -7637,11 +7637,15 @@ function wp_attachment_is_image( $post = null ) {
*
* @param string|int $mime MIME type or attachment ID.
* @param string $preferred_ext File format to prefer in return. Default '.png'.
* @return string|false Icon, false otherwise.
* @return string|false Icon URL, or false if no icon was found.
*/
function wp_mime_type_icon( $mime = 0, $preferred_ext = '.png' ) {
$icon = false;
if ( ! is_numeric( $mime ) ) {
$icon = wp_cache_get( "mime_type_icon_$mime" );
$cached_icon = wp_cache_get( "mime_type_icon_$mime" );
if ( is_string( $cached_icon ) ) {
$icon = $cached_icon;
}
}

// Check if preferred file format variable is present and is a validly formatted file extension.
Expand Down Expand Up @@ -7756,11 +7760,12 @@ function wp_mime_type_icon( $mime = 0, $preferred_ext = '.png' ) {

foreach ( $matches as $match => $wilds ) {
foreach ( $wilds as $wild ) {
if ( ! isset( $types[ $wild ] ) ) {
$type_icon = $types[ $wild ] ?? null;
if ( ! is_string( $type_icon ) ) {
continue;
}

$icon = $types[ $wild ];
$icon = $type_icon;
if ( ! is_numeric( $mime ) ) {
wp_cache_add( "mime_type_icon_$mime", $icon );
}
Expand All @@ -7774,10 +7779,10 @@ function wp_mime_type_icon( $mime = 0, $preferred_ext = '.png' ) {
*
* @since 2.1.0
*
* @param string $icon Path to the mime type icon.
* @param string $mime Mime type.
* @param int $post_id Attachment ID. Will equal 0 if the function passed
* the mime type.
* @param string|false $icon URL of the mime type icon, or false if no icon was found.
* @param string|int $mime Mime type, or 0 if no post was found for the passed ID.
* @param int $post_id Attachment ID. Will equal 0 if the function passed
* the mime type or no post was found for the passed ID.
*/
return apply_filters( 'wp_mime_type_icon', $icon, $mime, $post_id );
}
Expand Down
6 changes: 1 addition & 5 deletions src/wp-includes/revision.php
Original file line number Diff line number Diff line change
Expand Up @@ -870,13 +870,9 @@ function wp_revisions_to_keep( $post ) {
* @access private
*
* @param WP_Post $post
* @return WP_Post|false
* @return WP_Post
Comment thread
westonruter marked this conversation as resolved.
Resolved
*/
function _set_preview( $post ) {
if ( ! is_object( $post ) ) {
return $post;
}

$preview = wp_get_post_autosave( $post->ID );

if ( is_object( $preview ) ) {
Expand Down
39 changes: 24 additions & 15 deletions src/wp-includes/taxonomy.php
Original file line number Diff line number Diff line change
Expand Up @@ -1273,7 +1273,10 @@ function get_term_field( $field, $term, $taxonomy = '', $context = 'display' ) {
*
* @param int|object $id Term ID or object.
* @param string $taxonomy Taxonomy name.
* @return string|int|null|WP_Error Will return empty string if $term is not an object.
* @return WP_Term|string|WP_Error The term sanitized for editing, WP_Error if the term ID is empty or the
* taxonomy does not exist, or an empty string if the term does not exist.
*
* @phpstan-return WP_Term|''|WP_Error
*/
function get_term_to_edit( $id, $taxonomy ) {
$term = get_term( $id, $taxonomy );
Expand Down Expand Up @@ -1786,12 +1789,18 @@ function term_is_ancestor_of( $term1, $term2, $taxonomy ) {
*
* @since 2.3.0
*
* @param array|object $term The term to check.
* @param string $taxonomy The taxonomy name to use.
* @param string $context Optional. Context in which to sanitize the term.
* Accepts 'raw', 'edit', 'db', 'display', 'rss',
* 'attribute', or 'js'. Default 'display'.
* @return array|object Term with all fields sanitized.
* @param array<string, mixed>|object $term The term to check.
* @param string $taxonomy The taxonomy name to use.
* @param string $context Optional. Context in which to sanitize the term.
* Accepts 'raw', 'edit', 'db', 'display', 'rss',
* 'attribute', or 'js'. Default 'display'.
* @return array|object Term with all fields sanitized (will be the same type as `$term`).
*
* @phpstan-return (
* $term is WP_Term ? WP_Term : (
* $term is array ? array<string, mixed> : object
* )
* )
*/
function sanitize_term( $term, $taxonomy, $context = 'display' ) {
$fields = array( 'term_id', 'name', 'description', 'slug', 'count', 'parent', 'term_group', 'term_taxonomy_id', 'object_id' );
Expand Down Expand Up @@ -1836,16 +1845,16 @@ function sanitize_term( $term, $taxonomy, $context = 'display' ) {
*
* @since 2.3.0
*
* @param string $field Term field to sanitize.
* @param string $value Search for this term value.
* @param int $term_id Term ID.
* @param string $taxonomy Taxonomy name.
* @param string $context Context in which to sanitize the term field.
* Accepts 'raw', 'edit', 'db', 'display', 'rss',
* 'attribute', or 'js'.
* @param string $field Term field to sanitize.
* @param string|int $value Search for this term value.
* @param int $term_id Term ID.
* @param string $taxonomy Taxonomy name.
* @param string $context Context in which to sanitize the term field.
* Accepts 'raw', 'edit', 'db', 'display', 'rss',
* 'attribute', or 'js'.
* @return mixed Sanitized field.
*
* @phpstan-template T of string
* @phpstan-template T of string|int
* @phpstan-param T $value
* @phpstan-return (
* $field is 'parent'|'term_id'|'count'|'term_group'|'term_taxonomy_id'|'object_id'
Expand Down
5 changes: 3 additions & 2 deletions src/wp-includes/user.php
Original file line number Diff line number Diff line change
Expand Up @@ -5341,8 +5341,9 @@ function wp_is_password_reset_allowed_for_user( $user ) {
*
* @since 2.7.0
*
* @param bool $allow Whether to allow the password to be reset. Default true.
* @param int $user_id The ID of the user attempting to reset a password.
* @param bool|WP_Error $allow Whether to allow the password to be reset, or a WP_Error to explain
* why it is not allowed. Default true.
* @param int $user_id The ID of the user attempting to reset a password.
*/
return apply_filters( 'allow_password_reset', $allow, $user->ID );
}
4 changes: 2 additions & 2 deletions src/wp-signup.php
Original file line number Diff line number Diff line change
Expand Up @@ -443,8 +443,8 @@ function signup_another_blog( $blogname = '', $blog_title = '', $errors = '' ) {
* @global string $domain The new site's domain.
* @global string $path The new site's path.
*
* @return null|bool True if site signup was validated, false on error.
* The function halts all execution if the user is not logged in.
* @return bool True if site signup was validated, false on error.
* The function halts all execution if the user is not logged in.
*/
function validate_another_blog_signup() {
global $blogname, $blog_title, $errors, $domain, $path;
Expand Down
25 changes: 0 additions & 25 deletions tests/phpstan/baselines/property.nonObject.neon
Original file line number Diff line number Diff line change
Expand Up @@ -48,21 +48,6 @@ parameters:
identifier: property.nonObject
count: 1
path: ../../../src/wp-admin/includes/class-theme-upgrader.php
-
message: '#^Cannot access property \$current on array\|object\.$#'
identifier: property.nonObject
count: 3
path: ../../../src/wp-admin/includes/class-wp-automatic-updater.php
-
message: '#^Cannot access property \$response on array\|object\.$#'
identifier: property.nonObject
count: 1
path: ../../../src/wp-admin/includes/class-wp-automatic-updater.php
-
message: '#^Cannot access property \$version on array\|object\.$#'
identifier: property.nonObject
count: 1
path: ../../../src/wp-admin/includes/class-wp-automatic-updater.php
-
message: '#^Cannot access property \$info on array\|object\.$#'
identifier: property.nonObject
Expand All @@ -73,16 +58,6 @@ parameters:
identifier: property.nonObject
count: 1
path: ../../../src/wp-admin/includes/class-wp-plugin-install-list-table.php
-
message: '#^Cannot access property \$parent on array\|object\.$#'
identifier: property.nonObject
count: 1
path: ../../../src/wp-admin/includes/class-wp-terms-list-table.php
-
message: '#^Cannot access property \$term_id on array\|object\.$#'
identifier: property.nonObject
count: 2
path: ../../../src/wp-admin/includes/class-wp-terms-list-table.php
-
message: '#^Cannot access property \$info on array\|object\.$#'
identifier: property.nonObject
Expand Down
Loading
Loading