Разрешить дублирование адреса электронной почты для разных пользователей


Мне нужно, чтобы разные пользователи могли использовать один и тот же адрес электронной почты. (Запуск сайта, на котором родители будут создавать учетные записи для своих детей, у которых может не быть собственного адреса электронной почты, поэтому родителю необходимо будет использовать свой или ее для каждой из учетных записей детей.)

Я видел другие предложения, некоторые из которых включают отредактированное ядро (чего я не хочу делать), но, похоже, ничего не работает.

Есть ли у кого-нибудь идеи о том, как обойти email_exists проверить создание пользователя?

Заранее благодарю.

P.S. Поскольку у меня нет представителя, я не могу прокомментировать другой пост, чтобы спросить, нашел ли ОП решение.

Author: mecnc, 2014-05-12

3 answers

К сожалению, это просто невозможно. Есть три случая, когда WordPress выполняет эту проверку:

  1. При нажатии кнопки "Сохранить" на экране редактирования пользователя (https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/user.php#L157 )
  2. Когда пользователь зарегистрирован (https://github.com/WordPress/WordPress/blob/master/wp-includes/user.php#L2023 )
  3. Когда пользователь создается/вставляется в базу dtabase ( https://github.com/WordPress/WordPress/blob/master/wp-includes/user.php#L1610 )

И (1), и (2) имеют крючки после них, которые позволяют удалить любое сообщение об ошибке (добавленное в объект WP_Error()) и таким образом эффективно обойти проверку.

К сожалению, и (1), и (2) вызывают (косвенно) wp_insert_user(), и поэтому (3). (Там есть небольшой лабиринт из wp_insert_user(), wp_update_user() и wp_create_user() :))

(3) является камнем преткновения. Проще говоря, вы не можете обойти это.

Но даже если бы вы могли , вероятно, лучше этого не делать. Поскольку широко ожидается уникальное электронное письмо, вы, возможно, используете плагины, которые полагаются на этот факт. Сам WordPress опирается на этот факт, когда вы используете функцию "забытый пароль".

Это оставляет вам два варианта:

  • Создайте "поддельное" электронное письмо для дочерних учетных записей (но вам нужно быть уверенным, что электронное письмо поддельное, учитывая, что электронное письмо поддельное - возможно, используйте свой домен?). Кроме того, вы хотели бы сделать абсолютно убедитесь, что электронные письма, связанные с такими учетными записями, никогда не используются.
  • Откажитесь от "пользовательского" подхода и используйте что-то вроде CPT. Но это привело бы к переписыванию чертовски большого количества кода, часть которого связана с безопасностью пользователей (например, вход в систему, хранение паролей и т. Д.). На самом деле это не совсем разумный выбор.

К сожалению, WordPress не предназначен для управления взаимоотношениями с пользователями...

 5
Author: Stephen Harris, 2014-05-12 17:40:21

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

define('WP_IMPORTING',true);

Эта константа проверяется в wp-includes/user.php в кодексе.

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

Надеюсь, это поможет!

 1
Author: Robert Peake, 2018-05-08 12:51:49

Я также изучал эту проблему и пытался найти лучшее решение для запроса клиента.

Есть несколько способов добиться этого, таких как фиктивные/поддельные электронные письма и создание дополнительного поля электронной почты. Что не вызовет уникального требования WP к электронной почте. Новое поле может быть просто помечено как "email2".

'email2' может содержать любую информацию, которую вы хотите [ограничено определением поля MySQL]. Как только он будет создан, добавьте одно и то же электронное письмо в оба учетные записи (или несколько в моем случае).

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

Например, если учетная запись 1 имеет автоматическое сообщение и/или обновление учетной записи и т.д... Ваш код может ссылаться на "обновить все учетные записи, где email2 = email2 текущего пользователя, вошедшего в систему WP_User".

Это обходной путь, но он должен удовлетворять большинству запросов клиентов. Они не увидят, что происходит в бэкэнде. Но когда они войдут в систему, они должны увидеть "комбинированное" или "зеркальное" представление обеих учетных записей. Потому что, по сути, они одинаковы, кроме уникальной электронной почты WPs и требований к имени пользователя.

Вы даже можете сделать это с помощью паролей. Вы не можете "зеркально отразить" пароли. Тем не менее, вы можете ссылаться и обновлять/устанавливать пароль для всех учетных записей, где email2 = email2 текущего зарегистрированного пользователя [wp_set_password].

Кроме того, есть этот плагин WP [не мой плагин, К вашему сведению]:

Https://wordpress.org/plugins/allow-multiple-accounts/

Если у кого-то еще есть какие-либо другие решения, давайте проведем мозговой штурм и найдем лучшие решения. Есть ли какие-нибудь лучшие решения? #stackexchangeискул

 0
Author: John Pedersen, 2017-11-16 01:58:48