对我来说,这听起来可能更适合单站点安装而不是多站点安装。但这实际上取决于单个用户需要如何定制。
NOTE: this answer will not include information about server setup, etc.
首先,我将在中定义WP\\u HOME和WP\\u SITEURL
wp-config.php
让它们保持不变。您可能可以动态地设置这些,但结果必须是它们指向主根域。我的本地WP安装是
wordpress.dev
, 所以我将在整个回答中使用它。
示例:
<?php
// in wp-config.php
define(\'WP_HOME\', \'http://wordpress.dev\');
define(\'WP_SITEURL\', WP_HOME . \'/wp\'); // wp in sub directory
// custom content directory
define(\'WP_CONTENT_DIR\', dirname(__FILE__) . \'/content\');
define(\'WP_CONTENT_URL\', WP_HOME . \'/content\');
接下来,我们需要根据当前子域设置用户。这应该相对容易:解析HTTP主机,通过该用户名查找用户,将该用户设置为以后的用户。我建议将所有内容都打包在一个类中(这里是一个单独的类)。
<?php
class WPSE66456
{
// container for an instance of this class
private static $ins;
// The current user, based on subdomain.
private $user = null;
/***** Singleton Pattern *****/
public static function init()
{
add_action(\'plugins_loaded\', array(__CLASS__, \'instance\'), 0);
}
public static function instance()
{
is_null(self::$ins) && self::$ins = new self;
return self::$ins;
}
/**
* Constructor. Actions really get added here.
*
*/
protected function __construct()
{
// empty for now...
}
} // end class
然后我们需要写一些东西来解析
$_SERVER[\'HTTP_HOST\']
看看我们是否从中获得了有效的用户名。
<?php
class WPSE66456
{
// snip snip
protected function __construct()
{
$this->set_current_user($_SERVER[\'HTTP_HOST\']);
}
protected function set_current_user($host)
{
if(!is_null($this->user))
return;
list($user, $host) = explode(\'.\', $host, 2);
// gets tricky here. Where is the real site? Is it at the root domain?
// For the purposes of this tutorial, let\'s assume that we\'re using a
// nacked root domain for the main, no user site.
// Make sure the $host is still a valid domain, if not we\'re on the root
if(strpos($host, \'.\') === false)
{
$this->user = false;
}
else
{
if($u = get_user_by(\'slug\', $user))
{
// we have a user!
$this->user = $u;
}
else
{
// invalid user name. Send them back to the root.
wp_redirect("http://{$host}", 302);
exit;
// Or you could die here and show an error...
// wp_die(__(\'Invalid User\'), __(\'Invalid User\'));
}
}
}
}
现在你有了用户名,你可以做各种事情了。作为一个例子,让我们将博客标语改为该用户的问候语。
<?php
class WPSE66456
{
// snip snip
protected function __construct()
{
$this->set_current_user($_SERVER[\'HTTP_HOST\']);
add_filter(\'bloginfo\', array($this, \'set_tagline\'), 10, 2);
}
// snip snip
public function set_tagline($c, $show)
{
if(\'description\' != $show || !$this->user)
return $c;
return \'Hello, \' . esc_html($this->user->display_name) . \'!\';
}
}
假设您使用根、裸(无www)url进行安装,WordPress将向所有sudomains发送Cookie。因此,您可以检查用户是否正在查看自己的子域,然后将其返回到根目录,否则。
<?php
class WPSE66456
{
// snip snip
protected function __construct()
{
$this->set_current_user($_SERVER[\'HTTP_HOST\']);
add_filter(\'bloginfo\', array($this, \'set_tagline\'), 10, 2);
add_action(\'init\', array($this, \'check_user\'), 1);
}
// snip snip
public function check_user()
{
if($this->user === false || current_user_can(\'manage_options\'));
return; // on the root domain or the user is an admin
$user = wp_get_current_user();
if(!$user || $user != $this->user)
{
wp_redirect(home_url());
exit;
}
}
}
最后,要考虑的最后一件事是WordPress允许在用户名中使用与域名系统不兼容的内容。喜欢
user.one
是有效的用户名。但是
user.one.yoursite.com
有两个子域很深,不起作用。
所以你需要pre_user_login
并清理东西。
<?php
class WPSE66456
{
// snip snip
protected function __construct()
{
$this->set_current_user($_SERVER[\'HTTP_HOST\']);
add_filter(\'bloginfo\', array($this, \'set_tagline\'), 10, 2);
add_filter(\'pre_user_login\', array($this, \'filter_login\'));
add_action(\'init\', array($this, \'check_user\'), 1);
}
// snip snip
public function filter_login($login)
{
// replace anything that isn\'t a-z and 0-9 and a dash
$login = preg_replace(\'/[^a-z0-9-]/u\', \'\', strtolower($login));
// domains can\'t begin with a dash
$login = preg_replace(\'/^-/u\', \'\', $login);
// domains can\'t end with a dash
$login = preg_replace(\'/-$/u\', \'\', $login);
// probably don\'t want users registering the `www` user name...
if(\'www\' == $login)
$login = \'www2\';
return $login;
}
}
以上所有内容均为
plugin.
这个答案中有很多问题没有解决。这个是否可以扩展到需要扩展的地方?拥有多个内容非常相似的子域会如何影响搜索优化?定制了多少内容?如果数量很多,多站点是否更适合此任务?