Интеграция с Wordpress

(перевод оригинальной статьи Марка О'Саливанна (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 (Figure out who a person is based on their wordpress cookie values.).
  • Авто-логин пользователя, основанный на значениях куки из wordpress.
  • Установка новых значений и их обновления в базе wordpress, где это необходимо.

Технически я не должен реализовывать вход пользователей через 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.

Вариант 1

Теперь, если хотите, Вы можете отключить регистрацию и вход пользователей через Vanilla. Самый простой способ - удалить файл people.php в корневой директории Vanilla. Это также подойдет для большинства людей, когда после регистрации Вам не дают права на стороне WordPress, так как таблица «wp_usermeta» ничего не знает о новом пользователе, и не может назначить надлежащие привилегии WordPress новому пользователю.

Вариант 2

Вы можете написать расширение для 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. Выбор остается за вами.

 
vanilla/integration/wordpress.txt · Последние изменения: 2008/09/02 09:34 bionic
 

Recent changes RSS feed Vanilla forum