多站点环境下如何从永久链接获取Blog ID(Site ID)?
解决WordPress多站点从永久链接提取Blog ID的问题
针对你用「WDS Multisite Aggregate」聚合文章后,需要从子站点文章的永久链接中提取对应Blog ID的需求,这里提供两种适配不同多站点结构的原生方案,完全不需要依赖额外插件:
核心思路
WordPress多站点的URL结构主要分为子目录型(如https://主域名.com/子站点别名/文章路径)和子域名型(如https://子站点别名.主域名.com/文章路径),我们可以通过解析URL的关键部分,结合WordPress原生函数获取对应的Blog ID。
方案实现
1. 通用解析函数(适配两种结构)
下面的函数会自动识别当前多站点的结构,从传入的文章永久链接中提取并返回对应的Blog ID:
function get_blog_id_from_permalink( $permalink ) { // 解析URL,获取主机名和路径信息 $url_parts = parse_url( $permalink ); if ( empty( $url_parts['host'] ) || empty( $url_parts['path'] ) ) { return false; // 无效URL直接返回false } $main_network_domain = get_network()->domain; $blog_id = false; // 处理子域名型多站点 if ( strpos( $url_parts['host'], $main_network_domain ) !== false && $url_parts['host'] !== $main_network_domain ) { // 提取子域名部分(比如从site2.example.com得到site2) $subdomain = str_replace( '.' . $main_network_domain, '', $url_parts['host'] ); $blog_id = get_id_from_blogname( $subdomain ); } // 处理子目录型多站点 else { // 分割路径,获取第一个子目录(比如从/site2/2024/05/10/test-post/得到site2) $path_segments = explode( '/', trim( $url_parts['path'], '/' ) ); if ( ! empty( $path_segments[0] ) ) { $blog_slug = $path_segments[0]; $blog_id = get_id_from_blogname( $blog_slug ); } } // 验证Blog ID是否有效 if ( $blog_id && get_blog_details( $blog_id ) ) { return $blog_id; } return false; }
2. 调用示例
你可以这样在代码中使用这个函数,获取子站点的首页地址:
// 假设$post_permalink是聚合文章的永久链接(指向子站点文章) $post_permalink = get_permalink( $aggregated_post_id ); // 替换为你的聚合文章链接获取方式 $myblogid = get_blog_id_from_permalink( $post_permalink ); if ( $myblogid ) { $mysuburl = get_home_url( $myblogid ); // 这里可以使用$mysuburl做后续操作,比如输出子站点链接 echo '<a href="' . esc_url( $mysuburl ) . '">访问子站点首页</a>'; } else { // 处理无法获取Blog ID的情况 echo '无法识别该文章所属的子站点'; }
关键说明
get_id_from_blogname()是WordPress原生函数,通过站点别名(slug)获取对应的Blog ID,非常可靠。- 函数中加入了URL有效性验证和Blog ID有效性检查,避免因异常URL导致的错误。
- 之所以
get_current_blog_id()无效,是因为当前执行环境在网络首页(主站点),它只会返回主站点的ID,而我们需要的是链接指向的目标子站点ID,必须通过URL解析来获取。
内容的提问来源于stack exchange,提问作者Galgóczi Levente
相关产品推荐
相关产品推荐

