Make WordPress Core

Changeset 52799


Ignore:
Timestamp:
02/25/2022 01:46:23 PM (5 years ago)
Author:
SergeyBiryukov
Message:

Code Modernization: Check the return type of wp_parse_url() in wp_mail().

As per the PHP manual:

If the component parameter is omitted, an associative array is returned.
If the component parameter is specified, parse_url() returns a string (or an int, in the case of PHP_URL_PORT) instead of an array. If the requested component doesn't exist within the given URL, null will be returned.

Reference: ​PHP Manual: parse_url(): Return Values

In PHP 8.1, if the home URL does not have a "host" component, it would lead to a substr(): Passing null to parameter #1 ($string) of type string is deprecated notice.

Changing the logic around and adding validation for the return type value of wp_parse_url() prevents that.

Follow-up to [48601], [51606], [51622], [51626], [51629], [51630].

Props dennisatyoast, jrf.
See #54730.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/pluggable.php

    r52422 r52799  
    379379                if ( ! isset( $from_email ) ) {
    380380                        // Get the site domain and get rid of www.
    381                         $sitename = wp_parse_url( network_home_url(), PHP_URL_HOST );
    382                         if ( 'www.' === substr( $sitename, 0, 4 ) ) {
    383                                 $sitename = substr( $sitename, 4 );
     381                        $sitename   = wp_parse_url( network_home_url(), PHP_URL_HOST );
     382                        $from_email = 'wordpress@';
     383
     384                        if ( null !== $sitename ) {
     385                                if ( 'www.' === substr( $sitename, 0, 4 ) ) {
     386                                        $sitename = substr( $sitename, 4 );
     387                                }
     388
     389                                $from_email .= $sitename;
    384390                        }
    385 
    386                         $from_email = 'wordpress@' . $sitename;
    387391                }
    388392
  • trunk/tests/phpunit/tests/mail.php

    r52010 r52799  
    227227
    228228        /**
     229         * Tests that wp_mail() returns false with an empty home URL and does not error out on PHP 8.1.
     230         *
     231         * @ticket 54730
     232         */
     233        public function test_wp_mail_with_empty_home_url() {
     234                $to      = 'address@tld.com';
     235                $subject = 'Testing';
     236                $message = 'Test Message';
     237
     238                // Multisite test runs.
     239                add_filter( 'network_home_url', '__return_empty_string' );
     240
     241                // Single site test runs.
     242                add_filter( 'home_url', '__return_empty_string' );
     243
     244                $success = wp_mail( $to, $subject, $message );
     245
     246                $this->assertFalse( $success, 'wp_mail() should have returned false' );
     247                $this->assertGreaterThan( 0, did_action( 'wp_mail_failed' ), 'wp_mail_failed action was not called' );
     248        }
     249
     250        /**
    229251         * @ticket 30266
    230252         */
Note: See TracChangeset for help on using the changeset viewer.