[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