From f0a13694410205758fa68e67b119ced8ef95b8a8 Mon Sep 17 00:00:00 2001 From: Tonya Mork Date: Thu, 28 Sep 2023 21:24:35 +0000 Subject: [PATCH] Code Modernization: Fix "passing null to non-nullable" deprecation from next_posts(). The `esc_url()` function expects to a string for `$url` parameter. There is no input validation within that function. The function contains a `ltrim()` which also expects a string. Passing `null` to this parameter results in `Deprecated: ltrim(): Passing null to parameter #1 ($string) of type string is deprecated` notice on PHP 8.1+. Tracing the stack back, a `null` is being passed to it within `next_posts()` when `get_next_posts_page_link()` returns `null` (it can return a string or `null`). On PHP 7.0 to PHP 8.x, an empty string is returned from `esc_url()` when `null` is passed to it. The change in this changeset avoids the deprecation notice by not invoking `esc_url()` when `get_next_posts_page_link()` returns `null` and instead sets the `$output` to an empty string, thus maintain the same behavior as before (minus the deprecation notice). Adds a test to validate an empty string is returned and the absence of the deprecation (when running on PHP 8.1+). Follow-up to [11383], [9632]. Props codersantosh, nihar007, hellofromTonya, mukesh27, oglekler, rajinsharwar. Fixes #59154. git-svn-id: https://develop.svn.wordpress.org/trunk@56740 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/link-template.php | 3 +- tests/phpunit/tests/link/nextPosts.php | 41 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 tests/phpunit/tests/link/nextPosts.php diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php index a34b34b6ceb5f..34bfd267a3fe3 100644 --- a/src/wp-includes/link-template.php +++ b/src/wp-includes/link-template.php @@ -2511,7 +2511,8 @@ function get_next_posts_page_link( $max_page = 0 ) { * @return string|void The link URL for next posts page if `$display = false`. */ function next_posts( $max_page = 0, $display = true ) { - $output = esc_url( get_next_posts_page_link( $max_page ) ); + $link = get_next_posts_page_link( $max_page ); + $output = $link ? esc_url( $link ) : ''; if ( $display ) { echo $output; diff --git a/tests/phpunit/tests/link/nextPosts.php b/tests/phpunit/tests/link/nextPosts.php new file mode 100644 index 0000000000000..de43f5fedda9f --- /dev/null +++ b/tests/phpunit/tests/link/nextPosts.php @@ -0,0 +1,41 @@ +post->create_many( 3 ); + $paged = 2; + $wp_query = new WP_Query( + array( + 'post_type' => 'post', + 'posts_per_page' => 1, + 'paged' => $paged, + ) + ); + } + + /** + * The absence of a deprecation notice on PHP 8.1+ also shows that the issue is resolved. + * + * @ticket 59154 + */ + public function test_should_return_empty_string_when_no_next_posts_page_link() { + $this->assertSame( '', next_posts( 1, false ) ); + } +}