get_site_by_path() - WordPress 函数参考中文文档

返回介绍

get_site_by_path()

发布于 2017-09-11 字数5141 浏览 763 评论 0

get_site_by_path( string $domain,  string $path,  int|null $segments = null )

Retrieves the closest matching site object by its domain and path.


描述

This will not necessarily return an exact match for a domain and path. Instead, it breaks the domain and path into pieces that are then used to match the closest possibility from a query.

The intent of this method is to match a site object during bootstrap for a requested site address


参数

$domain

(string)
(Required)
Domain to check.

$path

(string)
(Required)
Path to check.

$segments

(int|null)
(Optional)
Path segments to use. Defaults to null, or the full path.

Default value: null


返回值

(WP_Site|false) Site object if successful. False when no site is found.


源代码

File: wp-includes/ms-load.php

function get_site_by_path( $domain, $path, $segments = null ) {
	$path_segments = array_filter( explode( '/', trim( $path, '/' ) ) );

	/**
	 * Filters the number of path segments to consider when searching for a site.
	 *
	 * @since 3.9.0
	 *
	 * @param int|null $segments The number of path segments to consider. WordPress by default looks at
	 *                           one path segment following the network path. The function default of
	 *                           null only makes sense when you know the requested path should match a site.
	 * @param string   $domain   The requested domain.
	 * @param string   $path     The requested path, in full.
	 */
	$segments = apply_filters( 'site_by_path_segments_count', $segments, $domain, $path );

	if ( null !== $segments && count( $path_segments ) > $segments ) {
		$path_segments = array_slice( $path_segments, 0, $segments );
	}

	$paths = array();

	while ( count( $path_segments ) ) {
		$paths[] = '/' . implode( '/', $path_segments ) . '/';
		array_pop( $path_segments );
	}

	$paths[] = '/';

	/**
	 * Determine a site by its domain and path.
	 *
	 * This allows one to short-circuit the default logic, perhaps by
	 * replacing it with a routine that is more optimal for your setup.
	 *
	 * Return null to avoid the short-circuit. Return false if no site
	 * can be found at the requested domain and path. Otherwise, return
	 * a site object.
	 *
	 * @since 3.9.0
	 *
	 * @param null|bool|WP_Site $site     Site value to return by path.
	 * @param string            $domain   The requested domain.
	 * @param string            $path     The requested path, in full.
	 * @param int|null          $segments The suggested number of paths to consult.
	 *                                    Default null, meaning the entire path was to be consulted.
	 * @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 );
	if ( null !== $pre ) {
		if ( false !== $pre && ! $pre instanceof WP_Site ) {
			$pre = new WP_Site( $pre );
		}
		return $pre;
	}

	/*
	 * @todo
	 * caching, etc. Consider alternative optimization routes,
	 * perhaps as an opt-in for plugins, rather than using the pre_* filter.
	 * For example: The segments filter can expand or ignore paths.
	 * If persistent caching is enabled, we could query the DB for a path <> '/'
	 * then cache whether we can just always ignore paths.
	 */

	// Either www or non-www is supported, not both. If a www domain is requested,
	// query for both to provide the proper redirect.
	$domains = array( $domain );
	if ( 'www.' === substr( $domain, 0, 4 ) ) {
		$domains[] = substr( $domain, 4 );
	}

	$args = array(
		'domain__in' => $domains,
		'path__in' => $paths,
		'number' => 1,
	);

	if ( count( $domains ) > 1 ) {
		$args['orderby']['domain_length'] = 'DESC';
	}

	if ( count( $paths ) > 1 ) {
		$args['orderby']['path_length'] = 'DESC';
	}

	$result = get_sites( $args );
	$site = array_shift( $result );

	if ( $site ) {
		return $site;
	}

	return false;
}

更新日志

Version 描述
4.7.0 Updated to always return a WP_Site object.
3.9.0 Introduced.

相关函数

Uses

  • wp-includes/ms-blogs.php:
    get_sites()
  • wp-includes/class-wp-site.php:
    WP_Site::__construct()
  • wp-includes/plugin.php:
    apply_filters()
  • wp-includes/ms-load.php:
    site_by_path_segments_count
  • wp-includes/ms-load.php:
    pre_get_site_by_path

Used By

  • wp-includes/ms-load.php:
    ms_load_current_site_and_network()

User Contributed Notes

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

目前还没有任何评论,快来抢沙发吧!