Я разработал веб-сайт с использованием PHP и MySQL, у которого уже есть форма входа и регистрации. ( myweb.com
)
Я добавил wordpress к этому url myweb.com/blog
Я хочу отключить страницу входа и регистрации в WordPress и заставить пользователей использовать мои. В основном интегрируйте мой логин с WordPress, чтобы пользователь вошел в систему на обоих сайтах.
Таблица моих members
сайта выглядит так. Здесь хранятся все зарегистрированные пользователи. И пароли в моей БД хэшируются с использованием md5()
id | name | email | password
и структура WordPress подобна этой и в настоящее время пуста
ID | user_login | user_pass | user_nicename | user_email | user_url | user_registered | user_activation_key | user_status | display_name
Я попытался выполнить описанные здесь шаги
но я получаю эту ошибку в строке 254 var_dump($user);
object(WP_Error)#620 (2) { ["errors"]=> array(1) { ["invalid_username"]=> array(1) { [0]=> string(166) "<strong>ERROR</strong>: Invalid username. <a href="http://localhost/dev/blog/wp-login.php?action=lostpassword" title="Password Lost and Found">Lost your password</a>?" } } ["error_data"]=> array(0) { } }
Кроме того, вся информация пользователя хранится в моей таблице members
на моем сайте не в db WordPress.
Вот мой код для моего сайта, на который я недавно добавил логин WordPress.
/* * Login * * $email = email of user * $pass = user password (must already be in md5 form) * $url = url of page they are login from */ function login($email = '', $pass = '', $url = '', $sticky = false) { global $lang, $_db, $mod, $template_style; // Replace nasty things to stop sql injection $email = addslashes(strtolower($email)); $email = strip_tags($email); $email = htmlspecialchars($email, ENT_QUOTES); //get user id $sql = "SELECT `id`, `name`, `username` FROM `members` WHERE `email`='".mysql_real_escape_string($email)."' AND `pass` = '" . mysql_real_escape_string($pass) . "' LIMIT 0,1"; $q = $_db->query($sql); list($uid, $name, $username) = $_db->fetch_array($q); $login_check = $_db->num_rows($q); if ($login_check <= '0') //check if login matches { echo '0'; //login failed die; } /* * wordpress login * * read: * http://codex.wordpress.org/Function_Reference/wp_update_user */ $credentials = array(); $credentials['user_email'] = $email; $credentials['user_password'] = $pass; $credentials['remember'] = $sticky; // true/false $secure_cookie = false; // true / false $user = wp_authenticate($credentials['user_email'], $credentials['user_password']); if ( is_wp_error($user) ) { if ( $user->get_error_codes() == array('empty_email', 'empty_password') ) { //$user = new WP_Error('', ''); $user = wp_update_user(array ( 'user_login' => $name, 'user_email' => $email, 'user_pass' => $pass )); } } var_dump($user); wp_set_auth_cookie($user->ID, $credentials['remember'], $secure_cookie); do_action('wp_login', $user->user_login, $user); /* set login cookies */ set_login_cookie($uid, $pass, $sticky); //lock check lock_checker($uid); update_thisuser_online(); }
Нужно ли мне копировать все из таблицы моих members
и заполнять его в wp_users
или есть способ входа в WordPress без дублирования данных в двух разных таблицах? Я не хочу иметь 2 логина и 2 регистрационных формы на обоих сайтах.
Почему wp_authenticate()
в моем коде выше аутентифицируется?
Вы можете установить логин wordpress для использования пользовательской таблицы, отредактировав config.php и добавив следующие две строки:
define('CUSTOM_USER_TABLE','new_user_table'); //login, pass, email etc define('CUSTOM_USER_META_TABLE', 'new_usermeta_table'); //optional bio, don't have to include this line
Где new_user_table – таблица вашего сайта, а new_usermeta_table – био-таблица вашего сайта (если вы этого хотите)
Пользовательская таблица должна иметь ту же структуру, что и обычная таблица wordpress. Итак, чтобы это работало с таблицей вашего существующего веб-сайта, вам нужно будет добавить несколько полей и убедиться, что пароль хэшируется одинаково.
Вот как структурировать таблицу пользователя
Вот как структурировать мета-таблицу пользователя
Чтобы хэш правильно использовать пароли при регистрации, включите файл wp-includes / pluggable.php и используйте функцию
<?php $hash = wp_hash_password( $password ) ?>
Для существующих паролей, которые не были хешированы правильно, вам придется настроить сброс пароля электронной почты.
Или. если вы хотите сохранить свои текущие хэши паролей (не рекомендуется по соображениям безопасности, но выполнимо), вы можете изменить функцию хэширования wordpress. В wp-includes / pluggable.php изменение:
if ( !function_exists('wp_hash_password') ){ function wp_hash_password($password) { //apply your own hashing structure here return $password; } }
И измените:
if ( !function_exists('wp_check_password') ){ function wp_check_password($password, $hash, $user_id = '') { //check for your hash match return apply_filters('check_password', $check, $password, $hash, $user_id); } }
Подробнее о wp_check_password Go Here
альтернативно
Вы можете пропустить беспорядок со своей пользовательской таблицей и использовать вход WordPress для остальной части вашего сайта. Для этого просто используйте следующий код:
<?php include 'wp-config.php'; if ( is_user_logged_in() ) { echo 'Welcome, registered user!'; } else { header( 'Location: http://google.com' ) ; }; ?>
Убедитесь, что «wp-config.php» – это полный относительный путь к файлу, затем поместите этот код на каждую страницу вашего сайта без WordPress. замените эхо, чтобы содержимое отображалось для зарегистрированного пользователя, и замените заголовок тем, что должно отображаться для гостя. Если содержимое является простым html, вы можете сделать следующее:
<?php include 'wp-config.php'; if ( is_user_logged_in() ) { ?> <html> <head></head> <body><p>Welcome Registered user</p></body> </html> <?php } else { ?> <html> <head></head> <body><p>Please log in</p></body> </html> <?php }; ?>
Попробуйте изменить параметры в файле wp-config.php
чтобы указать на базу данных ваших members
; вероятно, хорошая идея создать отдельный пользователь / пароль с MySQL и предоставить ему привилегии для вашей базы данных членов. Там есть множество полезных опций, которые вы можете установить / изменить с этим файлом. Я предлагаю вам прочитать документацию по нему для более глубоких материалов. Если вы решите попробовать вышеупомянутый подход, не забудьте также изменить строку $table-prefix
соответствии с существующей БД.
Кроме того, посмотрите, подходит ли эта запись в блоге, так как она напрямую связана с внешней аутентификацией. Доступен скрипт php, который вы можете копировать / вставлять или иным образом настраивать в соответствии с вашими конкретными потребностями. Обратите особое внимание на include_once("../wp-config.php");
и include_once("../wp-includes/class-phpass.php");
линий.
Мне удалось это сделать некоторое время назад, используя функцию из WordPress API.
wp_set_auth_cookie( $wordpress_user_id, $remember, false );
$wordpress_user_id
– это идентификатор пользователя в таблице WordPress.
$remember
– это логическая переменная, указывающая, должен ли WordPress создавать постоянный файл cookie, «запоминающий» пользователя между сеансами.
Я не помню третьего, но вы легко могли бы использовать Google.
PS Чтобы функция wp_set_auth_cookie
доступна, вам необходимо включить / потребовать некоторые файлы WordPress, прежде чем использовать ее. Попробуйте файл wp-load.php
.