不幸的是,WordPress 的架构使其很难摆脱 URL 的域部分。但一切并没有失去!请继续阅读,因为您的问题的答案需要一些背景知识。
WordPress 团队决定要求网站用户通过管理控制台(您可以在下面的屏幕截图中看到)在数据库中对网站域进行硬编码,或者通过 PHP(我们将在下面讨论):
您可能会问这两个 URL 有什么区别?即使我也觉得这很令人困惑,因为我几乎不需要任何其他东西来将它们都设置为根 URL,并且因为这对你的问题并不重要,所以我只会掩盖这个细节。如果您有兴趣,可以在这里了解更多信息:
- 更改站点 URL
- Editing wp-config.php: WordPress 地址 (URL)
- 为 WordPress 提供自己的目录
接下来,另一个选项是将两个 PHP 常量 WP_SITEURL 和 WP_HOME 硬编码在/wp-config.php
文件可以在 WordPress 安装的根目录中找到。这两行在你的中可能看起来像这样/wp-config.php
file:
define('WP_HOST','http://domain.com');
define('WP_SITEURL','http://domain.com');
The 好消息是你可以根据你的站点当前服务的域动态定义它们(我假设你已经配置了 DNS 服务器和 Apache Web 服务器)通配符 DNS.)您可以使用以下代码来匹配任何由字母和数字组成的子域名:
$root_domain = 'domain.com'; // Be sure to set this to your 2nd level domain!!!
$this_domain = $_SERVER['SERVER_NAME'];
if (!preg_match("#^([a-zA-Z0-9]+\.)?{$root_domain}$#",$this_domain)) {
echo "ERROR: The domain [$this_domain] is not a valid domain for this website.";
die();
} else {
define('WP_HOME',"http://{$this_domain}");
define('WP_SITEURL',"http://{$this_domain}");
}
The bad news is you may有一些 ”文物“在您开始工作后进行处理,例如如何处理存储在数据库内容中的图像 URL(这可能会或可能不会成为问题)或 Google 地图 API 密钥等的 URL。如果您遇到问题让我建议您在这里发布另一个问题,或者在新的问题上提出更好的问题WordPress 答案交换也由与 StackOverflow 相同的人运营。
至于告诉 WordPress 如何生成链接,您可以使用过滤器“hook“但在我的快速测试中,我认为您不需要它,因为 WordPress 将为您当前的域生成任何域的链接。不过,如果您确实发现需要它们,您可以这样做,尽管要准备好被所有域淹没这add_filter()
需要声明!每一个都控制在 WordPress 中生成链接的不同方式之一。
这里是钩子过滤功能和40+add_filter()
来电;您可能不需要全部,但如果您在这里这样做,它们是:
function multi_subdomain_permalink($permalink){
$root_domain = 'domain.com';
$this_domain = $_SERVER['SERVER_NAME'];
if (preg_match("#^([a-zA-Z0-9]+)\.?{$root_domain}$#",$this_domain,$match)) {
$permalink = str_replace("http://{$match[1]}.",'http://',$permalink);
}
return $permalink;
}
add_filter('page_link','multi_subdomain_permalink');
add_filter('post_link','multi_subdomain_permalink');
add_filter('term_link','multi_subdomain_permalink');
add_filter('tag_link','multi_subdomain_permalink');
add_filter('category_link','multi_subdomain_permalink');
add_filter('post_type_link','multi_subdomain_permalink');
add_filter('attachment_link','multi_subdomain_permalink');
add_filter('year_link','multi_subdomain_permalink');
add_filter('month_link','multi_subdomain_permalink');
add_filter('day_link','multi_subdomain_permalink');
add_filter('search_link','multi_subdomain_permalink');
add_filter('feed_link','multi_subdomain_permalink');
add_filter('post_comments_feed_link','multi_subdomain_permalink');
add_filter('author_feed_link','multi_subdomain_permalink');
add_filter('category_feed_link','multi_subdomain_permalink');
add_filter('taxonomy_feed_link','multi_subdomain_permalink');
add_filter('search_feed_link','multi_subdomain_permalink');
add_filter('get_edit_tag_link','multi_subdomain_permalink');
add_filter('get_edit_post_link','multi_subdomain_permalink');
add_filter('get_delete_post_link','multi_subdomain_permalink');
add_filter('get_edit_comment_link','multi_subdomain_permalink');
add_filter('get_edit_bookmark_link','multi_subdomain_permalink');
add_filter('index_rel_link','multi_subdomain_permalink');
add_filter('parent_post_rel_link','multi_subdomain_permalink');
add_filter('previous_post_rel_link','multi_subdomain_permalink');
add_filter('next_post_rel_link','multi_subdomain_permalink');
add_filter('start_post_rel_link','multi_subdomain_permalink');
add_filter('end_post_rel_link','multi_subdomain_permalink');
add_filter('previous_post_link','multi_subdomain_permalink');
add_filter('next_post_link','multi_subdomain_permalink');
add_filter('get_pagenum_link','multi_subdomain_permalink');
add_filter('get_comments_pagenum_link','multi_subdomain_permalink');
add_filter('shortcut_link','multi_subdomain_permalink');
add_filter('get_shortlink','multi_subdomain_permalink');
add_filter('home_url','multi_subdomain_permalink');
add_filter('site_url','multi_subdomain_permalink');
add_filter('admin_url','multi_subdomain_permalink');
add_filter('includes_url','multi_subdomain_permalink');
add_filter('content_url','multi_subdomain_permalink');
add_filter('plugins_url','multi_subdomain_permalink');
add_filter('network_site_url','multi_subdomain_permalink');
add_filter('network_home_url','multi_subdomain_permalink');
add_filter('network_admin_url','multi_subdomain_permalink');
While 给我们带来了最后一点。 WordPress 中有一个功能尝试确保加载的每个 URL 都通过其canonicalURL 通常是网络最佳实践,特别是如果您关心优化 Google 和其他搜索引擎上的搜索引擎结果。然而,就你而言,如果你真的do not希望 WordPress 重定向到您的规范 URL,那么您需要添加redirect_canonical
过滤钩子并告诉 WordPress 不要这样做。
以下是确保任何页面充当“x.domain.com
“继续”x.domain.com
“即使所有网址都被过滤为”domain.com
“。这可能不是您需要的确切逻辑,但我只是向您展示 WordPress 的构建块,以便您能够弄清楚您需要的逻辑。
有关此函数调用的一些最终细节;参数#3和#4分别指的是priority(10 是标准优先级,因此这个钩子不会被特殊处理)并且函数参数的数量(这两个参数是$redirect_url
and $requested_url
.)另一件事要注意的是返回false
而不是有效的 URL 取消规范重定向:
add_filter('redirect_canonical','multi_subdomain_redirect_canonical',10,2);
function multi_subdomain_redirect_canonical($redirect_url,$requested_url){
$redirect = parse_url($redirect_url);
$requested = parse_url($requested_url);
// If the path+query is the same for both URLs, Requested and Redirect, and
if ($redirect['path']+$redirect['query']==$requested['path']+$requested['query']) {
// If Requested URL is a subdomain of the Redirect URL
if (preg_match("#^([a-zA-Z0-9]+).{$redirect['host']}$#",$requested['host'])) {
$redirect_url = false; // Then cancel the redirect
}
}
return $redirect_url;
}
就是这样。希望这可以帮助。
-Mike