Задался сегодня этим вопросом. Оказывается не все так просто как хотелось. Поисковики все кидают меня на тему: “Авторизация с помощью социальных сетей”. Авторизация с помощью сетей, конечно нормально, но это не то, что нам бы хотелось.
Задача стоит следующего плана: Сделать регистрацию пользователя на сайте и чтоб автоматически регистрировался на другом.
Зачем это нужно?
У меня есть сайт на wordpress. Грубо говоря информационный. Теперь появилась идея коммуникации с пользователями (клиентами), для этого был создан поддомен. Но пользователи, которые уже регистрировались на сайте, должны автоматом быть зарегены в поддомене. Вот тут вся соль. Как перенести сессию пользователя на другой сайт, при этом новые пользователи должны регистрироваться на обоих сайтах.
В общем тут просто.
Если сайты разных доменов (test.ru computy.ru) то есть открытая децентрализованная система OpenID
А если сайты поддоменов (tech.computy.ru service.computy.ru), то куку поставленную на домен computy.ru будет видно на всех поддоменах.
И так:
1. Убедитесь, что установленные WordPress находятся в одной доменной зоне.
Например, mysite.ru, mysite.ru/secondsite/ и sub.mysite.ru имеют один верхний домен.
2. Вам нужно объединить все сайты в одной базе данных.
Все базы сайтов объединяются в одну с установкой отличных префиксов, для этого в файле wp-config.phpподключаемых сайтов прописываются те же параметры, что и у основного сайта, но выбирается другой префикс.
Например, если у основного сайта база подключается так:
/** Имя базы данных для WordPress */
define(‘DB_NAME’, ‘myDB’);
/** MySQL имя пользователя */
define(‘DB_USER’, ‘userDB’);
/** MySQL пароль базы данных */
define(‘DB_PASSWORD’, ‘password’);
/** MySQL сервер — иногда требуется изменять это значение. например на Мастерхосте */
define(‘DB_HOST’, ‘localhost’);
/** Кодировка базы данных, используемая при создании таблиц. */
define(‘DB_CHARSET’, ‘utf8′);
/** Сопоставление базы данных. НЕ ИЗМЕНЯЙТЕ ЭТО ЗНАЧЕНИЕ. */
define(‘DB_COLLATE’, »);
/**
* Префикс таблиц WordPress в базе данных.
*
* Вы можете иметь несколько инсталляций WordPress в одной базе, но поставив в каждой различные префиксы
* Только цифры, латинские буквы и символ подчеркивания!
*/
$table_prefix = ‘wp_’;
то у подключаемых сайтов wp-config.php должен иметь вид:
/** Имя базы данных для WordPress */
define(‘DB_NAME’, ‘myDB’);
/** MySQL имя пользователя */
define(‘DB_USER’, ‘userDB’);
/** MySQL пароль базы данных */
define(‘DB_PASSWORD’, ‘password’);
/** MySQL сервер — иногда требуется изменять это значение. например на Мастерхосте */
define(‘DB_HOST’, ‘localhost’);
/** Кодировка базы данных, используемая при создании таблиц. */
define(‘DB_CHARSET’, ‘utf8′);
/** Сопоставление базы данных. НЕ ИЗМЕНЯЙТЕ ЭТО ЗНАЧЕНИЕ. */
define(‘DB_COLLATE’, »);
/**
* Префикс таблиц WordPress в базе данных.
*
* Вы можете иметь несколько инсталляций WordPress в одной базе, но поставив в каждой различные префиксы
* Только цифры, латинские буквы и символ подчеркивания!
*/
$table_prefix = ‘second_’; //здесь вы указываете любой префикс для таблиц подключаемых сайтов, отличный от префикса таблиц основного
3. Установить общую таблицу пользователей всех сайтов.
Чтобы реализовать общую таблицу пользователей необходимо в файле wp-config.php подключаемых сайтов дописать 2 директивы. Пример составлен из расчета, что таблицы базы основного сайта имеют префикс wp_.
// устанавливаем единую таблицу пользователей
define(‘CUSTOM_USER_TABLE’, ‘wp_users’);
define(‘CUSTOM_USER_META_TABLE’, ‘wp_usermeta’);
4.Для того, чтобы между сайтами сохранялись роли пользователей, надо установить общее значение поля meta_key таблицы wp_usermeta.
Для этого нам нужен файл wp-includes/capabilities.php, в котором находится функция function _init_caps(). В теле функции меняем значение ключа:
!!!изменяем файлы только подключаемых сайтов
function _init_caps( $cap_key = » ) {
global $wpdb;
if ( empty($cap_key) )
$this->cap_key = $wpdb->prefix . ‘capabilities’; //Здесь меняем $wpdb->prefix . ‘capabilities’ на ‘wp_capabilities’
else
$this->cap_key = $cap_key;
$this->caps = &$this->{$this->cap_key};
if ( ! is_array( $this->caps ) )
$this->caps = array();
$this->get_role_caps();
}
В итоге должно получиться:
function _init_caps( $cap_key = "" ) {
global $wpdb;
if ( empty($cap_key) )
$this->cap_key = ‘wp_capabilities’;
else
$this->cap_key = $cap_key;
$this->caps = &$this->{$this->cap_key};
if ( ! is_array( $this->caps ) )
$this->caps = array();
$this->get_role_caps();
}
5. Устанавливаем домен и путь для cookie.
Домен и пути для cookie прописываются в wp-config.php ВСЕХ сайтов:
// устанавливаем домен и путь для куки
define(‘COOKIE_DOMAIN’, ‘.mysite.ru’); //Перед именем домена обязательно ставьте точку! Это указание на область применения cookie
define(‘COOKIEPATH’, ‘/’);
6. Прописываем уникальные ключи аутентификации, общие для ВСЕХ сайтов. Прописываются в wp-config.php ВСЕХ сайтов, для этого ищем в файле:
/**#@+
* Уникальные ключи аутентификации.
*
* Измените их на уникальные фразы! Каждая фраза должна быть разной. Желательно с использованием латинских строчных и прописных букв, цифр, спецсимоволов.
* Или просто сгенерируйте, открыв вот эту ссылку в браузере {@link https://api.wordpress.org/secret-key/1.1/ WordPress.org secret-key service} . Затем скопируйте полученные строки ниже, заменив те что были до этого
*
* @since 2.6.0
*/
define(‘AUTH_KEY’, ‘izmenite eto na unikalnuyu frazu’);
define(‘SECURE_AUTH_KEY’, ‘izmenite eto na unikalnuyu frazu’);
define(‘LOGGED_IN_KEY’, ‘izmenite eto na unikalnuyu frazu’);
define(‘NONCE_KEY’, ‘izmenite eto na unikalnuyu frazu’);
/**#@-*/
и заменяем на:
/**#@+
* Уникальные ключи аутентификации.
*
* Измените их на уникальные фразы! Каждая фраза должна быть разной. Желательно с использованием латинских строчных и прописных букв, цифр, спецсимоволов.
* Или просто сгенерируйте, открыв вот эту ссылку в браузере {@link https://api.wordpress.org/secret-key/1.1/ WordPress.org secret-key service} . Затем скопируйте полученные строки ниже, заменив те что были до этого
*
* @since 2.6.0
*/
define(‘SECRET_KEY’, ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
define(‘AUTH_KEY’, ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
define(‘SECURE_AUTH_KEY’, ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
define(‘LOGGED_IN_KEY’, ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
define(‘AUTH_SALT’, ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
define(‘LOGGED_IN_SALT’, ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
/**#@-*/
7. Изменяем имена cookie.
В WordPress имя cookie образуется с помощью хэша от адреса WordPressa, при этом для автоматической авторизации имена cookie необходимо сделать одинаковыми, для чего в файле wp-config.php ВСЕХ сайтов, ниже прописаных ключей (п.6) устанавливаем свои имена:
// изменяем имена куки
$publick_hash = md5(‘http://mysite.ru’);
define(‘USER_COOKIE’, ‘wordpressuser_’ . $publick_hash);
define(‘PASS_COOKIE’, ‘wordpresspass_’ . $publick_hash);
define(‘AUTH_COOKIE’, ‘wordpress_’ . $publick_hash);
define(‘SECURE_AUTH_COOKIE’, ‘wordpress_sec_’ . $publick_hash);
define(‘LOGGED_IN_COOKIE’, ‘wordpress_logged_in_’ . $publick_hash);
define(‘TEST_COOKIE’, ‘wordpress_test_cookie_’ . $publick_hash);
define( ‘ADMIN_COOKIE_PATH’, ‘/’ ); //Если не прописывать эту директиву, то пользователь не сможет зайти в админку
define( ‘PLUGINS_COOKIE_PATH’, ‘/’ ); //Аналогично, но для плагинов
8. Радуемся