Intereting Posts
Умножение данных из строки MySQL Как я могу исправить флеш-флагом PHP-потокобезопасное / непоточное безопасное рассогласование? Удаление выбранных данных в флажке Есть ли ограничение памяти для метода json_encode ()? PHP – общее количество дней не является целым числом Использование Emacs для веб-разработки? (PHP / MySQL / JavaScript / CSS / HTML Обновление пакета с помощью CodeIgniter Доступ к узлу XML напрямую с помощью ключа Лучший способ повторить имя пользователя на каждой странице с помощью сеансов? В завершении кода PhpStorm не отображаются основные классы / расширения Добавление данных в переменную php с помощью PDO fetchAll :: fetch_assoc preg_replace, чтобы изменить URL-адрес относительно абсолютного Получение всего списка EmployeeID в выпадающем списке из базы данных mysql? автоматическое сохранение данных формы с помощью jquery и php php PDO :: FETCH_CLASS отображает все свойства нижнего регистра вместо camelCase

совместное использование пользователя по 2 WordPress устанавливает в 2 поддоменах на одном сервере

У меня есть 2 сайта WordPress в двух разных поддоменах, таких как test1.abc.com и test2.abc.com . Оба сайта имеют wp-require plugin, и только зарегистрированные пользователи могут видеть сайт. Мы хотим создать систему, в которой, если пользователь зарегистрировался на одном сайте, он должен автоматически войти в другой.

Что я пытаюсь:

После некоторого поиска я знаю, что мне нужно использовать одну базу данных для обоих сайтов. Поэтому я сделал следующие шаги:

Я загрузил всю базу данных сайта test2.abc.com и изменил весь префикс wp_ на wpmo_, заменил его в целом базе данных и загрузил в базу данных первого сайта. Я добавил эти 2 строки в wp-config.php второго сайта, чтобы определить, что второй сайт должен использовать пользовательскую таблицу первого сайта, а не свою.

define('CUSTOM_USERMETA_TABLE', 'wp_usermeta'); define('CUSTOM_USER_TABLE', 'wp_users'); 

Теперь второй сайт использует пользователей первого сайта, и я могу войти на второй сайт по деталям пользователя первого сайта.

Следующая проблема – файлы cookie, поэтому я добавил эти строки в wp-config обоих сайтов.

 define('COOKIE_DOMAIN', '.abc.com'); define('COOKIEPATH', '/'); define('COOKIEHASH', 'aee53c017c29dc0d3ae37253fc8cbfd8'); 

Теперь я вошел в test1.abc.com, и когда я иду на test2.abc.com, он просит меня войти в систему. Это означает, что файлы cookie не переходят с первого сайта на второй. Тем не менее, я пытался распечатать $ _COOKIE, и он дает мне такие же значения шифрования, но пользователь все еще не автозарегистрируется на втором сайте. также, когда я вернулся на первый сайт, это автоматический выход из системы. я чувствую, что оба сайта связаны каким-то образом с файлами cookie, и я близко, но до сих пор не достиг своей цели автоматического входа во второй сайт.

Любая помощь?

Решение :

После некоторой помощи от Mikk3lRo и других, мне удалось решить эту проблему. Я отправляю решение для тех, кто сталкивается с такой же проблемой. здесь вы можете найти пошаговое руководство для этого:

шаг 1: используйте одну базу данных для обеих установок, установите 2 wp, используя 2 разных префикса во время установки.

Шаг 2: Убедитесь, что случайно сгенерированные секретные ключи и соли также идентичны в обоих файлах wp-config.php.

Шаг 3: вставьте эти 2 строки в wp-config.php второго сайта.

 //Share user tables define('CUSTOM_USER_META_TABLE', 'SITE1_PREFIX_usermeta'); define('CUSTOM_USER_TABLE', 'SITE1_PREFIX_users'); 

Шаг 4: обмен файлами с этими строками. (пишите как в wp-config.php)

 //Share cookies define('COOKIE_DOMAIN', '.abc.com'); define('COOKIEHASH', 'aee53c017c29dc0d3ae37253fc8cbfd8'); 

Шаг 5: теперь вы сможете автоматически вводить логин на втором сайте при входе в первый сайт. но у вас появится сообщение об ошибке на втором сайте «у вас нет разрешения на доступ к этой странице», что хорошо.

Шаг 6: Причина в том, что WordPress проверяет возможности пользователя (wp-includes / capability.php), так что либо вы напрямую добавляете эту возможность в базу данных (в случае, если у вас мало пользователей), либо для написания плагина для этого. @ Mikk3lRo пишет плагин для этого в комментариях, что хорошо.

благодаря

Related of "совместное использование пользователя по 2 WordPress устанавливает в 2 поддоменах на одном сервере"

Хорошо – вы очень близки, но есть еще несколько вещей, которые нужно сделать.

Все требования заключаются в следующем:

  • Поделитесь той же базой данных, используя разные префиксы – вы это сделали. Отсюда я предполагаю, что префиксы wp1_ , wp2_ и т. Д.
  • Разделите таблицы wp1_users и wp1_usermeta – вы сделали это – и на самом деле вы бы преодолели это препятствие, если бы вы правильно CUSTOM_USER_META_TABLE имя констант … это CUSTOM_USER_META_TABLE (еще одно подчеркивание, чем то, что у вас есть)
  • Предоставляйте файлы cookie между субдоменами с использованием общего COOKIE_DOMAIN и COOKIEHASH – вы сделали это
  • Убедитесь, что (обычно) случайно сгенерированные секретные ключи и соли также идентичны – вы не пишете, что вы это сделали, но, судя по вашим результатам, я думаю, что у вас есть или ваши ключи пусты (что не хорошо, но будет работать)
  • Убедитесь, что для каждого пользователя в общей таблице prefix_capabilities запись prefix_capabilities для каждого пользователя – я не думаю, что вы это сделали, просто потому, что вы еще не достигли точки, когда вы понимаете, что это необходимо.

Полное решение:

Это происходит в wp-config.php :

 //Share user tables define('CUSTOM_USER_META_TABLE', 'wp1_usermeta'); define('CUSTOM_USER_TABLE', 'wp1_users'); //Share cookies define('COOKIE_DOMAIN', '.abc.com'); define('COOKIEHASH', 'aee53c017c29dc0d3ae37253fc8cbfd8'); /** * In my case these are not needed - but they may well be if one * of the installs is located in a sub-folder. I have not tested * this theory though. */ //define('COOKIEPATH', '/'); //define('SITECOOKIEPATH', '/'); //define('ADMIN_COOKIE_PATH', '/wp-admin'); //These all need to be identical define('AUTH_KEY', 'this should be random'); define('SECURE_AUTH_KEY', 'this should also be a random string'); define('LOGGED_IN_KEY', 'one more random string'); define('AUTH_SALT', 'oh my - so many random strings'); define('SECURE_AUTH_SALT', 'salt, salt, salt and no eggs'); define('LOGGED_IN_SALT', 'this is sooooo random'); /** * These do not need to be shared - in fact they probably shouldn't be * - if they are you could (in theory) do actions on one site that was * intended for the other - probably not a very big concern in reality */ define('NONCE_KEY', 'these should be random too, but can differ'); define('NONCE_SALT', 'one site has one, the other another'); 

Этого достаточно, чтобы вы вошли в систему на обоих сайтах, но в этом списке осталась последняя досадная пуля.

Проблема в том, что ваши разрешения («возможности») хороши только на одном из сайтов, потому что meta_key имеет префикс табличного префикса сайта. Если вы немного поработаете над Google, вы найдете множество решений, рекомендующих изменить wp-includes/capabilities.php чтобы просто использовать общий префикс вместо этого – я настоятельно рекомендую против этого! (не по соображениям безопасности, а потому, что вам нужно будет сделать этот патч / хак после каждого обновления … и это просто безумно плохая практика для изменения основных файлов)

Вместо этого, чтобы устранить это препятствие, вам нужно дублировать строку wp1_usermeta таблице wp1_usermeta (для каждого пользователя!), Давая ей новый umeta_id и заменяя префикс wp1_ wp2_ на meta_key столбце meta_key . Вы должны сделать это для каждого сайта, так что у вас есть одна строка с meta_key wp1_capabilities , одна с wp2_capabilities и т. Д.

Если вы и ваш друг являются единственными пользователями, которые будут входить в систему на сайтах, то просто сделайте это вручную через phpMyAdmin или что-то в этом роде – если вам нужно, чтобы он работал динамически, тогда его вполне можно автоматизировать с помощью маленький плагин (см. ниже).

Я всегда ненавидел этот дизайн – префикс таблицы не имеет бизнеса внутри строки таблицы! Я думаю, что это необходимо для многопользовательских установок, хотя я уверен, что будут другие (лучшие) способы его решения …

Обновление: плагин, чтобы синхронизировать роли пользователей между всеми сайтами

Этот простой плагин будет дублировать и сохранять требуемые строки в таблице usermeta обновляемой при создании или редактировании пользователей.

Стоит отметить, что он, вероятно, не будет работать с многопользовательскими установками, потому что у них есть особые возможности / роли. Я не тестировал это.

Это может потребоваться уточнение для конкретных случаев использования (просьба сделать комментарий), но он отлично подходит для моего ограниченного тестового примера, который включает только нескольких пользователей. Это будет неэффективно для сайта с тысячами пользователей, но поскольку он работает только при изменении пользователя и только обновления, если они нужны, я сомневаюсь, что это будет серьезной проблемой. Однако относительно легко адаптироваться только к чтению и изменению пользователя, который только что был добавлен / отредактирован. Это немного усложняло бы первоначальную настройку, поскольку уже существовавшие пользователи не будут автоматически дублироваться при первом запуске.

Создайте папку wp-content/plugins/duplicate-caps и внутри, duplicate-caps.php следующее в duplicate-caps.php – и не забудьте активировать под plugins в wordpress admin. Он должен быть установлен на всех сайтах.

 <?php /* Plugin Name: Duplicate Caps Plugin URI: Description: Tiny plugin to duplicate capabilities in a setup where users (and user tables) are shared across more than one install Author: Mikk3lRo Version: 0.1 Author URI: */ $dummy = new duplicate_caps(); class duplicate_caps { function __construct() { add_action('updated_user_meta', array($this, 'update_prefixed_caps'), 10, 2); add_action('added_user_meta', array($this, 'update_prefixed_caps'), 10, 2); add_action('deleted_user_meta', array($this, 'update_prefixed_caps'), 10, 2); } function update_prefixed_caps($mid, $object_id) { /** * Note that $object_id contains the id of the user that was * just changed. * On a site with many users it would make sense to only * get and set information regarding the just-changed user * Currently this function corrects roles for all users * making sure pre-existing users are duplicated, and keeping * the table in sync. */ global $wpdb; //Quick and dirty - get all *capabilities rows for all users $sql = "SELECT * FROM {$wpdb->usermeta} WHERE `meta_key` LIKE '%capabilities'"; $results = $wpdb->get_results($sql) or die(mysql_error()); //Will hold all prefixes (always include our own) $prefixes = array($wpdb->prefix); //Will grab the existing role for each prefix $user_roles = array(); //Loop our results foreach ($results as $result) { //Make sure the meta_key looks right, and grab the prefix if (preg_match('#^(.*)capabilities$#', $result->meta_key, $matches)) { $prefix = $matches[1]; // Collect prefixes $prefixes[] = $prefix; //Note the entire row for later use $user_roles[$result->user_id][$prefix] = $result; } } //Make sure we only have one of each $prefixes = array_unique($prefixes); //Loop through the users we found foreach ($user_roles as $user_id => $existing_prefixes) { if (!isset($existing_prefixes[$wpdb->prefix])) { //User was probably just deleted - all rows are deleted by //wordpress though, so no cleanup for us :) } else { //We want all prefixes to obey us (we just created or changed //the user, so we want that to affect all sites) $desired_role = $existing_prefixes[$wpdb->prefix]->meta_value; //Loop through all prefixes foreach ($prefixes as $prefix) { //Data to be inserted / updated $cap_data = array( 'user_id' => $user_id, 'meta_key' => $prefix . 'capabilities', 'meta_value' => $desired_role ); //If the prefix doesn't exist for this user if (!in_array($prefix, array_keys($existing_prefixes))) { //Actually insert it (user was probably just created) $wpdb->insert($wpdb->usermeta, $cap_data, array('%d', '%s', '%s')); } else if ($desired_role !== $existing_prefixes[$prefix]->meta_value) { //Update it if not already correct (user was probably just edited) $cap_data['umeta_id'] = $existing_prefixes[$prefix]->umeta_id; $wpdb->replace($wpdb->usermeta, $cap_data, array('%d', '%s', '%s', '%d')); } } } } } } 

Я считаю, что самым простым решением для вас было бы использование одного из плагинов WordPress для единого входа (SSO).

Здесь перечислено большое количество плагинов.

Вы можете использовать один из них или основывать свою аутентификацию на одном из них.

В качестве альтернативы существует многосайтовый сайт, который позволит вам создать сеть сайтов, если вы решите создать многосайтовый сайт, а затем сначала прочитайте это .

Я думаю, что определить файлы cookie недостаточно для входа на сайт wp.

Итак, мое решение: создать плагин, чтобы ограничить доступ к тем, кто не заходит на один из сайтов. Установите cookie при входе пользователя на один из сайтов. когда пользователь просматривает сайт. проверить значение cookie и перенаправить или вернуться на сайт.

Образец кода:

  add_action('wp_login','prefix_set_cookie'); //when someone logged in this call the set_cookie function function prefix_set_cookie(){ setcookie('hashed_cookie','my_value'); //set the cookie } //call check_cookie function when wordpress site loads add_action('wp','check_cookie'); function check_cookie(){ //check the cookie value and view the website if(isset($_COOKIE['hashed_cookie'] )){ if($_COOKIE['hashed_cookie'] == 'my_value'){ return; }else{ die("no access please login <a href='your login link'>LINK</a>"); } } } 

Основным недостатком этого плагина является низкая безопасность. любой создайте этот файл cookie вручную. поэтому его высокая безопасность, не используйте это. попробуйте сделать хэширование файла cookie, чтобы он не мог легко создаваться вручную.

(если вы хотите, чтобы полный код для плагина помещался куда-то)

Обновление (полный плагин):

 <?php /* Plugin Name: Restrict Access Author: Pasindu Jayawardane Description: This Plugin Restrict Access to the Site without login Author URI: https://www.facebook.com/pj.pasiya */ $key = hash('md5','restrict_access'); $value = hash('md5','true'); add_action('wp_login','es_set_cookie'); function es_set_cookie(){ global $key, $value; setcookie($key, $value ,time()+3600); } add_action('wp_logout','es_remove_cookie'); function es_remove_cookie(){ global $key, $value; setcookie($key, $value ,time()-3600); } add_action('wp','es_check_cookie'); function es_check_cookie(){ global $key, $value; if(isset($_COOKIE[$key] )){ if($_COOKIE[$key] == $value){ return; }else{ ?> <h1 class="alert alert-danger"> This Website is Protected! <small>You Must Login to See the Website</small> </h1> <p class="ra-login"> <a href="<?php echo wp_login_url(); ?>"> Login </a> <p> <?php die(); } }else{ ?> <h1 class="alert alert-danger"> This Website is Protected! <small>You Must Login to See the Website</small> </h1> <p class="ra-login"> <a href="<?php echo wp_login_url(); ?>"> Login </a> <p> <?php die(); } } 

перейдите в каталог плагинов установки wordpress ({{wp install folder}} -> wp-content-> и добавьте новый файл с расширением .php {{file-restrict.php}} скопируйте и вставьте этот код

сделать это для обоих сайтов

перейдите в плагины wordpress и активируйте плагин. (оба сайта)

как только вы заходите на один из сайтов, вы можете просмотреть любой из сайтов. и как только вы выходите на один сайт, вы получаете сообщение со ссылкой для входа на сайт.

(после активации только выхода из системы и входа на сайт)

я также отправлю код для вас.