[wp-trac] [WordPress Trac] #59818: [PHP 8.1] deprecated null in `explode()` for 'ping_sites' in `wp-admin/options-writing.php` with "Discourage search engines" on
WordPress Trac
noreply at wordpress.org
Mon Jun 17 18:01:17 UTC 2024
#59818: [PHP 8.1] deprecated null in `explode()` for 'ping_sites' in `wp-admin
/options-writing.php` with "Discourage search engines" on
-------------------------------------------------+-------------------------
Reporter: kitchin | Owner:
| hellofromTonya
Type: defect (bug) | Status: closed
Priority: normal | Milestone: 6.6
Component: Administration | Version:
Severity: normal | Resolution: fixed
Keywords: php81 has-patch has-testing-info | Focuses: php-
commit | compatibility
-------------------------------------------------+-------------------------
Changes (by hellofromTonya):
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"58425" 58425]:
{{{
#!CommitTicketReference repository="" revision="58425"
Code Modernization: Fix 'ping_sites' non-nullable deprecation.
When saving options from the Settings page, include the `'ping_sites'`
option in the allowed "writing" options list only when the `'blog_public'`
option is `'1'`.
Fixes a PHP 8.1 and above "null to non-nullable" deprecation notice in
`sanitize_option()` ([https://core.trac.wordpress.org/browser/trunk/src
/wp-includes/formatting.php?annotate=blame#L4952 which happens when here]
as part of [22255]):
{{{
Deprecated: explode(): Passing null to parameter #2 ($string) of type
string is deprecated in .../wp-includes/formatting.php
}}}
**Explanation**
[https://developer.wordpress.org/apis/options/#writing Per the
documentation], the `ping_sites` option requires the `'blog_public'`
option to have a value of `'1'` and must be a `string` data type. `null`
is not valid for this option.
The relationship between the 2 options shows itself in the `options-
writing.php` code ([https://core.trac.wordpress.org/browser/tags/6.5.4/src
/wp-admin/options-writing.php#L233 shown here] and in [4326]), as the
`textarea#ping_sites` only renders when `'1' === get_option( 'blog_public'
)`.
**What happens if `'blog_public'` is not `'1'`?**
The `'ping_sites'` option will not be a field on the page. Upon saving:
* HTTP POST (`$_POST`) does not include `'ping_sites'`.
* Before this commit:
* The [https://core.trac.wordpress.org/browser/trunk/src/wp-
admin/options.php#L333 option's value was set to] `null` before being
passed to `update_option()`.
* `update_option()` invokes `sanitize_option()`.
* A `null` value for the `'ping_sites'` case was passed to `explode()`,
which threw a deprecation notice on PHP 8.1 and above.
* With this commit, the `'ping_sites'` option is no longer included in the
allow list and thus will not be passed to `update_options()` >
`sanitize_option()` > `explode()`.
Follow-up to [22255], [12825], [4326], [949].
Props kitchin, SergeyBiryukov, swissspidy, devmuhib, rajinsharwar,
hellofromTonya.
Fixes #59818.
}}}
--
Ticket URL: <https://core.trac.wordpress.org/ticket/59818#comment:17>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list