WordPress多域名共享内容与模板的核心思路是让多个域名指向同一个WordPress安装目录,通过程序逻辑识别当前访问的域名,统一返回相同的内容并加载同一套模板文件,同时保证不同域名的访问体验一致。

前置环境准备
首先需要确保服务器满足以下条件:
- 已经安装好WordPress并可以正常访问
- 多个需要绑定的域名已经完成DNS解析,指向当前服务器IP
- 服务器Web服务(Nginx或Apache)已经配置好多域名指向同一网站根目录
- 拥有服务器文件修改权限和数据库操作权限
Web服务多域名配置
Nginx环境配置
修改Nginx站点配置文件,在server_name处添加所有需要绑定的域名,示例如下:
server {
listen 80;
# 这里添加所有需要共享内容的域名,用空格分隔
server_name example1.com example2.com example3.com;
root /www/wwwroot/wordpress;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Apache环境配置
修改Apache的虚拟主机配置文件,添加多个ServerName和ServerAlias,示例如下:
<VirtualHost *:80>
DocumentRoot "/www/wwwroot/wordpress"
# 主域名
ServerName example1.com
# 其他共享域名
ServerAlias example2.com example3.com
<Directory "/www/wwwroot/wordpress">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
WordPress核心配置调整
打开WordPress根目录下的wp-config.php文件,在文件开头添加域名识别逻辑,动态设置站点URL和主页URL,代码如下:
<?php
// 获取当前访问的域名
$current_domain = $_SERVER['HTTP_HOST'];
// 定义允许绑定的域名列表,可根据实际情况增减
$allowed_domains = array(
'example1.com',
'example2.com',
'example3.com'
);
// 如果当前域名在允许列表中,动态设置WP_HOME和WP_SITEURL
if(in_array($current_domain, $allowed_domains)){
define('WP_HOME', 'http://' . $current_domain);
define('WP_SITEURL', 'http://' . $current_domain);
} else {
// 不在列表中的域名跳转到默认主域名
define('WP_HOME', 'http://example1.com');
define('WP_SITEURL', 'http://example1.com');
}
// 原有的wp-config.php其他配置内容放在这里
// 数据库配置等信息保持不变
?>
模板共享实现
WordPress默认会优先加载当前主题目录下的模板文件,要实现多域名共享同一套模板,只需要保证所有域名访问时都加载同一个主题即可。如果之前已经设置好默认主题,完成上述域名配置后,所有域名都会自动加载同一套模板。如果需要针对不同域名做细微的模板调整,可以在主题的functions.php中添加域名判断逻辑:
<?php
// 根据域名加载不同的样式或者小模块
add_action('wp_head', 'custom_domain_style');
function custom_domain_style(){
$current_domain = $_SERVER['HTTP_HOST'];
if($current_domain == 'example2.com'){
echo '<style>.site-header{background-color: #f00;}</style>';
} elseif($current_domain == 'example3.com'){
echo '<style>.site-header{background-color: #00f;}</style>';
}
}
?>
内容与数据库处理
WordPress的内容存储在数据库中,多域名共享内容不需要修改数据库内容,只需要保证所有域名访问的是同一个数据库即可。如果之前多个域名对应不同的WordPress安装,需要合并内容的话,可以将其他站点的文章、分类等数据导出,导入到主站点数据库中,同时注意修改内容中的域名链接,避免跨域问题。可以使用以下SQL语句批量替换内容中的旧域名:
-- 替换文章内容为新的共享域名,这里以将旧域名old.com替换为当前域名变量为例 -- 实际使用时可以替换为具体的域名 UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://old.com', 'http://example1.com'); UPDATE wp_posts SET guid = REPLACE(guid, 'http://old.com', 'http://example1.com'); UPDATE wp_options SET option_value = REPLACE(option_value, 'http://old.com', 'http://example1.com') WHERE option_name = 'home' OR option_name = 'siteurl';
伪静态规则配置
如果使用了自定义固定链接,需要确保伪静态规则支持多域名。Nginx环境下伪静态规则已经在之前的配置中包含,Apache环境需要确保网站根目录下的.htaccess文件配置正确,默认WordPress生成的.htaccess内容如下:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
常见问题与注意事项
- 多域名访问时,WordPress的后台登录地址统一使用主域名访问,避免不同域名登录导致的会话问题
- 如果使用了缓存插件,需要配置缓存插件支持多域名,避免不同域名的内容缓存混淆
- SEO方面,建议给不同域名的内容设置合适的canonical标签,避免搜索引擎判定为重复内容,可以在主题的
header.php中添加如下代码:
<?php
if(is_singular()){
$canonical_url = get_permalink();
echo '<link rel="canonical" href="' . esc_url($canonical_url) . '" />';
}
?>
- 如果服务器配置了SSL证书,需要为所有绑定的域名配置对应的SSL证书,或者配置通配符SSL证书,保证HTTPS访问正常
- 修改文件前建议先备份
wp-config.php、.htaccess等核心文件,避免修改错误导致站点无法访问