(перевод оригинальной статьи Марка О'Саливанна (Mark O'Sullivan))
Следующая интеграция была произведена с Wordpress 2.0.4 и Vanilla 1.0.1 22 августа, 2006. Позвольте заметить что я не являюсь пользователем Wordpress. Помимо того что WordPress - безумно популярный движок и люди часто спрашивают как объединить его с Vanilla, я честно больше ничего не знаю о нем. Я только загрузил его, установил, и теперь объединяю его с Vanilla.
Итак, приступим…
Очевидно, первый вопрос, который приходит в голову - это «где разместить файлы Vanilla по отношению к Wordpress?».
Сначала я устанвил Wordpress. Я положил это в мою корневую директорию в папку с именем текущей версии:
/path/to/document/root/wordpress-2.0.4/
Следующим шагом я скачал последнюю версию Vanilla (1.0.1) и положил zip файл в свою папку wordpress-2.0.4. Я извлек сожержимое архива прямо там, таким образом расположение Vanilla в папке WordPress стало таким:
/path/to/document/root/wordpress-2.0.4/Vanilla.1.0.1/
Разумеется такие имена папок не являются удобными, однако я использовал их для ясности.
Хорошо, теперь у меня есть установленный WordPress и Vanilla, которая еще не установлена. Теперь установим Vanilla. Я хочу сделать это с использованием единой базы данных WordPress, поэтому все таблицы должны быть в одной БД для Wordpress и Vanilla.
Я загружаю Vanilla в своем браузере по адресу localhost:8020/wordpress-2.0.4/Vanilla.1.0.1/ и попадаю в установщик. Я выбираю новую установку и произвожу ее до конца. Если вы не знаете как установить Vanilla, почитайте различную документацию.
Одна вещь, которую стоит заметить - во время установки вас попросят ввести логин и пароль Администратора. Вы можете написать что угодно, потому что данные аккаунта будут сохранениы в таблице пользователей Vanilla, которую мы не будем использовать.
Хорошо, и Wordpress и Vanilla установлены, но они еще не знают о друг друге. Сейчас мы юудем объединять две базы данных вместе. Начнем с самого очевидного места: таблица пользователей.
Поскольку и Vanilla и Wordpress имеют собственные таблицы пользователей, мы хотели бы использовать только одну из них так, чтоб все пользователи хранились в одном месте. Я сделал так, чтобы Vanilla не обращалась к своей таблице. Это делается путем указания соответствия таблиц и колонок. Таким образом Vanilla будет знать о таблице пользователей WordPress через эти соответствия.
Откроем следующий файл:
/path/to/document/root/wordpress-2.0.4/Vanilla.1.0.1/appg/database.php
Этот файл содержит в себе соответствия таблиц и колонок. Не пугайтесь тому что этот файл такой большой. Первая область собержит списки соответствия таблиц, а вторая - соответствия колонок.
Мы НЕ хотим изменять этот файл. Этот файл, нужно рассматривать как шаблон, который не должен быть изменен. Вместо этого мы скопируем области, которые хотим изменить в нашу conf директорию и добавить их в файл database.php.
Вот мой файл /path/to/document/root/wordpress-2.0.4/Vanilla.1.0.1/conf/database.php который выглядит так после свежей установки:
<?php // Database Configuration Settings $Configuration['DATABASE_HOST'] = 'localhost'; $Configuration['DATABASE_NAME'] = 'wordpress'; $Configuration['DATABASE_USER'] = 'mysql_user'; $Configuration['DATABASE_PASSWORD'] = 'mysql_password'; ?>
Теперь давайте добавим новое сответсвие для таблицы пользователей:
<?php // Database Configuration Settings $Configuration['DATABASE_HOST'] = 'localhost'; $Configuration['DATABASE_NAME'] = 'wordpress'; $Configuration['DATABASE_USER'] = 'mysql_user'; $Configuration['DATABASE_PASSWORD'] = 'mysql_password'; // Интеграция с Wordpress // ===================== // Соответствие для таблицы пользователей WordPress $DatabaseTables['User'] = 'wp_users'; ?>
Затем я посмотрел на существующие поля в таблице wp_users столе и просмотрел какие поля нужно соспоставить с полями Vanilla. Очевидно не у всех полей будут прекрасные соответствия между двумя различными системами, но мы займемся этим позже. Пока я только добавляю соответствия, добавив следующий код:
<?php // Database Configuration Settings $Configuration['DATABASE_HOST'] = 'localhost'; $Configuration['DATABASE_NAME'] = 'wordpress'; $Configuration['DATABASE_USER'] = 'root'; $Configuration['DATABASE_PASSWORD'] = 'thing'; // Интеграция с Wordpress // ===================== // Соответствие для таблицы пользователей WordPress $DatabaseTables['User'] = 'wp_users'; // Соответствие существующих таблиц WordPress к Vanilla $DatabaseColumns['User']['UserID'] = 'ID'; $DatabaseColumns['User']['Name'] = 'user_login'; $DatabaseColumns['User']['Password'] = 'user_pass'; $DatabaseColumns['User']['Email'] = 'user_email'; $DatabaseColumns['User']['DateFirstVisit'] = 'user_registered'; ?>
Напоследок привяжем оставшиеся поля wp_users к Vanilla:
<?php // Database Configuration Settings $Configuration['DATABASE_HOST'] = 'localhost'; $Configuration['DATABASE_NAME'] = 'wordpress'; $Configuration['DATABASE_USER'] = 'root'; $Configuration['DATABASE_PASSWORD'] = 'thing'; // Интеграция с Wordpress // ===================== // Соответствие для таблицы пользователей WordPress $DatabaseTables['User'] = 'wp_users'; // Соответствие существующих таблиц WordPress к Vanilla $DatabaseColumns['User']['UserID'] = 'ID'; $DatabaseColumns['User']['Name'] = 'user_login'; $DatabaseColumns['User']['Password'] = 'user_pass'; $DatabaseColumns['User']['Email'] = 'user_email'; $DatabaseColumns['User']['DateFirstVisit'] = 'user_registered'; // Так же привяжем поля Wordpress к Vanilla $DatabaseColumns['User']['user_nicename'] = 'user_nicename'; $DatabaseColumns['User']['user_url'] = 'user_url'; $DatabaseColumns['User']['user_activation_key'] = 'user_activation_key'; $DatabaseColumns['User']['user_status'] = 'user_status'; $DatabaseColumns['User']['display_name'] = 'display_name'; ?>
Как я уже упоминал, теперь я должен удостовериться, что все требуемые поля Vanilla добавлены к таблице пользователей (wp_users) Wordpress.
Для этого я захожу в папку установки Vanilla и просматриваю mysql.sql файл чтоб узнать структуру создаваемой таблицы пользователей:
CREATE TABLE `LUM_User` ( `UserID` int(10) NOT NULL AUTO_INCREMENT, `RoleID` int(2) NOT NULL DEFAULT '0', `StyleID` int(3) NOT NULL DEFAULT '1', `CustomStyle` varchar(255) DEFAULT NULL, `FirstName` varchar(50) NOT NULL DEFAULT '', `LastName` varchar(50) NOT NULL DEFAULT '', `Name` varchar(20) NOT NULL DEFAULT '', `Password` varchar(32) DEFAULT NULL, `VerificationKey` varchar(50) NOT NULL DEFAULT '', `EmailVerificationKey` varchar(50) DEFAULT NULL, `Email` varchar(200) NOT NULL DEFAULT '', `UtilizeEmail` enum('1','0') NOT NULL DEFAULT '0', `ShowName` enum('1','0') NOT NULL DEFAULT '1', `Icon` varchar(255) DEFAULT NULL, `Picture` varchar(255) DEFAULT NULL, `Attributes` text NULL, `CountVisit` int(8) NOT NULL DEFAULT '0', `CountDiscussions` int(8) NOT NULL DEFAULT '0', `CountComments` int(8) NOT NULL DEFAULT '0', `DateFirstVisit` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `DateLastActive` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `RemoteIp` varchar(100) NOT NULL DEFAULT '', `LastDiscussionPost` datetime DEFAULT NULL, `DiscussionSpamCheck` int(11) NOT NULL DEFAULT '0', `LastCommentPost` datetime DEFAULT NULL, `CommentSpamCheck` int(11) NOT NULL DEFAULT '0', `UserBlocksCategories` enum('1','0') NOT NULL DEFAULT '0', `DefaultFormatType` varchar(20) DEFAULT NULL, `Discovery` text, `Preferences` text, `SendNewApplicantNotifications` enum('1','0') NOT NULL DEFAULT '0', PRIMARY KEY (`UserID`), KEY `user_role` (`RoleID`), KEY `user_style` (`StyleID`), KEY `user_name` (`Name`) );
Теперь я знаю какие еще поля и типы данных требуются для Vanilla. Также я знаю что поля UserID, Name, Password, Email, и DateFirstVisit уже соответствуют полям WordPress. Теперь я напишу запрос для добавления новых полей в таблицу wp_users:
ALTER TABLE wp_users ADD `RoleID` int(2) NOT NULL DEFAULT '3', ADD `StyleID` int(3) NOT NULL DEFAULT '1', ADD `CustomStyle` varchar(255) DEFAULT NULL, ADD `FirstName` varchar(50) NOT NULL DEFAULT '', ADD `LastName` varchar(50) NOT NULL DEFAULT '', ADD `VerificationKey` varchar(50) NOT NULL DEFAULT '', ADD `EmailVerificationKey` varchar(50) DEFAULT NULL, ADD `Email` varchar(200) NOT NULL DEFAULT '', ADD `UtilizeEmail` enum('1','0') NOT NULL DEFAULT '0', ADD `ShowName` enum('1','0') NOT NULL DEFAULT '1', ADD `Icon` varchar(255) DEFAULT NULL, ADD `Picture` varchar(255) DEFAULT NULL, ADD `Attributes` text NULL, ADD `CountVisit` int(8) NOT NULL DEFAULT '0', ADD `CountDiscussions` int(8) NOT NULL DEFAULT '0', ADD `CountComments` int(8) NOT NULL DEFAULT '0', ADD `DateLastActive` datetime NOT NULL DEFAULT '2006-06-06 00:00:00', ADD `RemoteIp` varchar(100) NOT NULL DEFAULT '', ADD `LastDiscussionPost` datetime DEFAULT NULL, ADD `DiscussionSpamCheck` int(11) NOT NULL DEFAULT '0', ADD `LastCommentPost` datetime DEFAULT NULL, ADD `CommentSpamCheck` int(11) NOT NULL DEFAULT '0', ADD `UserBlocksCategories` enum('1','0') NOT NULL DEFAULT '0', ADD `DefaultFormatType` varchar(20) DEFAULT NULL, ADD `Discovery` text, ADD `Preferences` text, ADD `SendNewApplicantNotifications` enum('1','0') NOT NULL DEFAULT '0';
Хорошо, теперь я выполню этот SQL-запрос, и удостоверюсь что все новые поля действительно появились в таблице wp_users.
Внимательно посмотрите на вторую строку моего запроса:
ADD `RoleID` int(2) NOT NULL DEFAULT '3',
Заметте что я установил значение по умолчанию 3? Это потому что статус «Участник» («member») в Vanilla имеет RoleID = 3. Таким образом, создавая нового пользователя через панель WordPress, новый пользователль автоматически получит статус «Участник» на форуме. Также заметте что я сделал все поля по умолчанию NOT NULL. Таким образом регулярные пользовательские операции в Wordpress не будут выводить ошибку из-за ограничений в Vanilla.
Итак, мы объединили две базы вместе, и теперь хотим чтоб Vanilla разговаривала как WordPress. Первым шагом заглянем в код WordPress чтоб понять как он общается с сессиями и куки. По прошествии некоторого времени и разбора различных файлов, я обнаружил что WordPress не использует сессии PHP.
WordPress сохраняет информацию сессии в куки. В этой версии WordPress названия куки были основаны на «siteurl». Это значение можно найти в таблице wp_option.
Это действительно плохо, потому что это означает, что прежде, чем Vanilla cможет начать просмотр куки, будет выполнен запрос к базе данных. Пришло время для реализации своего Аутентификатора в Vanilla. Стандартный Аутентификатор можно найти по адресу:
/path/to/document/root/wordpress-2.0.4/Vanilla.1.0.1/library/People/People.Class.Authenticator.php
Сделаем копию этого файла, и переименуем его:
/path/to/document/root/wordpress-2.0.4/Vanilla.1.0.1/library/People/People.Class.WordpressAuthenticator.php
Теперьр я открою его и отредактирую методы, которыми управляется Vanilla:
Технически я не должен реализовывать вход пользователей через Vanilla. Я мог только оставить эту задачу на wordpress и удалить people.php файл в Vanilla. Но я все же это сделаю.
Так, чтобы занять время, я написал новый WordpressAuthenticator:
<?php /* * Copyright 2003 Mark O'Sullivan * This file is part of People: The Lussumo User Management System. * Lussumo's Software Library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. * Lussumo's Software Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with Vanilla; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * The latest source code is available at www.lussumo.com * Contact Mark O'Sullivan at mark [at] lussumo [dot] com * * Description: Default interface for user authentication. This class may be * replaced with another using the "AUTHENTICATION_MODULE" configuration setting. * Applications utilizing this file: Vanilla; */ class Authenticator { var $Context; var $WordpressSettingsRetrieved; var $CookiePath; var $SiteCookiePath; var $CookieHash; var $UserCookieName; var $PassCookieName; function AssignSessionData($user_login, $user_pass, $PersistentSession = '0') { $this->GetWordpressSettings(); $Expire = $PersistentSession ? time() + 31536000 : 0; $user_pass = md5($user_pass); // Double hash the password in the cookie. // Set the cookies setcookie($this->UserCookieName, $user_login, $Expire, $this->CookiePath, false); setcookie($this->PassCookieName, $user_pass, $Expire, $this->CookiePath, false); if ($this->CookiePath != $this->SiteCookiePath ) { setcookie($this->UserCookieName, $user_login, $Expire, $this->SiteCookiePath, false); setcookie($this->PassCookieName, $user_pass, $Expire, $this->SiteCookiePath, false); } } // This method is used in various places in Vanilla to sign someone into a session function AssignSessionUserID($UserID) { // Get the login_name and password for session assignment $s = $this->Context->ObjectFactory->NewContextObject($this->Context, 'SqlBuilder'); $s->SetMainTable('User', 'u'); $s->AddSelect(array('Name', 'Password'), 'u'); $s->AddWhere('u', 'UserID', '', $UserID, '='); $Result = $this->Context->Database->Select($s, 'WordpressAuthenticator', 'AssignSessionUserID', 'An error occurred while attempting to assign session data'); if ($Result) { $user_login = ''; $user_pass = ''; while ($rows = $this->Context->Database->GetRow($Result)) { $user_login = ForceString($rows['Name'], ''); $user_pass = ForceString($rows['Password'], ''); } $this->AssignSessionData($user_login, $user_pass); } } // Returning '0' indicates that the username and password combination weren't found. // Returning '-1' indicates that the user does not have permission to sign in. // Returning '-2' indicates that a fatal error has occurred while querying the database. function Authenticate($Username, $Password, $PersistentSession) { // Validate the username and password that have been set $Username = FormatStringForDatabaseInput($Username); $Password = FormatStringForDatabaseInput($Password); $UserID = 0; $user_login = ''; $user_pass = ''; // Retrieve matching username/password values $s = $this->Context->ObjectFactory->NewContextObject($this->Context, 'SqlBuilder'); $s->SetMainTable('User', 'u'); $s->AddJoin('Role', 'r', 'RoleID', 'u', 'RoleID', 'inner join'); $s->AddSelect(array('UserID', 'Name', 'Password'), 'u'); $s->AddSelect('PERMISSION_SIGN_IN', 'r'); $s->AddWhere('u', 'Name', '', $Username, '='); $s->AddWhere('u', 'Password', '', md5($Password), '=', 'and', '', 1, 1); $s->AddWhere('u', 'Password', '', $Password, '=', 'or'); $s->EndWhereGroup(); $UserResult = $this->Context->Database->Select($s, 'WordpressAuthenticator', 'Authenticate', 'An error occurred while attempting to validate your credentials'); if (!$UserResult) { $UserID = -2; } elseif ($this->Context->Database->RowCount($UserResult) > 0) { $CanSignIn = 0; $VerificationKey = ''; while ($rows = $this->Context->Database->GetRow($UserResult)) { $UserID = ForceInt($rows['UserID'], 0); $user_login = ForceString($rows['Name'], ''); $user_pass = ForceString($rows['Password'], ''); $CanSignIn = ForceBool($rows['PERMISSION_SIGN_IN'], 0); } if (!$CanSignIn) { $UserID = -1; } else { // Update the user's information $this->UpdateLastVisit($UserID); // Assign the session value $this->AssignSessionData($user_login, $user_pass, $PersistentSession); // Log the person's ip $this->LogIp($UserID); } } return $UserID; } function Authenticator(&$Context) { $this->Context = &$Context; $this->WordpressSettingsRetrieved = '0'; $this->CookiePath = ''; $this->SiteCookiePath = ''; $this->CookieHash = ''; } function DeAuthenticate() { if (session_id()) session_destroy(); $this->GetWordpressSettings(); setcookie($this->UserCookieName, ' ', time() - 31536000, $this->CookiePath, false); setcookie($this->PassCookieName, ' ', time() - 31536000, $this->CookiePath, false); setcookie($this->UserCookieName, ' ', time() - 31536000, $this->SiteCookiePath, false); setcookie($this->PassCookieName, ' ', time() - 31536000, $this->SiteCookiePath, false); return true; } function GetIdentity() { $this->GetWordpressSettings(); // Examine the cookie values for session info $login = ForceIncomingCookieString($this->UserCookieName, ''); $pass = ForceIncomingCookieString($this->PassCookieName, ''); $dbpass = ''; $UserID = 0; if ($login != '' && $pass != '') { $s = "select id, user_pass from wp_users where user_login = '".FormatStringForDatabaseInput($login)."'"; $Result = $this->Context->Database->Execute($s, 'WordpressAuthenticator', 'GetIdentity', 'An error occurred while attempting to retrieve session data.'); if ($Result) { while ($rows = $this->Context->Database->GetRow($Result)) { $UserID = ForceInt($rows['id'], 0); $dbpass = ForceString($rows['user_pass'], ''); } // If the double-md5d password doesn't match the one in the cookie - don't authenticate if (md5($dbpass) != $pass) { $UserID = 0; } } } else { if (session_id()) session_destroy(); } if (!session_id()) { session_set_cookie_params(0, $this->CookiePath); session_start(); } return $UserID; } function GetWordpressSettings() { if ($this->WordpressSettingsRetrieved == '0') { $siteurl = ''; $home = ''; $s = "select option_name, option_value from wp_options where option_name = 'siteurl' or option_name = 'home'"; $DataSet = $this->Context->Database->Execute($s, 'WordpressAuthenticator', 'GetCookieName', 'An error occurred while retrieving cookie names.'); if ($DataSet) { while ($rows = $this->Context->Database->GetRow($DataSet)) { if ($rows['option_name'] == 'siteurl') { $siteurl = ForceString($rows['option_value'], ''); } else if ($rows['option_name'] == 'home') { $home = ForceString($rows['option_value'], ''); } } } $this->CookiePath = preg_replace('|https?://[^/]+|i', '', $home . '/' ); $this->SiteCookiePath = preg_replace('|https?://[^/]+|i', '', $siteurl . '/' ); $this->CookieHash = md5($siteurl); $this->UserCookieName = 'wordpressuser_'.$this->CookieHash; $this->PassCookieName = 'wordpresspass_'.$this->CookieHash; $this->WordpressSettingsRetrieved = '1'; } } function LogIp($UserID) { if ($this->Context->Configuration['LOG_ALL_IPS']) { $s = $this->Context->ObjectFactory->NewContextObject($this->Context, 'SqlBuilder'); $s->SetMainTable('IpHistory', 'i'); $s->AddFieldNameValue('UserID', $UserID); $s->AddFieldNameValue('RemoteIp', GetRemoteIp(1)); $s->AddFieldNameValue('DateLogged', MysqlDateTime()); $this->Context->Database->Insert($s, 'WordpressAuthenticator', 'LogIp', 'An error occurred while logging your IP address.', false); // fail silently } } function UpdateLastVisit($UserID) { $s = $this->Context->ObjectFactory->NewContextObject($this->Context, 'SqlBuilder'); $s->SetMainTable('User', 'u'); $s->AddFieldNameValue('DateLastActive', MysqlDateTime()); $s->AddFieldNameValue('CountVisit', 'CountVisit + 1', 0); $s->AddWhere('u', 'UserID', '', $UserID, '='); $this->Context->Database->Update($s, 'WordpressAuthenticator', 'UpdateLastVisit', 'An error occurred while updating your profile.', false); // fail silently } } ?>
Хорошо, теперь я должен сделать так чтоб Vanilla знала о моем новом классе аутентификации. Сделаем это, отредактировав файл conf/settings.php путем добавления следующих строк:
// Wordpress Authenticator $Configuration['AUTHENTICATION_MODULE'] = 'People/People.Class.WordpressAuthenticator.php';
Теперь я попробую войти с данными аккаунта WordPress.
Я пробывал использовать и экран входа Vanilla, и экран входа WordPress - оба работали должным образом. Вам выбирать что вы будете использовать.
Теперь большая проблема…
Мой WordPress аккаунт имеет базовые права учасника в Vanilla. Я должен это исправить, выполнив запрос к таблице wp_users. Я знаю, что RoleID администратора в Vanilla = 4. Если Вы не уверены, что административная роль на Вашем форуме Vanilla, Вы можете просмотреть роли следующим запросом:
SELECT * FROM LUM_Role
Теперь я должен обновить администраторский аккаунт с RoleID администратора Vanilla. Я также знаю что ID администратора в таблице wp_users = 1, поэтому я обновлю свою роль, выполнив запрос:
UPDATE wp_users SET RoleID = 4 WHERE id = 1
Теперь я имею права на доступ ко всем администраторским возможностям в Vanilla так же как и в WordPress.
Теперь я должен выяснить, как обращаться с новыми участниками и в Wordpress и в Vanilla. Оригинальные поля таблицы wp_users НЕ позволяют использовать нули, так, если Вы попытаетесь создать пользователя с помощью регистрационой формы Vanilla, то вероятно это не будет работать вообще, либо потерпит неудачу. При попытке вставки новых данных, поля WordPress в таблице wp_users обнулятся.
Я вошел и создал пользователей вручную в wordpress админке, также я включил возможность регистрации для Wordpress. Оба метода работали и позволили новому пользователю регистрироваться и начинать общаться в Vanilla и работать в Wordpress.
Теперь, если хотите, Вы можете отключить регистрацию и вход пользователей через Vanilla. Самый простой способ - удалить файл people.php в корневой директории Vanilla. Это также подойдет для большинства людей, когда после регистрации Вам не дают права на стороне WordPress, так как таблица «wp_usermeta» ничего не знает о новом пользователе, и не может назначить надлежащие привилегии WordPress новому пользователю.
Вы можете написать расширение для Vanilla, которое изменяет способ создания пользователи Vanilla так чтобы при этом создавались некоторые значения по умолчанию для wordpress полей. В этом случае Вы можете сохранить файл people.php, сказав пользователям какой вариант входа использовать.
Я пошел в директорию с дополнениями Vanilla (extensions) и создал папку «WordpressIntegration». Затем я зашел в эту папку и создал файл default.php. В этот файл запишем следующий код:
<?php /* Extension Name: Wordpress Integration Extension Url: http://lussumo.com/docs/ Description: Makes it so that new users can be added via the Vanilla registration form and it won't mess up the wordpress user table. Version: 1.0 Author: Mark O'Sullivan Author Url: http://markosullivan.ca/ */ if ($Context->SelfUrl == 'people.php') { function UserManager_AddWordpressFieldsToCreateUser(&$UserManager) { $User = &$UserManager->DelegateParameters['User']; $SafeUser = clone ($User); $SafeUser->FormatPropertiesForDatabaseInput(); $s = &$UserManager->DelegateParameters['SqlBuilder']; // Since Vanilla and Wordpress encode their passwords differently, I need // to make Vanilla's CreateUser method save it's password in the same way. // So, I'll have to rebuild this sql object with the proper password. $s->Clear(); $s->SetMainTable('User', 'u'); $s->AddFieldNameValue('FirstName', $SafeUser->FirstName); $s->AddFieldNameValue('LastName', $SafeUser->LastName); $s->AddFieldNameValue('Name', $SafeUser->Name); $s->AddFieldNameValue('Email', $SafeUser->Email); $s->AddFieldNameValue('Password', md5($SafeUser->NewPassword)); $s->AddFieldNameValue('DateFirstVisit', MysqlDateTime()); $s->AddFieldNameValue('DateLastActive', MysqlDateTime()); $s->AddFieldNameValue('CountVisit', 0); $s->AddFieldNameValue('CountDiscussions', 0); $s->AddFieldNameValue('CountComments', 0); $s->AddFieldNameValue('RoleID', $UserManager->Context->Configuration['DEFAULT_ROLE']); $s->AddFieldNameValue('StyleID', 0); $s->AddFieldNameValue('UtilizeEmail', $UserManager->Context->Configuration['DEFAULT_EMAIL_VISIBLE']); $s->AddFieldNameValue('Attributes', ''); $s->AddFieldNameValue('RemoteIp', GetRemoteIp(1)); $s->AddFieldNameValue('user_nicename', $SafeUser->Name); $s->AddFieldNameValue('user_url', 'http://'); $s->AddFieldNameValue('user_activation_key', ''); $s->AddFieldNameValue('user_status', '0'); $s->AddFieldNameValue('display_name', $SafeUser->Name); } $Context->AddToDelegate('UserManager', 'PreDataInsert', 'UserManager_AddWordpressFieldsToCreateUser'); } ?>
Затем я авторизовался в Vanilla как администратор, и активировал новое дополнение, зайдя в настройки / дополнения. Далее я зашел в настройки / регистрация новых пользователей и изменил «Роль нового пользователя» на «Учасник», т.к. я хочу чтоб новые пользователи автоматически регистрировались как учасники.
Далее я вышел из Vanilla и попробовал зарегистрироваться, нажав на «Регистрация». Убедившись что меня впустило с новым менем пользователя, я вернулся на страницу WordPress, и обнаружил что я авторизован как новый ползователь с базовыми правами.
Я не попробовал этот код на живом работающем сервере, и может быть попадется такой который я не знаю, потому что я не специалист по wordpress. Если у кого-нибудь из вас есть что добавить к этой статье - пожалуйста добавляйте!
Мне сказали, что я провел приблизительно три часа за написанием этого документа, и получив мою первую интеграцию Vanilla в Wordpress, я могу сказать что это действительно не сложно. Единственный вопрос который остается: где Вы хотите, чтобы Ваши пользователи регистрировались и авторизовывались? Через Vanilla или Wordpress. Выбор остается за вами.