按域和路径检索最接近的匹配站点对象。

原型

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

描述

这不一定会返回域和路径的完全匹配。相反,它将域和路径分解为多个片段,然后用于匹配查询中最接近的可能性。

参数

$domain (string) (Required) 要检查的域名。

$path (string) (Required) 检查路径。

$segments (int|null) (Optional) 要使用的路径段。默认为null或完整路径。

返回值

(WP_Site|false)  站点对象,如果成功。没有找到网站时为假。

源文件

路径:wp-includes/ms-load.php

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
<?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;
}

...
?>

其他

英文文档:https://developer.wordpress.org/reference/functions/get_site_by_path/