我有一个网站响应*.domain.com.
转到x.domain.com或y.domain.com应该生成相同的网页.
什么*我不知道,但它是重要的信息,因为我们基于它跟踪事物.
当转向wordpress时,我们遇到了一个非常严重的问题.它似乎生成链接(使用get_page_link)与管理员中设置的域.
这对我们不起作用,因为我们找不到告诉wordpress生成没有域的链接的方法(为什么它还是这样做?!)并且每次点击链接时,浏览器都会从:x.domain.com到domain.com(自域名以来). com就是我们在管理员中所拥有的).
不幸的是,WordPress的架构非常难以摆脱URL的域组件.但一切都不会丢失!请继续阅读,因为您的问题的答案需要一些背景知识.
WordPress团队决定要求网站用户通过管理控制台在数据库中对网站域进行硬编码,您可以在下面的屏幕截图中看到,通过PHP我们将在下面讨论:

你可能会问这两个网址之间的区别是什么?即使我发现它令人困惑,因为我几乎从不需要任何其他任何东西将它们都设置为根URL,因为它对你的问题并不重要,我只会掩盖这些细节.如果您有兴趣,可以在这里了解更多:
继续,另一个选项是硬编码文件中的两个PHP常量WP_SITEURL和WP_HOME,这些常量/wp-config.php可以在WordPress安装的根目录中找到.这两行在您的/wp-config.php文件中可能如下所示:
define('WP_HOST','http://domain.com');
define('WP_SITEURL','http://domain.com');
Run Code Online (Sandbox Code Playgroud)
的好消息是,你可以定义他们两个动态根据您的网站是从服务于当前域(我会假设你有两个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}");
}
Run Code Online (Sandbox Code Playgroud)
在坏消息是,你可能有一些" 文物 "对付你得到它的工作如URL是如何存储在数据库中的内容图像的URL处理(这可能会或可能不会最终被一个问题)后,或谷歌地图API如果你有问题,请让我建议你在这里发布另一个问题,甚至更好地在新的WordPress Answers Exchange上运行,也可以和StackOverflow一样运行.
至于告诉WordPress如何生成链接,有可以" 挂钩 "的过滤器,但在我的快速测试中,我认为你不需要它,因为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');
Run Code Online (Sandbox Code Playgroud)
同时将我们带到最后一点.WordPress中的功能是尝试确保加载的每个URL都通过其canonicalURL提供,这通常是Web最佳实践,特别是如果您关注在Google和其他搜索引擎上优化搜索引擎结果.但是,在您的情况下,如果您真的不希望WordPress重定向到您的规范URL,那么您需要添加一个redirect_canonical过滤器挂钩并告诉WordPress不要这样做.
接下来是代码,以确保任何用作" x.domain.com"的页面保持" x.domain.com",即使所有URL都被过滤为" domain.com".这可能不是您需要的确切逻辑,但我只是向您展示WordPress的构建块,以便您能够找出所需的逻辑.
关于此函数调用的一些最终细节; 参数#3和#4分别指的是优先级(10是标准优先级,所以这个钩子不会被处理特殊)和函数参数的数量(2个参数是$redirect_url和$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;
}
Run Code Online (Sandbox Code Playgroud)
就是这样.希望这可以帮助.
-麦克风
| 归档时间: |
|
| 查看次数: |
2694 次 |
| 最近记录: |