#54730 closed task (blessed) (fixed)
PHP 8.x: various compatibility fixes for WordPress 6.0
Reported by: | hellofromTonya | Owned by: | |
---|---|---|---|
Milestone: | 6.0 | Priority: | normal |
Severity: | normal | Version: | |
Component: | General | Keywords: | php8 php81 has-patch has-unit-tests |
Focuses: | coding-standards | Cc: |
Description
Previously:
This ticket will be used as an "epic", allowing a variety of small patches each fixing a specific failure to be added to and committed against this ticket.
For patches addressing all instances of failures related to one specific PHP version (such as PHP 8.0, 8.1, or 8.2) change across the codebase, separate tickets should still be opened.
For an example of issues/patches with separate tickets, see:
- #53299 PHP 8.1: Update
is_serialized
function to accept Enums - #53465 PHP 8.1.: the default value of the flags parameter for
htmlentities()
et all needs to be explicitly set
When opening a separate ticket, please tag it with the appropriate PHP version keyword so that these tickets can be easily found:
- PHP 8.2: keyword is
php82
with its report https://core.trac.wordpress.org/query?keywords=~php82 - PHP 8.1: keyword is
php81
with its report https://core.trac.wordpress.org/query?keywords=~php81 - PHP 8.0: keyword is
php8
with its report https://core.trac.wordpress.org/query?keywords=~php8
Attachments (1)
Change History (25)
This ticket was mentioned in PR #1801 on WordPress/wordpress-develop by anomiex.
3 years ago
#1
- Keywords has-patch added
hellofromtonya commented on PR #1801:
3 years ago
#2
I see that you've closed https://core.trac.wordpress.org/ticket/53635 without addressing the issue this PR fixes. What's the way forward now?
@anomiex Trac ticket https://core.trac.wordpress.org/ticket/54730 is now open for continuing PHP 8.x compatibility fixes during the 6.0 cycle. I updated the description in this PR to point at the new ticket.
This ticket was mentioned in PR #1556 on WordPress/wordpress-develop by jrfnl.
3 years ago
#3
- Keywords has-unit-tests added
Fixes strpos(): Passing null to parameter #1 ($haystack) of type string is deprecated
notices on PHP 8.1.
Impact: 38 of the pre-existing tests are affected by this issue.
Note: trac ticket link below not added yet on purpose while this ticket is still WIP.
Trac ticket: https://core.trac.wordpress.org/ticket/54730
Update: Though this is WIP, adding the new 6.0 ticket to ensure this PR moves forward in the 6.0 cycle.
This ticket was mentioned in PR #1658 on WordPress/wordpress-develop by jrfnl.
3 years ago
#4
Potential fix for the below issue, but the fix _may_ have unforeseen side-effects. Needs second opinion from someone with detailed domain knowledge of the XMLRPC functionality.
Tests_XMLRPC_mw_newPost::test_post_thumbnail strpos(): Passing null to parameter #1 ($haystack) of type string is deprecated path/to/src/wp-includes/class-wp-xmlrpc-server.php:5681 path/to/src/wp-includes/src/wp-includes/class-wp-xmlrpc-server.php:5606 path/to/tests/phpunit/tests/xmlrpc/mw/newPost.php:147
Trac ticket: https://core.trac.wordpress.org/ticket/54730
Update: Changed the Trac ticket to the 6.0 one.
#5
@
3 years ago
Dropping [51968] as a reminder of ongoing architectural decisions needed to resolve remaining known deprecation notices
This changeset ignores (on purpose) "null to nullable" deprecations for select tests. Why? Here are the details:
Adds an expectation for PHP 8.1 "passing null to non-nullable" deprecation notice to select tests where the deprecation is generated by one of the functions in the wp-includes/formatting.php
file, either via a filter hook callback or by a direct call.
Instead of haphazardly fixing these issues exposed by the tests, a more structural and all-encompassing solution for input validation should be architected and implemented as otherwise, we'll keep running into similar issues time and again with each new PHP version.
To discourage people from "fixing" these issues now anyway, this commit "hides" nearly all of these issues from the test runs.
Once a more structural solution is designed, these tests and the underlying functions causing the deprecation notices should be revisited and the structural solution put in place.
This ticket was mentioned in PR #2133 on WordPress/wordpress-develop by hellofromtonya.
3 years ago
#6
The PHP native trim()
function expects to be passed a string and it is not a nullable parameter. Passing null
to it will result in a trim(): Passing null to parameter #1 ($string) of type string is deprecated
notice on PHP 8.1.
In the WP_User::get_data_by()
static method, the value given is expected to be int or string. However no input validation was done for fields other than the id field.
This PR adds input validation for the field $value
to ensure it is a scalar type and if no, bails out returning false
. Why is_scalar()
? For backwards-compatible, the native behavior of trim()
is retained as it coerces non-string scalar types into a string.
Trac ticket: https://core.trac.wordpress.org/ticket/54730
References:
#9
@
3 years ago
If helps, I set up the "wpsabot" account for PHP 8.1 + MariaDB 10.6 (latest versions for everything)
Errors be like: https://make.wordpress.org/hosting/test-results/r52620/wpsabot-r52620/
I'm no expert doing tests, but if I can help, please, ask :)
#10
@
3 years ago
As #53635 was closed, I tentatively re-propose 53635-09-script-translations.patch to avoid notices in untrailingslashit()
due to the default value of the script translations path being null instead of an empty string.
Also it's worth noticing that the doc blocks don't document null
as an accepted value for the path.
3 years ago
#11
Looks like #2133 will fix this too, by making the called functions no longer object to being passed null. If that gets merged, this can be closed.
hellofromtonya commented on PR #1801:
3 years ago
#12
Looks like https://github.com/WordPress/wordpress-develop/pull/2133 will fix this too, by making the called functions no longer object to being passed null. If that gets merged, this can be closed.
Once #2133 gets merged, then yes, it will resolve this PR's deprecation notice without further changes. Plus #2133 resolves the issue at the lower level, i.e. where the deprecation notice is triggered. I think overall this PR can be closed in favor of #2133.
Note: There's an improvement opportunity, though out of scope for the purpose of this PR:
- Guard
email_exists()
to invokeget_user_by()
only when a string type is passed toemail_exists()
, i.e. providing a teeny tiny micro-optimization when a non-string is passed. (This tweak deserves a separate PR and tests.)
This ticket was mentioned in PR #2359 on WordPress/wordpress-develop by d-claassen.
3 years ago
#13
This makes sure that wp_mail
will not run into a PHP 8.1 null to non-nullable deprecation error when network_home_url
returns an invalid url. I focussed on keeping the old implementation 100% intact to ensure that any functions hooked into the wp_mail_from
filter and relying a potentially invalid from address won't be affected.
Trac ticket: https://core.trac.wordpress.org/ticket/54730
#14
@
3 years ago
I've created a PR to prevent an 8.1 null to non-nullable deprecation in wp_mail
. I've already discussed this fix with @jrf.
SergeyBiryukov commented on PR #2359:
3 years ago
#15
Thanks for the PR!
Just a minor note that closures like this:
add_filter( 'network_home_url', function( $url ) { return ''; } );
can be simplified by using __return_empty_string()
as a callback:
add_filter( 'network_home_url', '__return_empty_string' );
It has the same effect but looks a bit cleaner. I can adjust this on commit.
SergeyBiryukov commented on PR #2359:
3 years ago
#17
#18
follow-up:
↓ 19
@
3 years ago
Looking at [48601], it seems that some other functions need the same fix as in [52799], since they were all changed to use wp_parse_url( network_home_url(), PHP_URL_HOST )
:
wpmu_signup_blog_notification()
wpmu_signup_user_notification()
wpmu_welcome_notification()
wpmu_welcome_user_notification()
wp_notify_postauthor()
#19
in reply to:
↑ 18
@
3 years ago
Replying to SergeyBiryukov:
Looking at [48601], it seems that some other functions need the same fix as in [52799], since they were all changed to use
wp_parse_url( network_home_url(), PHP_URL_HOST )
:
wpmu_signup_blog_notification()
wpmu_signup_user_notification()
wpmu_welcome_notification()
wpmu_welcome_user_notification()
wp_notify_postauthor()
Yes, I started reviewing all uses of [wp_]parse_url()
a while back, but there are a LOT of them, so I didn't manage to finish that yet.
I can provide a list of what still needs reviewing with a lot of things filtered out already if it helps.
This ticket was mentioned in Slack in #core by costdev. View the logs.
3 years ago
#22
@
3 years ago
- Resolution set to fixed
- Status changed from new to closed
6.0's last beta is happening now and RC1 is tomorrow. I opened #55656 to continue PHP 8.x cross-compatibility work during the next cycle. I'll close this ticket.
Thank you everyone for your contributions!
SergeyBiryukov commented on PR #1658:
2 years ago
#23
Thanks for the PR! I believe this was superseded by #3187.
This fixes a "Deprecated: trim(): Passing null to parameter #1 ($string) of type string is deprecated" warning on PHP 8.1.
PHP has started requiring that built-in method arguments that are not explicitly declared as nullable may no longer be passed null. In this case it seems to make more sense to avoid calling WordPress's own
email_exists()
function with null, as that method is declared as taking only strings and a null email is never going to exist anyway.Trac ticket: https://core.trac.wordpress.org/ticket/54730