Make WordPress Core

Changeset 38681


Ignore:
Timestamp:
09/30/2016 04:09:45 AM (10 years ago)
Author:
jeremyfelt
Message:

Multisite: Ensure a consistent WP_Site return from get_site_by_path().

It is possible to short circuit get_site_by_path() using the pre_get_site_by_path filter. When this happens and a standard site object is provided, we can make sure it is upgraded to a proper WP_Site object before passing it on.

Props flixos90.
Fixes #37053.

Location:
trunk
Files:
2 edited

Legend:

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

    r38515 r38681  
    138138 *
    139139 * @since 3.9.0
     140 * @since 4.7.0 Updated to always return a `WP_Site` object.
    140141 *
    141142 * @global wpdb $wpdb WordPress database abstraction object.
     
    144145 * @param string   $path     Path to check.
    145146 * @param int|null $segments Path segments to use. Defaults to null, or the full path.
    146  * @return object|false Site object if successful. False when no site is found.
     147 * @return WP_Site|false Site object if successful. False when no site is found.
    147148 */
    148149function get_site_by_path( $domain, $path, $segments = null ) {
     
    187188         * @since 3.9.0
    188189         *
    189          * @param null|bool|object $site     Site value to return by path.
    190          * @param string           $domain   The requested domain.
    191          * @param string           $path     The requested path, in full.
    192          * @param int|null         $segments The suggested number of paths to consult.
    193          *                                   Default null, meaning the entire path was to be consulted.
    194          * @param array            $paths    The paths to search for, based on $path and $segments.
     190         * @param null|bool|WP_Site $site     Site value to return by path.
     191         * @param string            $domain   The requested domain.
     192         * @param string            $path     The requested path, in full.
     193         * @param int|null          $segments The suggested number of paths to consult.
     194         *                                    Default null, meaning the entire path was to be consulted.
     195         * @param array             $paths    The paths to search for, based on $path and $segments.
    195196         */
    196197        $pre = apply_filters( 'pre_get_site_by_path', null, $domain, $path, $segments, $paths );
    197198        if ( null !== $pre ) {
     199                if ( false !== $pre && ! $pre instanceof WP_Site ) {
     200                        $pre = new WP_Site( $pre );
     201                }
    198202                return $pre;
    199203        }
  • trunk/tests/phpunit/tests/multisite/bootstrap.php

    r37475 r38681  
    209209        }
    210210
     211        /**
     212         * @ticket 37053
     213         */
     214        public function test_get_site_by_path_returns_wp_site() {
     215                add_filter( 'pre_get_site_by_path', array( $this, 'filter_pre_get_site_by_path' ), 10, 3 );
     216
     217                $site = get_site_by_path( 'example.com', '/foo/' );
     218
     219                remove_filter( 'pre_get_site_by_path', array( $this, 'filter_pre_get_site_by_path' ), 10 );
     220
     221                $this->assertInstanceOf( 'WP_Site', $site );
     222        }
     223
    211224        public function filter_path_segments_to_two() {
    212225                return 2;
    213226        }
     227
     228        public function filter_pre_get_site_by_path( $site, $domain, $path ) {
     229                $site = new stdClass();
     230                $site->blog_id = 100;
     231                $site->domain = $domain;
     232                $site->path = $path;
     233                $site->site_id = 1;
     234
     235                return $site;
     236        }
    214237}
    215238
Note: See TracChangeset for help on using the changeset viewer.