web-dev-qa-db-fra.com

Autoriser les adresses électroniques en double pour différents utilisateurs

Je dois pouvoir faire en sorte que différents utilisateurs partagent la même adresse électronique. (L'exploitation d'un site sur lequel les parents créeront des comptes pour leurs enfants qui n'auront peut-être pas leur propre adresse électronique. Le parent devra donc utiliser la sienne pour chacun des comptes des enfants.)

J'ai vu d'autres suggestions, dont certaines incluent le noyau édité (ce que je ne veux pas faire), mais rien ne semble fonctionner.

Quelqu'un a-t-il une idée sur la manière de contourner le contrôle email_exists sur la création de l'utilisateur?

Merci d'avance.

P.S. Étant donné que je n'ai pas le représentant, je ne peux pas commenter sur l'autre message pour demander si le PO a trouvé une solution.

4
mecnc

Malheureusement, ce n'est tout simplement pas possible. WordPress effectue cette vérification à trois occasions:

  1. Lorsque vous cliquez sur "Enregistrer" dans l'écran de modification d'utilisateur ( https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/user.php#L157 )
  2. Lorsqu'un utilisateur est enregistré ( https://github.com/WordPress/WordPress/blob/master/wp-includes/user.php#L2023 )
  3. Lorsqu'un utilisateur est créé/inséré dans la base de données ( https://github.com/WordPress/WordPress/blob/master/wp-includes/user.php#L1610 )

Les deux (1) et (2) ont des crochets après eux qui vous permettent de supprimer tout message d'erreur (ajouté à un objet WP_Error()), et ainsi de contourner efficacement le contrôle.

Malheureusement, les deux (1) et (2) appellent (indirectement) wp_insert_user(), et ainsi (3). (Il y a un peu de labyrinthe de wp_insert_user(), wp_update_user() et wp_create_user() :))}

(3) est la pierre d'achoppement. En termes simples, vous ne pouvez pas vous en sortir.

Mais même si vous pourriez, il vaut probablement mieux ne pas le faire. Etant donné qu'un courrier électronique unique est largement attendu, vous utiliserez peut-être des plug-ins qui comptent sur ce fait. WordPress lui-même s'appuie sur ce fait lorsque vous utilisez la fonctionnalité 'mot de passe oublié'.

Cela vous laisse deux options:

  • Créez un "faux" courrier électronique pour les comptes enfants (mais vous devez être sûr que le courrier électronique est faux, car le courrier électronique est faux - utilisez peut-être votre domaine?). De plus, vous devez vous assurer que les courriers électroniques associés à de tels comptes sont never used.
  • Abandonnez l'approche "utilisateur" et utilisez quelque chose comme un CPT. Mais cela reviendrait à réécrire un tas de codes, dont certains concerneraient la sécurité des utilisateurs (connexion, stockage des mots de passe, etc.). Ce n'est pas vraiment un choix sensé.

Malheureusement, WordPress n'est pas conçu pour la gestion de la relation utilisateur ...

4
Stephen Harris

J'ai constaté qu'il est en fait possible d'ajouter un utilisateur avec un nouveau nom d'utilisateur mais une adresse électronique existante si vous appelez le code suivant:

define('WP_IMPORTING',true);

Cette constante est vérifiée dans wp-includes/user.php dans le codex.

Je suppose que cela est défini lorsque WordPress exécute l'une de ses propres importations de données, afin de contourner les erreurs causées par les adresses électroniques en double.

J'espère que cela pourra aider!

1
Robert Peake

J'ai également étudié la question et essayé de trouver la meilleure solution pour une demande client.

Il existe plusieurs moyens pour y parvenir, tels que les courriels factices/factices et créer un champ de messagerie secondaire. Ce qui ne déclenchera pas l'exigence de messagerie unique de WP. Le nouveau champ peut simplement s'appeler "email2".

'email2' peut contenir toutes les informations souhaitées [limitées par la définition du champ MySQL]. Une fois créé, ajoutez le même courrier électronique aux deux comptes (ou plusieurs dans mon cas).

Ensuite, dans votre code, assurez-vous que les deux comptes sont mis en miroir pour les actions/déclencheurs/mises à jour, etc.

Par exemple, si le compte 1 a un message automatisé, et/ou une mise à jour de compte, etc ... Votre code pourrait faire référence à "mettre à jour tous les comptes où email2 = email2 du WP_user actuellement connecté".

C'est un contournement, mais devrait satisfaire la plupart des demandes des clients. Ils ne verront pas ce qui se passe dans le backend. Mais lorsqu'ils se connectent, ils doivent voir une vue "combinée" ou "en miroir" des deux comptes. Parce que, en substance, ils sont identiques aux exigences de messagerie et de nom d'utilisateur uniques de WP.

Vous pouvez même le faire avec des mots de passe. Vous ne pouvez pas "refléter" les mots de passe. Cependant, vous pouvez référencer et mettre à jour/définir le mot de passe de tous les comptes pour lesquels email2 = email2 de l'utilisateur actuellement connecté [mot_de_passe_wp].

De plus, il y a ce plugin WP [pas mon plugin FYI]:

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

Si quelqu'un d'autre a d'autres solutions, réfléchissons et trouvons les meilleures solutions. Y a-t-il de meilleures solutions? #StackExchangeIsCool

0
John Pedersen