From 22b477b3e247cda776fc17b7d0f66dc46613a2d1 Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:50:43 +0200 Subject: [PATCH 01/10] add stubs for get_posts --- functionMap.php | 1 + tests/TypeInferenceTest.php | 1 + tests/data/get_posts.php | 67 +++++++++++++++++++++++++++++++++++++ wordpress-stubs.php | 1 + 4 files changed, 70 insertions(+) create mode 100644 tests/data/get_posts.php diff --git a/functionMap.php b/functionMap.php index b02a828..c12d32d 100644 --- a/functionMap.php +++ b/functionMap.php @@ -149,4 +149,5 @@ 'WP_Widget::form' => [null, 'instance' => 'T'], 'WP_Widget::update' => [null, 'new_instance' => 'T', 'old_instance' => 'T'], 'WP_Widget::widget' => [null, 'instance' => 'T', 'args' => 'array{name:string,id:string,description:string,class:string,before_widget:string,after_widget:string,before_title:string,after_title:string,before_sidebar:string,after_sidebar:string,show_in_rest:boolean,widget_id:string,widget_name:string}'], + 'get_posts' => ["(\$args is array{'fields': 'id=>parent'|'ids'} ? array : array)"], ]; diff --git a/tests/TypeInferenceTest.php b/tests/TypeInferenceTest.php index 7e15b5e..d562a09 100644 --- a/tests/TypeInferenceTest.php +++ b/tests/TypeInferenceTest.php @@ -20,6 +20,7 @@ public function dataFileAsserts(): iterable yield from $this->gatherAssertTypes(__DIR__ . '/data/get_post.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_post_stati.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_post_types.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/get_posts.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_page_by_path.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_permalink.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_term_by.php'); diff --git a/tests/data/get_posts.php b/tests/data/get_posts.php new file mode 100644 index 0000000..7cbb151 --- /dev/null +++ b/tests/data/get_posts.php @@ -0,0 +1,67 @@ +', get_posts()); +assertType('array', get_posts(['key' => 'value'])); +assertType('array', get_posts(['fields' => ''])); +assertType('array', get_posts(['fields' => 'ids'])); +assertType('array', get_posts(['fields' => 'id=>parent'])); +assertType('array', get_posts(['fields' => 'Hello'])); + +// Nonconstant array +assertType('array', get_posts((array)$_GET['array'])); + +// Unions +$union = $_GET['foo'] ? ['key' => 'value'] : ['some' => 'thing']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? ['key' => 'value'] : ['fields' => 'ids']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? ['key' => 'value'] : ['fields' => '']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? ['key' => 'value'] : ['fields' => 'id=>parent']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? ['fields' => ''] : ['fields' => 'ids']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? ['fields' => ''] : ['fields' => 'id=>parent']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? ['fields' => 'ids'] : ['fields' => 'id=>parent']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? (array)$_GET['array'] : ['fields' => '']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? (array)$_GET['array'] : ['fields' => 'ids']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? (array)$_GET['array'] : ['fields' => 'id=>parent']; +assertType('array', get_posts($union)); + +$union = $_GET['foo'] ? (string)$_GET['string'] : ''; +assertType('array', get_posts(['fields' => $union])); + +$union = $_GET['foo'] ? (string)$_GET['string'] : 'ids'; +assertType('array', get_posts(['fields' => $union])); + +$union = $_GET['foo'] ? (string)$_GET['string'] : 'id=>parent'; +assertType('array', get_posts(['fields' => $union])); + +$union = $_GET['foo'] ? (string)$_GET['string'] : 'fields'; +assertType('array', get_posts([$union => ''])); + +$union = $_GET['foo'] ? (string)$_GET['string'] : 'fields'; +assertType('array', get_posts([$union => 'ids'])); + +$union = $_GET['foo'] ? (string)$_GET['string'] : 'fields'; +assertType('array', get_posts([$union => 'id=>parent'])); diff --git a/wordpress-stubs.php b/wordpress-stubs.php index 31d3ff4..ccb3896 100644 --- a/wordpress-stubs.php +++ b/wordpress-stubs.php @@ -133623,6 +133623,7 @@ function is_post_publicly_viewable($post = \null) * w?: int, * year?: int, * } $args + * @phpstan-return ($args is array{'fields': 'id=>parent'|'ids'} ? array : array) */ function get_posts($args = \null) { From 23ef649c598522406b72e0ba9aff875794ccc7f1 Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Thu, 22 Aug 2024 22:05:54 +0200 Subject: [PATCH 02/10] add stubs for get_approved_comments --- functionMap.php | 1 + tests/TypeInferenceTest.php | 1 + tests/data/get_approved_comments.php | 32 ++++++++++++++++++++++++++++ wordpress-stubs.php | 3 ++- 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/data/get_approved_comments.php diff --git a/functionMap.php b/functionMap.php index c12d32d..e2be0f8 100644 --- a/functionMap.php +++ b/functionMap.php @@ -149,5 +149,6 @@ 'WP_Widget::form' => [null, 'instance' => 'T'], 'WP_Widget::update' => [null, 'new_instance' => 'T', 'old_instance' => 'T'], 'WP_Widget::widget' => [null, 'instance' => 'T', 'args' => 'array{name:string,id:string,description:string,class:string,before_widget:string,after_widget:string,before_title:string,after_title:string,before_sidebar:string,after_sidebar:string,show_in_rest:boolean,widget_id:string,widget_name:string}'], + 'get_approved_comments' => ["(\$args is array{'count': true} ? int : (\$args is array{'fields': 'ids'} ? array : array))"], 'get_posts' => ["(\$args is array{'fields': 'id=>parent'|'ids'} ? array : array)"], ]; diff --git a/tests/TypeInferenceTest.php b/tests/TypeInferenceTest.php index d562a09..d302928 100644 --- a/tests/TypeInferenceTest.php +++ b/tests/TypeInferenceTest.php @@ -11,6 +11,7 @@ public function dataFileAsserts(): iterable { yield from $this->gatherAssertTypes(__DIR__ . '/data/current_time.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/echo_parameter.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/get_approved_comments.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_attachment_taxonomies.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_bookmark.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_category.php'); diff --git a/tests/data/get_approved_comments.php b/tests/data/get_approved_comments.php new file mode 100644 index 0000000..f610aa5 --- /dev/null +++ b/tests/data/get_approved_comments.php @@ -0,0 +1,32 @@ +', get_approved_comments(1)); + +assertType('int', get_approved_comments(1, [ + 'count' => true, +])); + +assertType('int', get_approved_comments(1, [ + 'count' => true, + 'fields' => 'ids', +])); + +assertType('array', get_approved_comments(1, [ + 'count' => false, +])); + +assertType('array', get_approved_comments(1, [ + 'fields' => 'ids', +])); + +assertType('array', get_approved_comments(1, [ + 'count' => false, + 'fields' => 'ids', +])); diff --git a/wordpress-stubs.php b/wordpress-stubs.php index ccb3896..5a79dfe 100644 --- a/wordpress-stubs.php +++ b/wordpress-stubs.php @@ -104004,6 +104004,7 @@ function check_comment($author, $email, $url, $comment, $user_ip, $user_agent, $ * update_comment_meta_cache?: bool, * update_comment_post_cache?: bool, * } $args + * @phpstan-return ($args is array{'count': true} ? int : ($args is array{'fields': 'ids'} ? array : array)) */ function get_approved_comments($post_id, $args = array()) { @@ -133623,7 +133624,7 @@ function is_post_publicly_viewable($post = \null) * w?: int, * year?: int, * } $args - * @phpstan-return ($args is array{'fields': 'id=>parent'|'ids'} ? array : array) + * @phpstan-return ($args is array{'fields': 'id=>parent'|'ids'} ? array : array) */ function get_posts($args = \null) { From 1be9e0933be6d424e4b9a6dfc1f672c27e45bd9e Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Thu, 22 Aug 2024 22:17:07 +0200 Subject: [PATCH 03/10] add stubs for get_sites --- functionMap.php | 1 + tests/TypeInferenceTest.php | 1 + tests/data/get_sites.php | 34 ++++++++++++++++++++++++++++++++++ wordpress-stubs.php | 1 + 4 files changed, 37 insertions(+) create mode 100644 tests/data/get_sites.php diff --git a/functionMap.php b/functionMap.php index e2be0f8..eff30ce 100644 --- a/functionMap.php +++ b/functionMap.php @@ -151,4 +151,5 @@ 'WP_Widget::widget' => [null, 'instance' => 'T', 'args' => 'array{name:string,id:string,description:string,class:string,before_widget:string,after_widget:string,before_title:string,after_title:string,before_sidebar:string,after_sidebar:string,show_in_rest:boolean,widget_id:string,widget_name:string}'], 'get_approved_comments' => ["(\$args is array{'count': true} ? int : (\$args is array{'fields': 'ids'} ? array : array))"], 'get_posts' => ["(\$args is array{'fields': 'id=>parent'|'ids'} ? array : array)"], + 'get_sites' => ["(\$args is array{'count': true} ? int : (\$args is array{'fields': 'ids'} ? array : array))"], ]; diff --git a/tests/TypeInferenceTest.php b/tests/TypeInferenceTest.php index d302928..8b15422 100644 --- a/tests/TypeInferenceTest.php +++ b/tests/TypeInferenceTest.php @@ -24,6 +24,7 @@ public function dataFileAsserts(): iterable yield from $this->gatherAssertTypes(__DIR__ . '/data/get_posts.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_page_by_path.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_permalink.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/get_sites.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_term_by.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_taxonomies.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_term.php'); diff --git a/tests/data/get_sites.php b/tests/data/get_sites.php new file mode 100644 index 0000000..a4a809b --- /dev/null +++ b/tests/data/get_sites.php @@ -0,0 +1,34 @@ +', get_sites()); +assertType('array', get_sites([])); + +// Non constant array parameter +/** @var array $value */ +$value = $_GET['foo']; +assertType('array|int', get_sites($value)); + +// Array parameter with explicit fields value and default count value. +assertType('array', get_sites(['fields' => 'ids'])); +assertType('array', get_sites(['fields' => ''])); +assertType('array', get_sites(['fields' => 'nonEmptyString'])); + +// Array parameter with count set to true. +assertType('int', get_sites(['count' => true])); +assertType('int', get_sites(['fields' => '', 'count' => true])); +assertType('int', get_sites(['fields' => 'ids', 'count' => true])); +assertType('int', get_sites(['fields' => 'nonEmptyString', 'count' => true])); + +// Array parameter with count set to false. +assertType('array', get_sites(['count' => false])); +assertType('array', get_sites(['fields' => '', 'count' => false])); +assertType('array', get_sites(['fields' => 'ids', 'count' => false])); +assertType('array', get_sites(['fields' => 'nonEmptyString', 'count' => false])); diff --git a/wordpress-stubs.php b/wordpress-stubs.php index 5a79dfe..9abf723 100644 --- a/wordpress-stubs.php +++ b/wordpress-stubs.php @@ -128212,6 +128212,7 @@ function update_sitemeta_cache($site_ids) * meta_type_key?: string, * meta_query?: array, * } $args See WP_Site_Query::__construct() + * @phpstan-return ($args is array{'count': true} ? int : ($args is array{'fields': 'ids'} ? array : array)) */ function get_sites($args = array()) { From ab65dcad393d1d6595f16e8a22f8918bc045c7a5 Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Fri, 23 Aug 2024 00:43:40 +0200 Subject: [PATCH 04/10] add stubs for get_terms and related functions --- functionMap.php | 14 +++++++--- tests/TypeInferenceTest.php | 6 +++++ tests/data/get_tags.php | 37 +++++++++++++++++++++++++++ tests/data/get_terms.php | 37 +++++++++++++++++++++++++++ tests/data/wp_get_object_terms.php | 36 ++++++++++++++++++++++++++ tests/data/wp_get_post_categories.php | 35 +++++++++++++++++++++++++ tests/data/wp_get_post_tags.php | 35 +++++++++++++++++++++++++ tests/data/wp_get_post_terms.php | 36 ++++++++++++++++++++++++++ wordpress-stubs.php | 12 ++++++--- 9 files changed, 241 insertions(+), 7 deletions(-) create mode 100644 tests/data/get_tags.php create mode 100644 tests/data/get_terms.php create mode 100644 tests/data/wp_get_object_terms.php create mode 100644 tests/data/wp_get_post_categories.php create mode 100644 tests/data/wp_get_post_tags.php create mode 100644 tests/data/wp_get_post_terms.php diff --git a/functionMap.php b/functionMap.php index eff30ce..8b58bda 100644 --- a/functionMap.php +++ b/functionMap.php @@ -2,7 +2,7 @@ declare(strict_types=1); -$httpReturnType = 'array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error'; +$httpReturnType = 'array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error'; if (file_exists(sprintf('%s/source/wordpress/wp-includes/Requests/Cookie/Jar.php', __DIR__))) { $httpReturnType = 'array{headers: \Requests_Utility_CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error'; @@ -149,7 +149,13 @@ 'WP_Widget::form' => [null, 'instance' => 'T'], 'WP_Widget::update' => [null, 'new_instance' => 'T', 'old_instance' => 'T'], 'WP_Widget::widget' => [null, 'instance' => 'T', 'args' => 'array{name:string,id:string,description:string,class:string,before_widget:string,after_widget:string,before_title:string,after_title:string,before_sidebar:string,after_sidebar:string,show_in_rest:boolean,widget_id:string,widget_name:string}'], - 'get_approved_comments' => ["(\$args is array{'count': true} ? int : (\$args is array{'fields': 'ids'} ? array : array))"], - 'get_posts' => ["(\$args is array{'fields': 'id=>parent'|'ids'} ? array : array)"], - 'get_sites' => ["(\$args is array{'count': true} ? int : (\$args is array{'fields': 'ids'} ? array : array))"], + 'get_approved_comments' => ["(\$args is array{count: true} ? int : (\$args is array{fields: 'ids'} ? array : array))"], + 'get_posts' => ["(\$args is array{fields: 'id=>parent'|'ids'} ? array : array)"], + 'get_sites' => ["(\$args is array{count: true} ? int : (\$args is array{fields: 'ids'} ? array : array))"], + 'get_tags' => ["(\$args is array{fields: 'count'} ? numeric-string : (\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array)))))|\WP_Error"], + 'get_terms' => ["(\$args is array{fields: 'count'} ? numeric-string : (\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array)))))|\WP_Error"], + 'wp_get_post_categories' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'all'|'all_with_object_id'} ? array : list))))|\WP_Error"], + 'wp_get_post_tags' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error"], + 'wp_get_post_terms' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error"], + 'wp_get_object_terms' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error"], ]; diff --git a/tests/TypeInferenceTest.php b/tests/TypeInferenceTest.php index 8b15422..ba2cca7 100644 --- a/tests/TypeInferenceTest.php +++ b/tests/TypeInferenceTest.php @@ -25,7 +25,9 @@ public function dataFileAsserts(): iterable yield from $this->gatherAssertTypes(__DIR__ . '/data/get_page_by_path.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_permalink.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_sites.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/get_tags.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_term_by.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/get_terms.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_taxonomies.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_term.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/get_taxonomies_for_attachments.php'); @@ -35,6 +37,10 @@ public function dataFileAsserts(): iterable yield from $this->gatherAssertTypes(__DIR__ . '/data/term_exists.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_debug_backtrace_summary.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_error_parameter.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_get_post_categories.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_get_post_tags.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_get_post_terms.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_get_object_terms.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_rest_request.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_theme.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wpdb.php'); diff --git a/tests/data/get_tags.php b/tests/data/get_tags.php new file mode 100644 index 0000000..85a74dd --- /dev/null +++ b/tests/data/get_tags.php @@ -0,0 +1,37 @@ + all) +assertType('array|WP_Error', get_tags()); +assertType('array|WP_Error', get_tags([])); + +// Requesting a count +assertType('numeric-string|WP_Error', get_tags(['fields' => 'count'])); +assertType('numeric-string|WP_Error', get_tags(['foo' => 'bar','fields' => 'count'])); + +// Requesting names or slugs +assertType('list|WP_Error', get_tags(['fields' => 'names'])); +assertType('list|WP_Error', get_tags(['fields' => 'slugs'])); +assertType('array|WP_Error', get_tags(['fields' => 'id=>name'])); +assertType('array|WP_Error', get_tags(['fields' => 'id=>slug'])); + +// Requesting IDs +assertType('list|WP_Error', get_tags(['fields' => 'ids'])); +assertType('list|WP_Error', get_tags(['fields' => 'tt_ids'])); + +// Requesting parent IDs +assertType('array|WP_Error', get_tags(['fields' => 'id=>parent'])); + +// Requesting objects +assertType('array|WP_Error', get_tags(['fields' => 'all'])); +assertType('array|WP_Error', get_tags(['fields' => 'all_with_object_id'])); +assertType('array|WP_Error', get_tags(['fields' => 'foo'])); + +// Unknown fields value +assertType('array|numeric-string|WP_Error', get_tags(['fields' => (string)$_GET['fields']])); diff --git a/tests/data/get_terms.php b/tests/data/get_terms.php new file mode 100644 index 0000000..dd83fb2 --- /dev/null +++ b/tests/data/get_terms.php @@ -0,0 +1,37 @@ + all) +assertType('array|WP_Error', get_terms()); +assertType('array|WP_Error', get_terms([])); + +// Requesting a count +assertType('numeric-string|WP_Error', get_terms(['fields' => 'count'])); +assertType('numeric-string|WP_Error', get_terms(['foo' => 'bar','fields' => 'count'])); + +// Requesting names or slugs +assertType('list|WP_Error', get_terms(['fields' => 'names'])); +assertType('list|WP_Error', get_terms(['fields' => 'slugs'])); +assertType('array|WP_Error', get_terms(['fields' => 'id=>name'])); +assertType('array|WP_Error', get_terms(['fields' => 'id=>slug'])); + +// Requesting IDs +assertType('list|WP_Error', get_terms(['fields' => 'ids'])); +assertType('list|WP_Error', get_terms(['fields' => 'tt_ids'])); + +// Requesting parent IDs +assertType('array|WP_Error', get_terms(['fields' => 'id=>parent'])); + +// Requesting objects +assertType('array|WP_Error', get_terms(['fields' => 'all'])); +assertType('array|WP_Error', get_terms(['fields' => 'all_with_object_id'])); +assertType('array|WP_Error', get_terms(['fields' => 'foo'])); + +// Unknown fields value +assertType('array|numeric-string|WP_Error', get_terms(['fields' => (string)$_GET['fields']])); diff --git a/tests/data/wp_get_object_terms.php b/tests/data/wp_get_object_terms.php new file mode 100644 index 0000000..0c2024a --- /dev/null +++ b/tests/data/wp_get_object_terms.php @@ -0,0 +1,36 @@ + all) +assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies)); +assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, [])); + +// Requesting names or slugs +assertType('list|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'names'])); +assertType('list|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'slugs'])); +assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'id=>name'])); +assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'id=>slug'])); + +// Requesting IDs +assertType('list|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'ids'])); +assertType('list|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'tt_ids'])); + +// Requesting parent IDs +assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'id=>parent'])); + +// Requesting objects +assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'all'])); +assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'all_with_object_id'])); +assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'foo'])); + +// Unknown fields value +assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => (string)$_GET['fields']])); diff --git a/tests/data/wp_get_post_categories.php b/tests/data/wp_get_post_categories.php new file mode 100644 index 0000000..fc29110 --- /dev/null +++ b/tests/data/wp_get_post_categories.php @@ -0,0 +1,35 @@ + ids) +assertType('list|WP_Error', wp_get_post_categories($postID)); +assertType('list|WP_Error', wp_get_post_categories($postID, [])); + +// Requesting names or slugs +assertType('list|WP_Error', wp_get_post_categories($postID, ['fields' => 'names'])); +assertType('list|WP_Error', wp_get_post_categories($postID, ['fields' => 'slugs'])); +assertType('array|WP_Error', wp_get_post_categories($postID, ['fields' => 'id=>name'])); +assertType('array|WP_Error', wp_get_post_categories($postID, ['fields' => 'id=>slug'])); + +// Requesting IDs +assertType('list|WP_Error', wp_get_post_categories($postID, ['fields' => 'ids'])); +assertType('list|WP_Error', wp_get_post_categories($postID, ['fields' => 'tt_ids'])); + +// Requesting parent IDs +assertType('array|WP_Error', wp_get_post_categories($postID, ['fields' => 'id=>parent'])); + +// Requesting objects +assertType('array|WP_Error', wp_get_post_categories($postID, ['fields' => 'all'])); +assertType('array|WP_Error', wp_get_post_categories($postID, ['fields' => 'all_with_object_id'])); +assertType('list|WP_Error', wp_get_post_categories($postID, ['fields' => 'foo'])); + +// Unknown fields value +assertType('array|WP_Error', wp_get_post_categories($postID, ['fields' => (string)$_GET['fields']])); diff --git a/tests/data/wp_get_post_tags.php b/tests/data/wp_get_post_tags.php new file mode 100644 index 0000000..4110a24 --- /dev/null +++ b/tests/data/wp_get_post_tags.php @@ -0,0 +1,35 @@ + all) +assertType('array|WP_Error', wp_get_post_tags($postID)); +assertType('array|WP_Error', wp_get_post_tags($postID, [])); + +// Requesting names or slugs +assertType('list|WP_Error', wp_get_post_tags($postID, ['fields' => 'names'])); +assertType('list|WP_Error', wp_get_post_tags($postID, ['fields' => 'slugs'])); +assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => 'id=>name'])); +assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => 'id=>slug'])); + +// Requesting IDs +assertType('list|WP_Error', wp_get_post_tags($postID, ['fields' => 'ids'])); +assertType('list|WP_Error', wp_get_post_tags($postID, ['fields' => 'tt_ids'])); + +// Requesting parent IDs +assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => 'id=>parent'])); + +// Requesting objects +assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => 'all'])); +assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => 'all_with_object_id'])); +assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => 'foo'])); + +// Unknown fields value +assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => (string)$_GET['fields']])); diff --git a/tests/data/wp_get_post_terms.php b/tests/data/wp_get_post_terms.php new file mode 100644 index 0000000..6385d7e --- /dev/null +++ b/tests/data/wp_get_post_terms.php @@ -0,0 +1,36 @@ + all) +assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy)); +assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, [])); + +// Requesting names or slugs +assertType('list|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'names'])); +assertType('list|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'slugs'])); +assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'id=>name'])); +assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'id=>slug'])); + +// Requesting IDs +assertType('list|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'ids'])); +assertType('list|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'tt_ids'])); + +// Requesting parent IDs +assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'id=>parent'])); + +// Requesting objects +assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'all'])); +assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'all_with_object_id'])); +assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'foo'])); + +// Unknown fields value +assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => (string)$_GET['fields']])); diff --git a/wordpress-stubs.php b/wordpress-stubs.php index 9abf723..ddf0cba 100644 --- a/wordpress-stubs.php +++ b/wordpress-stubs.php @@ -102712,6 +102712,7 @@ function sanitize_category_field($field, $value, $cat_id, $context) * @phpstan-param array{ * taxonomy?: string, * } $args + * @phpstan-return ($args is array{fields: 'count'} ? numeric-string : ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : array)))))|\WP_Error */ function get_tags($args = '') { @@ -104004,7 +104005,7 @@ function check_comment($author, $email, $url, $comment, $user_ip, $user_agent, $ * update_comment_meta_cache?: bool, * update_comment_post_cache?: bool, * } $args - * @phpstan-return ($args is array{'count': true} ? int : ($args is array{'fields': 'ids'} ? array : array)) + * @phpstan-return ($args is array{count: true} ? int : ($args is array{fields: 'ids'} ? array : array)) */ function get_approved_comments($post_id, $args = array()) { @@ -128212,7 +128213,7 @@ function update_sitemeta_cache($site_ids) * meta_type_key?: string, * meta_query?: array, * } $args See WP_Site_Query::__construct() - * @phpstan-return ($args is array{'count': true} ? int : ($args is array{'fields': 'ids'} ? array : array)) + * @phpstan-return ($args is array{count: true} ? int : ($args is array{fields: 'ids'} ? array : array)) */ function get_sites($args = array()) { @@ -133625,7 +133626,7 @@ function is_post_publicly_viewable($post = \null) * w?: int, * year?: int, * } $args - * @phpstan-return ($args is array{'fields': 'id=>parent'|'ids'} ? array : array) + * @phpstan-return ($args is array{fields: 'id=>parent'|'ids'} ? array : array) */ function get_posts($args = \null) { @@ -134140,6 +134141,7 @@ function wp_untrash_post_comments($post = \null) * meta_type_key?: string, * meta_query?: array, * } $args See WP_Term_Query::__construct() + * @phpstan-return ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'all'|'all_with_object_id'} ? array : list))))|\WP_Error */ function wp_get_post_categories($post_id = 0, $args = array()) { @@ -134195,6 +134197,7 @@ function wp_get_post_categories($post_id = 0, $args = array()) * meta_type_key?: string, * meta_query?: array, * } $args See WP_Term_Query::__construct() + * @phpstan-return ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error */ function wp_get_post_tags($post_id = 0, $args = array()) { @@ -134252,6 +134255,7 @@ function wp_get_post_tags($post_id = 0, $args = array()) * meta_type_key?: string, * meta_query?: array, * } $args + * @phpstan-return ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error */ function wp_get_post_terms($post_id = 0, $taxonomy = 'post_tag', $args = array()) { @@ -140353,6 +140357,7 @@ function get_term_to_edit($id, $taxonomy) * meta_type_key?: string, * meta_query?: array, * } $args See WP_Term_Query::__construct() + * @phpstan-return ($args is array{fields: 'count'} ? numeric-string : ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : array)))))|\WP_Error */ function get_terms($args = array(), $deprecated = '') { @@ -140776,6 +140781,7 @@ function wp_delete_category($cat_id) * meta_type_key?: string, * meta_query?: array, * } $args See WP_Term_Query::__construct() + * @phpstan-return ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error */ function wp_get_object_terms($object_ids, $taxonomies, $args = array()) { From a3952c3ab2f6b02d37aa9e18985b6710fb3ba701 Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Fri, 23 Aug 2024 18:25:23 +0200 Subject: [PATCH 05/10] fix coding standards --- tests/data/get_category_by_path.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/data/get_category_by_path.php b/tests/data/get_category_by_path.php index 9b07cb7..d131772 100644 --- a/tests/data/get_category_by_path.php +++ b/tests/data/get_category_by_path.php @@ -10,7 +10,7 @@ /** @var bool $bool */ $bool; -assertType('WP_Error|WP_Term|null', get_category_by_path('', $bool, )); +assertType('WP_Error|WP_Term|null', get_category_by_path('', $bool)); assertType('WP_Error|WP_Term|null', get_category_by_path('', $bool, 'OBJECT')); assertType('array|WP_Error|null', get_category_by_path('', $bool, 'ARRAY_A')); assertType('array|WP_Error|null', get_category_by_path('', $bool, 'ARRAY_N')); From 2c932caff8a0aed7787557e3182180bcae2e8391 Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Fri, 23 Aug 2024 20:38:56 +0200 Subject: [PATCH 06/10] Update wordpress-stubs.php --- wordpress-stubs.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/wordpress-stubs.php b/wordpress-stubs.php index ddf0cba..3599325 100644 --- a/wordpress-stubs.php +++ b/wordpress-stubs.php @@ -41475,7 +41475,7 @@ class WP_Http * filename?: string, * limit_response_size?: int, * } $args - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ public function request($url, $args = array()) { @@ -41546,7 +41546,7 @@ public function _get_first_available_transport($args, $url = \null) * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. * A WP_Error instance upon error. See WP_Http::response() for details. - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ public function post($url, $args = array()) { @@ -41562,7 +41562,7 @@ public function post($url, $args = array()) * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. * A WP_Error instance upon error. See WP_Http::response() for details. - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ public function get($url, $args = array()) { @@ -41578,7 +41578,7 @@ public function get($url, $args = array()) * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. * A WP_Error instance upon error. See WP_Http::response() for details. - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ public function head($url, $args = array()) { @@ -118422,7 +118422,7 @@ function _wp_http_get_object() * filename?: string, * limit_response_size?: int, * } $args See WP_Http::request() - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ function wp_safe_remote_request($url, $args = array()) { @@ -118465,7 +118465,7 @@ function wp_safe_remote_request($url, $args = array()) * filename?: string, * limit_response_size?: int, * } $args See WP_Http::request() - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ function wp_safe_remote_get($url, $args = array()) { @@ -118508,7 +118508,7 @@ function wp_safe_remote_get($url, $args = array()) * filename?: string, * limit_response_size?: int, * } $args See WP_Http::request() - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ function wp_safe_remote_post($url, $args = array()) { @@ -118551,7 +118551,7 @@ function wp_safe_remote_post($url, $args = array()) * filename?: string, * limit_response_size?: int, * } $args See WP_Http::request() - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ function wp_safe_remote_head($url, $args = array()) { @@ -118615,7 +118615,7 @@ function wp_safe_remote_head($url, $args = array()) * filename?: string, * limit_response_size?: int, * } $args See WP_Http::request() - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ function wp_remote_request($url, $args = array()) { @@ -118651,7 +118651,7 @@ function wp_remote_request($url, $args = array()) * filename?: string, * limit_response_size?: int, * } $args See WP_Http::request() - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ function wp_remote_get($url, $args = array()) { @@ -118687,7 +118687,7 @@ function wp_remote_get($url, $args = array()) * filename?: string, * limit_response_size?: int, * } $args See WP_Http::request() - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ function wp_remote_post($url, $args = array()) { @@ -118723,7 +118723,7 @@ function wp_remote_post($url, $args = array()) * filename?: string, * limit_response_size?: int, * } $args See WP_Http::request() - * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int,message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error + * @phpstan-return array{headers: \WpOrg\Requests\Utility\CaseInsensitiveDictionary, body: string, response: array{code: int, message: string}, cookies: array, filename: string|null, http_response: \WP_HTTP_Requests_Response}|\WP_Error */ function wp_remote_head($url, $args = array()) { From 65b63fcdb286e196d3bd2f55e5d596df92a1b1d7 Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:58:24 +0200 Subject: [PATCH 07/10] Remove duplicate key --- functionMap.php | 1 - 1 file changed, 1 deletion(-) diff --git a/functionMap.php b/functionMap.php index b88e288..463bc28 100644 --- a/functionMap.php +++ b/functionMap.php @@ -166,6 +166,5 @@ 'wp_get_post_tags' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error"], 'wp_get_post_terms' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error"], 'wp_get_object_terms' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error"], - 'wp_parse_str' => [null, '@param-out' => 'array $result'], 'wp_parse_str' => [null, '@phpstan-param-out' => 'array $result'], ]; From 6088a7ab30b89e316b49bf743353309879a950d9 Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Mon, 26 Aug 2024 12:06:49 +0200 Subject: [PATCH 08/10] Fix coding standard issues --- tests/data/get_approved_comments.php | 30 +++++++++------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/tests/data/get_approved_comments.php b/tests/data/get_approved_comments.php index f610aa5..28ab1e3 100644 --- a/tests/data/get_approved_comments.php +++ b/tests/data/get_approved_comments.php @@ -9,24 +9,12 @@ assertType('array', get_approved_comments(1)); -assertType('int', get_approved_comments(1, [ - 'count' => true, -])); - -assertType('int', get_approved_comments(1, [ - 'count' => true, - 'fields' => 'ids', -])); - -assertType('array', get_approved_comments(1, [ - 'count' => false, -])); - -assertType('array', get_approved_comments(1, [ - 'fields' => 'ids', -])); - -assertType('array', get_approved_comments(1, [ - 'count' => false, - 'fields' => 'ids', -])); +assertType('int', get_approved_comments(1, ['count' => true])); + +assertType('int', get_approved_comments(1, ['count' => true,'fields' => 'ids'])); + +assertType('array', get_approved_comments(1, ['count' => false])); + +assertType('array', get_approved_comments(1, ['fields' => 'ids'])); + +assertType('array', get_approved_comments(1, ['count' => false, 'fields' => 'ids'])); From 968591d2624e2872dd87745177ddb117db566bef Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Mon, 26 Aug 2024 12:12:49 +0200 Subject: [PATCH 09/10] Update phpcs.xml.dist --- phpcs.xml.dist | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 6ebf26a..7512d52 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -44,6 +44,9 @@ tests/ + + tests/TypeInferenceTest.php + tests/TypeInferenceTest.php From 53aac37dcc945dfd6d539f937518744c2d7385aa Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Sun, 8 Sep 2024 20:24:07 +0200 Subject: [PATCH 10/10] Add $args['fields'] = 'count', $object_id, $taxonomy --- functionMap.php | 8 ++++---- tests/data/wp_get_object_terms.php | 11 ++++++++++- tests/data/wp_get_post_categories.php | 8 +++++++- tests/data/wp_get_post_tags.php | 8 +++++++- tests/data/wp_get_post_terms.php | 10 +++++++++- wordpress-stubs.php | 8 ++++---- 6 files changed, 41 insertions(+), 12 deletions(-) diff --git a/functionMap.php b/functionMap.php index 909656c..3c5063a 100644 --- a/functionMap.php +++ b/functionMap.php @@ -182,10 +182,10 @@ 'get_sites' => ["(\$args is array{count: true} ? int : (\$args is array{fields: 'ids'} ? array : array))"], 'get_tags' => ["(\$args is array{fields: 'count'} ? numeric-string : (\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array)))))|\WP_Error"], 'get_terms' => ["(\$args is array{fields: 'count'} ? numeric-string : (\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array)))))|\WP_Error"], - 'wp_get_post_categories' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'all'|'all_with_object_id'} ? array : list))))|\WP_Error"], - 'wp_get_post_tags' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error"], - 'wp_get_post_terms' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error"], - 'wp_get_object_terms' => ["(\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error"], + 'wp_get_post_categories' => ["(\$post_id is 0 ? array{} : ((\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'all'|'all_with_object_id'} ? array : (\$args is array{fields: 'count'} ? numeric-string : list)))))|\WP_Error))"], + 'wp_get_post_tags' => ["(\$post_id is 0 ? array{} : ((\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : (\$args is array{fields: 'count'} ? numeric-string : array)))))|\WP_Error))"], + 'wp_get_post_terms' => ["(\$post_id is 0 ? array{} : (\$taxonomy is empty ? array{} : ((\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : (\$args is array{fields: 'count'} ? numeric-string : array)))))|\WP_Error)))"], + 'wp_get_object_terms' => ["(\$object_ids is empty ? array{} : (\$taxonomies is empty ? array{} : ((\$args is array{fields: 'names'|'slugs'} ? list : (\$args is array{fields: 'id=>name'|'id=>slug'} ? array : (\$args is array{fields: 'id=>parent'} ? array : (\$args is array{fields: 'ids'|'tt_ids'} ? list : (\$args is array{fields: 'count'} ? numeric-string : array)))))|\WP_Error)))"], 'wp_parse_list' => ['($input_list is array ? array : list)'], 'wp_parse_str' => [null, '@phpstan-param-out' => 'array $result'], 'size_format' => ["(\$bytes is not numeric ? false : (\$bytes is negative-int|'0' ? false : string))"], diff --git a/tests/data/wp_get_object_terms.php b/tests/data/wp_get_object_terms.php index 0c2024a..990fb9a 100644 --- a/tests/data/wp_get_object_terms.php +++ b/tests/data/wp_get_object_terms.php @@ -14,6 +14,12 @@ assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies)); assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, [])); +// Empty $object_ids or $taxonomies +assertType('array{}', wp_get_object_terms(0, $taxonomies, ['fields' => 'count'])); +assertType('array{}', wp_get_object_terms([], $taxonomies)); +assertType('array{}', wp_get_object_terms($objectIDs, '')); +assertType('array{}', wp_get_object_terms($objectIDs, [])); + // Requesting names or slugs assertType('list|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'names'])); assertType('list|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'slugs'])); @@ -32,5 +38,8 @@ assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'all_with_object_id'])); assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'foo'])); +// Requesting a count +assertType('numeric-string|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => 'count'])); + // Unknown fields value -assertType('array|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => (string)$_GET['fields']])); +assertType('array|numeric-string|WP_Error', wp_get_object_terms($objectIDs, $taxonomies, ['fields' => (string)$_GET['fields']])); diff --git a/tests/data/wp_get_post_categories.php b/tests/data/wp_get_post_categories.php index fc29110..43827eb 100644 --- a/tests/data/wp_get_post_categories.php +++ b/tests/data/wp_get_post_categories.php @@ -13,6 +13,9 @@ assertType('list|WP_Error', wp_get_post_categories($postID)); assertType('list|WP_Error', wp_get_post_categories($postID, [])); +// Empty $post_id +assertType('array{}', wp_get_post_categories(0)); + // Requesting names or slugs assertType('list|WP_Error', wp_get_post_categories($postID, ['fields' => 'names'])); assertType('list|WP_Error', wp_get_post_categories($postID, ['fields' => 'slugs'])); @@ -31,5 +34,8 @@ assertType('array|WP_Error', wp_get_post_categories($postID, ['fields' => 'all_with_object_id'])); assertType('list|WP_Error', wp_get_post_categories($postID, ['fields' => 'foo'])); +// Requesting a count +assertType('numeric-string|WP_Error', wp_get_post_categories($postID, ['fields' => 'count'])); + // Unknown fields value -assertType('array|WP_Error', wp_get_post_categories($postID, ['fields' => (string)$_GET['fields']])); +assertType('array|numeric-string|WP_Error', wp_get_post_categories($postID, ['fields' => (string)$_GET['fields']])); diff --git a/tests/data/wp_get_post_tags.php b/tests/data/wp_get_post_tags.php index 4110a24..d9ab377 100644 --- a/tests/data/wp_get_post_tags.php +++ b/tests/data/wp_get_post_tags.php @@ -13,6 +13,9 @@ assertType('array|WP_Error', wp_get_post_tags($postID)); assertType('array|WP_Error', wp_get_post_tags($postID, [])); +// Empty $post_id +assertType('array{}', wp_get_post_tags(0)); + // Requesting names or slugs assertType('list|WP_Error', wp_get_post_tags($postID, ['fields' => 'names'])); assertType('list|WP_Error', wp_get_post_tags($postID, ['fields' => 'slugs'])); @@ -31,5 +34,8 @@ assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => 'all_with_object_id'])); assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => 'foo'])); +// Requesting a count +assertType('numeric-string|WP_Error', wp_get_post_tags($postID, ['fields' => 'count'])); + // Unknown fields value -assertType('array|WP_Error', wp_get_post_tags($postID, ['fields' => (string)$_GET['fields']])); +assertType('array|numeric-string|WP_Error', wp_get_post_tags($postID, ['fields' => (string)$_GET['fields']])); diff --git a/tests/data/wp_get_post_terms.php b/tests/data/wp_get_post_terms.php index 6385d7e..7617280 100644 --- a/tests/data/wp_get_post_terms.php +++ b/tests/data/wp_get_post_terms.php @@ -14,6 +14,11 @@ assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy)); assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, [])); +// Empty $post_id or $taxonomy +assertType('array{}', wp_get_post_terms(0, $taxonomy)); +assertType('array{}', wp_get_post_terms($postID, '')); +assertType('array{}', wp_get_post_terms($postID, [])); + // Requesting names or slugs assertType('list|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'names'])); assertType('list|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'slugs'])); @@ -32,5 +37,8 @@ assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'all_with_object_id'])); assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'foo'])); +// Requesting a count +assertType('numeric-string|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => 'count'])); + // Unknown fields value -assertType('array|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => (string)$_GET['fields']])); +assertType('array|numeric-string|WP_Error', wp_get_post_terms($postID, $taxonomy, ['fields' => (string)$_GET['fields']])); diff --git a/wordpress-stubs.php b/wordpress-stubs.php index 1fdd9a3..6843940 100644 --- a/wordpress-stubs.php +++ b/wordpress-stubs.php @@ -134180,7 +134180,7 @@ function wp_untrash_post_comments($post = \null) * meta_type_key?: string, * meta_query?: array, * } $args See WP_Term_Query::__construct() - * @phpstan-return ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'all'|'all_with_object_id'} ? array : list))))|\WP_Error + * @phpstan-return ($post_id is 0 ? array{} : (($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'all'|'all_with_object_id'} ? array : ($args is array{fields: 'count'} ? numeric-string : list)))))|\WP_Error)) */ function wp_get_post_categories($post_id = 0, $args = array()) { @@ -134236,7 +134236,7 @@ function wp_get_post_categories($post_id = 0, $args = array()) * meta_type_key?: string, * meta_query?: array, * } $args See WP_Term_Query::__construct() - * @phpstan-return ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error + * @phpstan-return ($post_id is 0 ? array{} : (($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : ($args is array{fields: 'count'} ? numeric-string : array)))))|\WP_Error)) */ function wp_get_post_tags($post_id = 0, $args = array()) { @@ -134294,7 +134294,7 @@ function wp_get_post_tags($post_id = 0, $args = array()) * meta_type_key?: string, * meta_query?: array, * } $args - * @phpstan-return ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error + * @phpstan-return ($post_id is 0 ? array{} : ($taxonomy is empty ? array{} : (($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : ($args is array{fields: 'count'} ? numeric-string : array)))))|\WP_Error))) */ function wp_get_post_terms($post_id = 0, $taxonomy = 'post_tag', $args = array()) { @@ -140820,7 +140820,7 @@ function wp_delete_category($cat_id) * meta_type_key?: string, * meta_query?: array, * } $args See WP_Term_Query::__construct() - * @phpstan-return ($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : array))))|\WP_Error + * @phpstan-return ($object_ids is empty ? array{} : ($taxonomies is empty ? array{} : (($args is array{fields: 'names'|'slugs'} ? list : ($args is array{fields: 'id=>name'|'id=>slug'} ? array : ($args is array{fields: 'id=>parent'} ? array : ($args is array{fields: 'ids'|'tt_ids'} ? list : ($args is array{fields: 'count'} ? numeric-string : array)))))|\WP_Error))) */ function wp_get_object_terms($object_ids, $taxonomies, $args = array()) {