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. git-svn-id: https://develop.svn.wordpress.org/trunk@38681 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
parent
d5f0513164
commit
824a10a8a6
@ -137,13 +137,14 @@ function get_network_by_path( $domain, $path, $segments = null ) {
|
|||||||
* Retrieve a site object by its domain and path.
|
* Retrieve a site object by its domain and path.
|
||||||
*
|
*
|
||||||
* @since 3.9.0
|
* @since 3.9.0
|
||||||
|
* @since 4.7.0 Updated to always return a `WP_Site` object.
|
||||||
*
|
*
|
||||||
* @global wpdb $wpdb WordPress database abstraction object.
|
* @global wpdb $wpdb WordPress database abstraction object.
|
||||||
*
|
*
|
||||||
* @param string $domain Domain to check.
|
* @param string $domain Domain to check.
|
||||||
* @param string $path Path to check.
|
* @param string $path Path to check.
|
||||||
* @param int|null $segments Path segments to use. Defaults to null, or the full path.
|
* @param int|null $segments Path segments to use. Defaults to null, or the full path.
|
||||||
* @return object|false Site object if successful. False when no site is found.
|
* @return WP_Site|false Site object if successful. False when no site is found.
|
||||||
*/
|
*/
|
||||||
function get_site_by_path( $domain, $path, $segments = null ) {
|
function get_site_by_path( $domain, $path, $segments = null ) {
|
||||||
$path_segments = array_filter( explode( '/', trim( $path, '/' ) ) );
|
$path_segments = array_filter( explode( '/', trim( $path, '/' ) ) );
|
||||||
@ -186,15 +187,18 @@ function get_site_by_path( $domain, $path, $segments = null ) {
|
|||||||
*
|
*
|
||||||
* @since 3.9.0
|
* @since 3.9.0
|
||||||
*
|
*
|
||||||
* @param null|bool|object $site Site value to return by path.
|
* @param null|bool|WP_Site $site Site value to return by path.
|
||||||
* @param string $domain The requested domain.
|
* @param string $domain The requested domain.
|
||||||
* @param string $path The requested path, in full.
|
* @param string $path The requested path, in full.
|
||||||
* @param int|null $segments The suggested number of paths to consult.
|
* @param int|null $segments The suggested number of paths to consult.
|
||||||
* Default null, meaning the entire path was to be consulted.
|
* Default null, meaning the entire path was to be consulted.
|
||||||
* @param array $paths The paths to search for, based on $path and $segments.
|
* @param array $paths The paths to search for, based on $path and $segments.
|
||||||
*/
|
*/
|
||||||
$pre = apply_filters( 'pre_get_site_by_path', null, $domain, $path, $segments, $paths );
|
$pre = apply_filters( 'pre_get_site_by_path', null, $domain, $path, $segments, $paths );
|
||||||
if ( null !== $pre ) {
|
if ( null !== $pre ) {
|
||||||
|
if ( false !== $pre && ! $pre instanceof WP_Site ) {
|
||||||
|
$pre = new WP_Site( $pre );
|
||||||
|
}
|
||||||
return $pre;
|
return $pre;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,9 +208,32 @@ class Tests_Multisite_Bootstrap extends WP_UnitTestCase {
|
|||||||
$this->assertEqualSetsWithIndex( $expected, $actual );
|
$this->assertEqualSetsWithIndex( $expected, $actual );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ticket 37053
|
||||||
|
*/
|
||||||
|
public function test_get_site_by_path_returns_wp_site() {
|
||||||
|
add_filter( 'pre_get_site_by_path', array( $this, 'filter_pre_get_site_by_path' ), 10, 3 );
|
||||||
|
|
||||||
|
$site = get_site_by_path( 'example.com', '/foo/' );
|
||||||
|
|
||||||
|
remove_filter( 'pre_get_site_by_path', array( $this, 'filter_pre_get_site_by_path' ), 10 );
|
||||||
|
|
||||||
|
$this->assertInstanceOf( 'WP_Site', $site );
|
||||||
|
}
|
||||||
|
|
||||||
public function filter_path_segments_to_two() {
|
public function filter_path_segments_to_two() {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function filter_pre_get_site_by_path( $site, $domain, $path ) {
|
||||||
|
$site = new stdClass();
|
||||||
|
$site->blog_id = 100;
|
||||||
|
$site->domain = $domain;
|
||||||
|
$site->path = $path;
|
||||||
|
$site->site_id = 1;
|
||||||
|
|
||||||
|
return $site;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
endif;
|
endif;
|
||||||
|
Loading…
Reference in New Issue
Block a user