LA CLOCHE

Il y a ceux qui lisent cette actualité avant vous.
Abonnez-vous pour recevoir les derniers articles.
Email
Nom
Nom de famille
Comment voulez-vous lire The Bell
Pas de spam

Les liens à usage unique peuvent être utilisés dans diverses situations: pour fournir un accès temporaire à un fichier ou à une page, ou pour confirmer l'inscription. Dans ce didacticiel, nous allons vous montrer comment générer et intégrer des URL jetables.

Création d'URL

Supposons que nous ayons un système d'authentification des utilisateurs sur notre site. Après l'enregistrement, nous demandons à l'utilisateur de suivre la procédure de vérification des e-mails. Pour créer de tels liens, nous pouvons utiliser le paramètre de jeton spécial. Un exemple d'un tel lien:

Http: //example.com/activate? Token \u003d ee97780 ...

Nous ne pouvons pas nous passer d'une base de données ici, alors jetons un œil à la table avec laquelle nous allons travailler.

CREATE TABLE pending_users (token CHAR (40) NOT NULL, nom d'utilisateur VARCHAR (45) NOT NULL, tstamp INTEGER UNSIGNED NOT NULL, PRIMARY KEY (token));

Nous stockerons 3 champs dans le tableau: jeton, nom d'utilisateur et heure. Pour générer le jeton, nous utiliserons la fonction sha1 (), qui génère une chaîne de 40 caractères. Le champ tstamp stockera l'heure à laquelle le jeton a été généré afin que nous puissions suivre les liens expirés.

Il existe de nombreuses manières de générer un jeton, mais dans ce tutoriel, nous utiliserons les fonctions uniqid () et sha1 (). Quelle que soit la manière dont le jeton est généré, assurez-vous que les valeurs générées sont différentes et que la probabilité de doublons est minimale.

$ token \u003d sha1 (uniqid ($ username, true));

La fonction uniqid () prend une chaîne comme paramètre et génère un identifiant unique basé sur l'argument passé et l'heure actuelle. De plus, comme deuxième argument, cette fonction prend une valeur booléenne, qui signalera à uniqid d'ajouter des caractères supplémentaires pour augmenter la probabilité que la valeur soit unique. La fonction sha1 prend un identifiant unique et crée un hachage.

Une fois que ces deux fonctions fonctionnent, nous aurons un jeton unique que nous pouvons utiliser pour générer des adresses URL. Nous devons maintenant l'ajouter à la base de données:

$ query \u003d $ db-\u003e prepare ("INSERT INTO pending_users (username, token, tstamp) VALUES (?,?,?)"); $ query-\u003e execute (array ($ username, $ token, $ _SERVER ["REQUEST_TIME"]));

Afin que nous sachions quel utilisateur doit être activé, le nom d'utilisateur sera également enregistré dans le tableau. Dans un exemple plus adapté à un vrai site, vous pouvez utiliser un ID utilisateur.

Maintenant que nous avons toutes les informations dont nous avons besoin, nous pouvons créer une URL temporaire:

$ url \u003d "http://example.com/activate.php?token\u003d$token";

$ message \u003d<<

Vérifier

Nous avons maintenant besoin d'un script, grâce auquel nous effectuerons le contrôle. Tout ce que nous devons faire est de comparer le jeton de l'URL et le jeton de la base de données. S'il y en a un et que sa durée de vie n'a pas expiré, tout va bien.

// récupère le token if (isset ($ _ GET ["token"]) && preg_match ("/ ^ (40) $ / i", $ _GET ["token"])) ($ token \u003d $ _GET ["token"] ;) else (throw new Exception ("le token n'est pas valide.");) // vérifier le token $ query \u003d $ db-\u003e prepare ("SELECT username, tstamp FROM pending_users WHERE token \u003d?"); $ query-\u003e execute (array ($ token)); $ row \u003d $ query-\u003e fetch (PDO :: FETCH_ASSOC); $ query-\u003e closeCursor (); if ($ row) (extract ($ row);) else (throw new Exception ("the token is not valid.");) // active le compte utilisateur // ... // supprime le token de la base de données $ query \u003d $ db- \u003e prepare ("SUPPRIMER DES utilisateurs en attente WHERE nom d'utilisateur \u003d? AND token \u003d? AND tstamp \u003d?",); $ query-\u003e execute (array ($ username, $ token, $ tstamp));

Nous devons également prévoir la vérification des jetons dont la durée de vie a expiré:

// 1 jour en secondes \u003d 60 secondes * 60 minutes * 24 heures $ delta \u003d 86400; // vérifier si ($ _SERVER ["REQUEST_TIME"] - $ tstamp\u003e $ delta) (throw new Exception ("the token has expired.");) // activer le compte utilisateur // ...

Ainsi, nous aurons deux contrôles: l'un pour la validité du jeton, l'autre pour la durée de son existence.

Résultat

Cette méthode peut être utilisée non seulement pour activer des comptes d'utilisateurs, mais également pour d'autres besoins: par exemple, pour fournir un accès unique ou temporaire à une ressource ou un service.

En plus de tout cela, vous pouvez créer un script qui supprimera les jetons que vous n'avez jamais utilisés. Ce script peut être exécuté par vous-même de temps en temps ou vous pouvez utiliser cron pour cela.

Les thèmes ne sont généralement pas fonctionnels, mais parfois, nous, les développeurs, devons implémenter certaines fonctionnalités dans notre thème pour le rendre un peu meilleur et plus convivial.

Dans ce tutoriel, nous examinerons le terme territoire de plugins et apprendrons également à utiliser un outil fantastique écrit par Thomas Griffin: la bibliothèque d'activation de plugins TGM.

Fonctionnalité du thème: invasion du territoire du plugin

Les thèmes sont destinés à changer la conception d'un site Web WordPress. Idéalement, le sujet ne devrait toucher que l'aspect visuel. Cependant, à notre «âge d'or» de WordPress, les développeurs d'extensions incluent souvent des fonctionnalités dans leurs thèmes pour rester compétitifs sur le marché.

Il s'agit d'une invasion du territoire des plugins. Nous pouvons considérer le "territoire des plugins" comme un morceau de code fonctionnel. Tout morceau de code qui modifie la fonctionnalité de votre site doit être présenté comme un plugin, à moins que le code spécifié ne soit intégré dans le noyau WordPress.

J'ai déjà formulé plus tôt dans l'un de mes articles la règle d'or pour le territoire des plugins:

Si la fonctionnalité est liée à la présentation visuelle du site, elle doit être incluse dans le thème; s'il est lié à la fonctionnalité, il doit être présenté comme un plugin séparé.

Une règle assez simple. Les gens essaient toujours de coder des extraits fonctionnels dans leurs thèmes, mais les répertoires de thèmes (tels que WordPress.org ou ThemeForest) n'acceptent pas les thèmes qui envahissent le territoire des plugins. Offrir des fonctionnalités dans les thèmes est donc devenu un défi de taille.

Heureusement, il existe une solution simple qui ne va pas à l'encontre de la règle du territoire du plugin.

Introduction à la bibliothèque d'activation du plugin TGM

Configuration de l'activation du plug-in TGM

Notez la fonction tgmpa () avec deux paramètres à la toute fin du code. Le deuxième paramètre est la variable $ config, qui est également un tableau comme $ plugins. Comme son nom l'indique, vous pouvez personnaliser la bibliothèque d'activation du plugin TGM à l'aide de ce tableau. La variable accepte également son propre ensemble d'options:

  • id (string) - un identifiant unique pour la bibliothèque d'activation du plugin TGM dans votre thème. Ceci est très important: si d'autres plugins utilisent également l'activation de plugins TGM, différents ID éviteront d'éventuels conflits.
  • default_path (string) - Le chemin absolu par défaut des plugins dans votre thème. Lorsque vous l'installez, vous pouvez utiliser le nom du fichier zip comme valeur du paramètre source de votre plugin.
  • menu (string) - slug de menu pour la page d'installation du plugin.
  • has_notices (boolean) - s'il est défini sur true, des avis d'administration seront émis pour les plugins requis / recommandés.
  • ignifuge (booléen) - s'il est défini sur true, l'utilisateur peut "fermer" les notifications.
  • licenciement_msg (chaîne) - si l'option rejetable est définie sur false, ce message sera affiché au-dessus de la notification d'administration.
  • is_automatic (boolean) - s'il est défini sur true, les plugins seront activés après que l'utilisateur accepte de les installer.
  • message (chaîne) - HTML supplémentaire affiché avant la table des plugins.
  • strings (array) - un tableau qui inclut les messages à afficher. Vous pouvez les définir comme des chaînes traduites. Jetez un œil au fichier example.php pour une liste complète de tous les articles.
"mytheme-tgmpa", // votre ID TGMPA unique "default_path" \u003d\u003e get_stylesheet_directory (). "/ lib / plugins /", // chemin absolu par défaut "menu" \u003d\u003e "mytheme-install-required-plugins", // menu slug "has_notices" \u003d\u003e true, // Afficher les avis de l'administrateur "licenciable" \u003d\u003e false , // les avis ne sont PAS rejetables "licencier_msg" \u003d\u003e "J'ai vraiment, vraiment besoin que vous installiez ces plugins, d'accord?", // ce message sera affiché en haut de nag "is_automatic" \u003d\u003e true, // automatiquement activer les plugins après l'installation "message" \u003d\u003e "", // message à afficher juste avant la table des plugins" strings "\u003d\u003e array (); // Le tableau de chaînes de message utilisé par TGM Plugin Activation);?\u003e

Conclusion

Comme vous pouvez le voir, il est possible d'offrir des fonctionnalités dans les thèmes WordPress - il vous suffit de penser d'abord aux utilisateurs qui pourraient passer d'un thème à un autre. La bibliothèque d'activation de plug-in TGM offre un moyen vraiment intelligent de le faire.

Que pensez-vous de cet outil? L'avez-vous déjà utilisé, prévoyez-vous de l'utiliser à l'avenir? Partage tes pensées!

Nous créons notre propre page d'inscription pour le multisite au lieu du wp-signup.php standard.

Dans une installation WordPress typique, la page d'enregistrement (autorisation, réinitialisation du mot de passe) affiche le fichier wp-login.php.

  • /wp-login.php - autorisation
  • /wp-login.php?action\u003dregister - inscription
  • /wp-login.php?action\u003dlostpassword - réinitialiser le mot de passe

Il existe des conditions distinctes pour le multisite dans wp-login.php. Ainsi, lorsque vous cliquez sur le lien /wp-login.php?action\u003dregister sur un multisite, WordPress redirigera vers la page /wp-signup.php. Dans de nombreux thèmes, la page n'a pas l'air très attrayante, nous allons donc créer la nôtre.

Site principal du réseau

Par défaut, WordPress ouvre une page d'inscription (wp-signup.php) sur le domaine principal (site) du réseau. Cependant, vous pouvez créer une page d'inscription distincte pour chaque site du réseau, même s'ils ont des thèmes différents. Nous considérerons le cas où tous les sites du réseau ont leur propre page d'inscription, mais le même thème est utilisé et les sites ne diffèrent que par la langue. Si différents thèmes sont utilisés, plus de code devra être écrit.

functions.php?

Ne pas. Le nom de ce fichier semble être mentionné dans chaque article WordPress. Dans notre cas, étant donné que la fonctionnalité d'enregistrement est conçue pour plusieurs sites, il est logique de la déplacer dans les plugins MU qui sont chargés lorsque vous ouvrez un site.

Digression lyrique

Il convient de noter que les plugins MU sont chargés plus tôt que les plugins classiques et avant que le noyau WordPress ne soit complètement chargé, donc l'appel de certaines fonctions peut entraîner des erreurs fatales en PHP. Ce chargement "précoce" a également ses avantages. Par exemple, à l'intérieur d'un thème, vous ne pouvez pas vous accrocher à certaines actions qui sont déclenchées avant même que le fichier functions.php ne soit chargé à partir du thème. Un exemple de ceci est les actions du plugin Jetpack de la forme jetpack_module_loaded_related-posts (related-posts - le nom du module) avec lesquelles il est possible de suivre l'activité des modules dans Jetpack. Il est impossible de "s'accrocher" à cette action à partir du fichier de thème, car l'action a déjà fonctionné avant le chargement du thème - les plugins sont chargés avant les thèmes. Pour une image générale de l'ordre de chargement de WordPress, consultez la page de référence des actions dans le codex.

Ordre en fichiers

Les plugins MU peuvent contenir n'importe quel nombre de fichiers et toute structure qui vous semble logique. Je m'en tiens à quelque chose comme cette hiérarchie:

| -mu-plugins | - | -load.php | - | - | -selena-network | - | - | - | -signup | - | - | - | - | -plugin.php | - | - | - | - | -... | - | - | - | -jetpack | - | - | - | - | -plugin.php

Tous les "plugins" nécessaires à notre réseau sont connectés dans le fichier load.php:

// Charger les Traslates pour tous les addons load_muplugin_textdomain ("selena_network", "/ selena-network / languages \u200b\u200b/"); // L'inscription au réseau nécessite WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Un autre plug-in // nécessite WPMU_PLUGIN_DIR ...

Les dossiers de plugins sont stockés dans le dossier selena-network, chacun a son propre plugin.php, que nous incluons dans load.php. Cela vous donne la flexibilité et la possibilité d'éteindre et de rallumer rapidement les choses.

Adresse de la page d'inscription

Pour spécifier l'adresse de la page d'inscription, le filtre wp_signup_location est utilisé. Il se trouve dans le fichier wp-login.php et est responsable de la redirection vers wp-signup.php.

Cas "register": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php"))); exit;

Ajoutons notre fonction à mu-plugins / selena-network / signup / plugin.php, qui retournera l'adresse de la page d'inscription sur le site actuel:

Fonction selena_network_signup_page ($ url) (return home_url (). "/ Signup /";) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network est le préfixe que j'utilise dans les noms de toutes les fonctions des plugins MU de mon site pour éviter les collisions, il doit être remplacé par mon propre préfixe unique. Le filtre a une priorité de 99 car certains plugins comme bbPress et BuddyPress peuvent écraser cette URL par la leur (les plugins MU se chargent plus tôt que les plugins classiques, voir ci-dessus). Notez que home_url () est utilisé à la place de network_site_url () pour garder le visiteur sur le même domaine. N'importe quelle URL peut être utilisée comme adresse.

Créer une page

Créons maintenant une page avec l'adresse site.com/signup/ via l'interface standard, et dans le dossier du thème enfant, le modèle de notre nouvelle page est page-signup.php. Un identifiant unique peut être utilisé à la place du mot «inscription».

Dans le nouveau modèle, vous devez appeler la fonction selena_network_signup_main (), qui affichera le formulaire d'inscription.

Il est à noter que tout le processus avec les modèles n'est pas nécessaire et à la place vous pouvez créer votre propre shortcode, qui appellera également la fonction selena_network_signup_main ().

wp-signup.php et wp-activate.php

Commençons maintenant à créer une fonction qui affichera le formulaire d'inscription. Pour ce faire, copiez les fichiers wp-signup.php et wp-activate.php de la racine WordPress vers mu-plugings / selena-network / signup / (et n'oubliez pas de les connecter dans mu-plugins / selena-network / signup / plugin.php) ... D'autres manipulations avec des fichiers sont extrêmement difficiles et prennent du temps à décrire, vous devrez donc les faire vous-même. Je vais juste décrire ce qui doit être fait exactement et publier les fichiers sources de mon projet:

  1. Au début du fichier, supprimez tous les require, les appels de fonction et tout autre code en dehors des fonctions.
  2. Renommez toutes les fonctions en ajoutant des préfixes uniques aux noms.
  3. Enveloppez la partie inférieure du code wp-signup.php dans la fonction selena_network_signup_main et écrivez global $ active_signup au tout début; ...
  4. Remplacez la mise en page par la vôtre aux bons endroits.

Dans wp-activate.php, vous devez faire quelque chose de similaire:

  1. Supprimez tout le code en dehors des fonctions, enveloppez la mise en page dans une fonction distincte.
  2. Modifiez la mise en page à certains endroits si nécessaire.

Le fichier wp-activate.php est responsable de la page d'activation du compte. Comme pour la page d'inscription, vous devez créer un modèle distinct pour celle-ci, dans lequel vous appelez la fonction à partir du fichier wp-activate.php.

Nous envoyons des lettres d'activation

La page d'inscription envoie au visiteur un e-mail avec un lien pour activer son compte. Par défaut, cela est fait par la fonction wpmu_signup_user_notification () du fichier ms-functions.php. Sa fonctionnalité peut être empruntée pour votre fonction. La raison pour laquelle vous arrêtez d'utiliser cette fonctionnalité est qu'elle envoie le lien d'activation du compte à partir de wp-activate.php. Vous pouvez "désactiver" cette fonction en utilisant le filtre wpmu_signup_user_notification, en le donnant false (si vous ne le faites pas, la lettre d'activation sera envoyée deux fois, d'accord, en fait, deux lettres différentes).

Fonction armyofselenagomez_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta \u003d array ()) (// ... // Code de la fonction wpmu_signup_user_notification () wp_mail ($ user_email, wp_specialchars_decode ($ message_headers), $ message_headers) ; return false;) add_filter ("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

En conséquence, la page d'inscription dans le thème Selena semble beaucoup plus propre et plus précise.

Conclusion

Il existe de nombreuses autres façons pas très correctes de faire la même chose sur Internet - les redirections Apache, les formulaires AJAX qui ne fonctionneront pas sans Java Script, etc. Je n'ai pas vraiment aimé tout cela, alors j'ai essayé de le faire aussi correctement que possible sur mon propre site Web.

Notez que vous devez éditer les fichiers avec soin et essayer de ne pas trop s'écarter de l'original, de sorte qu'à l'avenir, si WordPress modifie les fichiers wp-signup.php et wp-activate.php, il serait plus facile de les comparer pour trouver des changements.

N'oubliez pas de regarder dans le code source de toutes les fonctions décrites ci-dessus pour bien comprendre ce qui se passe et comment se passe à l'intérieur du code.

Prime. Protection anti-spam

Même les plus petits sites WordPress sont sujets à de fréquentes inscriptions de spam. Vous pouvez écrire des conditions infinies pour filtrer les bots, souvent plus comme essayer de créer une intelligence artificielle 🙂 Dans le cas d'un multisite, la redirection habituelle dans Apache m'a beaucoup aidé, avec laquelle, lors de l'ouverture de /wp-signup.php et /wp-acitvate.php, j'ai demandé d'émettre 404 (Je ne suis pas un expert en configuration Apache, donc mes règles peuvent ne pas être très correctes).

RewriteEngine On RewriteBase / RewriteRule ^ wp-signup \\ .php - RewriteRule ^ wp-activate \\ .php - # BEGIN WordPress # Ne touchez pas aux règles WordPress par défaut :) # ... # END WordPress

P. S. J'essaie de décrire avec le plus de détails possible certaines choses tierces, parce que quand j'ai commencé, parfois il n'y avait personne pour inciter et expliquer beaucoup de choses. Je crois également que ces petits conseils sur d'autres matériaux pousseront quelqu'un à apprendre quelque chose de nouveau et à élargir son champ de connaissances. Les expressions régulières sont utilisées dans les entrées RewriteRule, elles ne sont pas du tout complexes, par exemple, le caractère ^ signifie le début d'une ligne.

Enregistre une fonction à déclencher lorsque le plugin est activé.

Cette fonction attache la fonction de rappel spécifiée au hook activate_ (plugin) et est un wrapper autour de ce hook.

(plugin) dans le hook activate_ (plugin) est remplacé par le nom du plugin relatif au fichier principal du plugin. Par exemple, si le plugin se trouve: wp-content / plugins / sampleplugin / sample.php, alors le nom du hook sera: activate_sampleplugin / sample.php.

Depuis la version 3.1. Le hook se déclenche uniquement lorsque le plugin est activé et ne se déclenche pas lorsque le plugin est automatiquement mis à jour.

Comment ça fonctionne

Le plugin est activé par la fonction activate_plugin (), dans laquelle le hook activate_ (plugin) est déclenché.

La fonction activate_plugin () dans le noyau est appelée après le chargement de l'environnement VI. Cette fonction connecte le fichier principal du plugin (et tout ce qui y est spécifié), puis active la fonction de rappel spécifiée via un hook. Pour cette raison, toutes les fonctions et classes du plugin sont disponibles dans notre fonction de rappel. Mais, puisque tous les hooks WP principaux ont déjà été déclenchés lorsque l'environnement VI est chargé, aucun événement de plugin suspendu aux hooks, par exemple plugins_loaded, ne se déclenchera plus lorsque le fichier de plugin principal sera connecté. Cela signifie que notre plugin sera connecté, mais pas complètement: pas comme il devrait être connecté quand il est déjà activé.

Ainsi, par exemple, si un plugin fait quelque chose pendant l'événement plugins_loaded, alors toutes ces actions ne se produiront tout simplement pas lorsque le plugin est activé. Par exemple, s'il connecte un fichier de traduction, alors le fichier de traduction ne sera pas connecté lorsque la fonction de rappel spécifiée pour register_activation_hook () est déclenchée.

En règle générale, après le déclenchement de la fonction de rappel, il y a 2 événements sur lesquels les fonctions peuvent être suspendues: enabled_plugin et shutdown.

Pour faire quelque chose d'extraordinaire lors de l'activation d'un plugin, voir l'exemple 5.

Conditions d'utilisation

La fonction ne fonctionnera pas si vous l'appelez au moment où un hook est déclenché, par exemple plugins_loaded, init. La fonction doit être appelée directement depuis le fichier principal du plugin. Règles d'activation:

    register_activation_hook () doit être appelé depuis le fichier principal du plugin où se trouve la directive Plugin Name: ... et ne doit pas être appelé depuis un hook comme plugins_loaded ou init.

    La fonction hook doit être dans le même fichier que le hook ou être incluse à l'avance à partir d'un autre fichier.

    Dans la fonction hook, la sortie à l'écran (écho) ne fonctionne pas. Parce qu'il y a une redirection et que vous ne verrez pas d'écho. Mais die () peut être utilisé.

  1. Les variables globales (le cas échéant) doivent être définies explicitement pour être accessibles à partir de la fonction hook.

Une note sur la portée variable

Lorsqu'un plugin est activé, le fichier principal du plugin n'est pas inclus dans la portée globale, mais dans la fonction activate_plugin (). Par conséquent, les variables considérées comme globales dans le fonctionnement normal du plugin ne seront pas globales.

Par exemple, la fonction qui est utilisée dans register_activation_hook () peut ne pas voir les variables globales, même si vous les avez déclarées comme globales dans cette fonction. Exemple:

$ myvar \u003d "quelque chose"; register_activation_hook (__ FILE__, "myplugin_activate"); function myplugin_activate () (global $ myvar; echo $ myvar; // La variable n'est pas égale à "quelque chose")

En raison de cette fonctionnalité, les variables globales doivent toujours être spécifiées explicitement. Toutes les variables globales doivent être définies comme globales, même si la variable est spécifiée dans le corps du plugin. Seulement dans ce cas, il y aura accès n'importe où. Exemple:

Global $ myvar; // indique explicitement qu'il s'agit d'une variable globale $ myvar \u003d "quelque chose"; register_activation_hook (__ FILE__, "myplugin_activate"); function myplugin_activate () (global $ myvar; echo $ myvar; //\u003e quelque chose)

Il n'y a pas de crochets.

Retour

nul. Ne renvoie rien.

En utilisant

register_activation_hook ($ fichier, $ fonction); $ fichier (chaîne) (obligatoire) Le chemin vers le fichier php principal du plugin, y compris le nom du plugin lui-même. Habituellement, la constante magique PHP __FILE__ est utilisée. $ fonction (string / array / lambda) (obligatoire)

Le nom de la fonction de rappel. Pour les classes, utilisez un tableau: array ($ this, "function_name"); ...

La fonction recevra une variable booléenne $ network_wide - si le plugin est activé pour tout le réseau de sites lorsqu'il est multisite.

Exemples de

#1. Exécuter la fonction lorsque le plugin est activé

Supposons que nous ayons une fonction my_plugin_activate () dans le fichier principal du plugin: wp-content / plugins / myplugin / myplugin.php, puis pour exécuter cette fonction lors de l'activation du plugin, utilisez le code suivant:

Register_activation_hook (__ FILE__, "my_plugin_activate"); function my_plugin_activate () (// Code d'activation ...)

# 2. Exécuter une méthode de classe

Si le plugin utilise une classe PHP, le code d'activation est ajouté comme ceci:

Register_activation_hook (__ FILE__, array ("My_Plugin", "install")); class My_Plugin (fonction statique install () (// Ne créez aucune sortie ici ...))

# 3. Exécution d'une méthode de classe à partir d'un fichier séparé

Si la classe qui contient la fonction d'activation se trouve dans un fichier séparé, enregistrez la fonction d'activation comme ceci:

Inclure_une __DIR__. "/class-My_Plugin.php"; register_activation_hook (__ FILE__, array ("My_Plugin", "on_activate_function"));

# 4. Exécuter une méthode de classe à partir de la classe elle-même

Si vous êtes dans __construct (). Surtout, __FILE__ doit «regarder» le fichier principal du plugin:

Register_activation_hook (__ FILE__, array ($ this, "YOUR_METHOD_NAME"));

# 5 Faites quelque chose juste après avoir activé le plugin

Après l'activation du plugin, seuls deux hooks sont déclenchés: enabled_plugin et shutdown.

Lorsque vous avez besoin de faire quelque chose immédiatement après l'activation d'un plugin, vous pouvez leur attacher une fonction.

Lorsqu'une telle solution ne fonctionne pas, vous pouvez utiliser les options WP: enregistrer les données dans une option, puis vérifier l'option, et faire quelque chose si l'option est:

// Fichier principal du plugin. ... function my_plugin_activate () (// ajouter une option pour que plus tard s'il y en a une pour faire quelque chose. add_option ("Activated_Plugin", "Plugin-Slug"); // Voici le code d'activation ...) register_activation_hook (__ FILE__, " mon_plugin_activate "); function load_plugin () (if (is_admin () && get_option ("Activated_Plugin") \u003d\u003d "Plugin-Slug") (// supprimez l'option ajoutée pour qu'elle ne fonctionne plus // et faites ce dont nous avons besoin ... delete_option ("Activated_Plugin "); // Faites quelque chose une fois, après avoir activé le plugin // Par exemple: add_action (" init "," my_init_function ");)) add_action (" admin_init "," load_plugin ");

Une autre option pour faire quelque chose lors de l'activation du plugin est de créer votre événement comme ceci:

Function my_plugin_activate () (// Installer notre propre hook pour pouvoir y attacher à partir des fichiers du plugin lui-même do_action ("my_plugin_activate");) register_activation_hook (__ FILE__, "my_plugin_activate");

# 6 Une autre démonstration de l'utilisation de la fonction

Un petit plugin montrant comment utiliser la fonction:

/ * Nom du plugin: Un test Description: Un test * / require_once dirname (__ FILE__). "/mon_autre_fichier.php"; / * Ce code ne fonctionnera pas. Le hook d'activation doit être appelé à partir du fichier principal. register_activation_hook (dirname (__ FILE__). "/my_other_file.php", "my_other_function"); * / // Ceci est un code fonctionnel. register_activation_hook (__ FILE__, "test_activated"); / * C'est la manière correcte de déclarer et d'accéder aux variables globales. Les variables globales doivent être clairement déclarées. Sans cela, vous n'y aurez pas accès. * / global $ une_var; $ some_var \u003d "hey"; // Fonction d'activation de la fonction test_activated () (// ici $ some_var ne sera pas égal hey global $ some_var; // Et ici $ some_var sera égal à hey // Cette fonction est définie dans le fichier "my_other_file.php" my_other_function (); / * This cela ne fonctionnera pas. Si vous devez écrire les journaux dans un fichier temporaire, utilisez fopen / fwrite. Si vous voulez tester si le hook d'activation fonctionne, utilisez exit () dans la fonction hook. * / echo "test_activated called!";)

Vous permet d'utiliser une seule installation WordPress pour plusieurs sites en même temps. De plus, chaque site reçoit ses propres tables dans la base de données avec un préfixe unique.

Les tableaux contenant les données des utilisateurs enregistrés sont communs à tous les sites du réseau. C'est un plus indéniable et en vous inscrivant une fois, vous pouvez accéder à plusieurs sites. De plus, sur chaque site, le même compte peut avoir des droits différents. Par exemple, sur un site, un utilisateur peut être un éditeur, et sur un autre, un administrateur.

Dans une installation WordPress typique, la page d'enregistrement, de connexion et de réinitialisation du mot de passe affiche le fichier wp-login.php.

  • wp-login.php - autorisation
  • wp-login.php? action \u003d register - inscription
  • wp-login.php? action \u003d mot de passe perdu - réinitialisation du mot de passe

En mode multisite, le cœur de WordPress commence à se comporter un peu différemment et lorsque vous cliquez sur le lien wp-login.php? Action \u003d register, une redirection vers wp-signup.php se produit. Il s'agit de la page d'enregistrement de votre réseau, qui est le site WordPress par défaut.

En plus d'enregistrer des comptes d'utilisateurs réguliers, vous pouvez créer un nouveau site Web sur celui-ci, si le super-administrateur a activé cette fonction dans les paramètres réseau (Administrateur réseau → Paramètres → Paramètres réseau).

Dans la plupart des thèmes, la page d'inscription n'a pas l'air bien. De nombreux skins utilisent des frameworks CSS comme Bootstrap et leurs propres classes spécifiques pour styliser différents éléments sur les pages, il est donc difficile d'écrire un seul HTML qui fonctionne pour tout le monde.

Mais ne désespérez pas si la page semble désordonnée. Le fichier wp-signup.php est excellent au début, lorsque vous n'avez pas le temps de parcourir chaque détail du site - vous pouvez vous concentrer sur d'autres pages et contenus plus importants.

Lorsque vous êtes prêt à créer votre propre page d'inscription, wp-signup.php sera un bon exemple et un bon exemple pour vous aider à comprendre la gamme de fonctions que WordPress fournit pour gérer et valider les entrées des utilisateurs et créer de nouveaux comptes.

Site principal du réseau

Par défaut, WordPress ouvre une page d'inscription (wp-signup.php) sur le domaine principal (site) du réseau. Cependant, vous pouvez créer des pages d'inscription pour chaque site du réseau, même s'ils ont des thèmes.

Nous considérerons le cas où tous les sites du réseau utilisent le même thème, mais chacun d'eux dispose d'une page d'inscription. Les sites diffèrent par la langue (anglais et russe), de sorte que la page d'inscription sera affichée dans la langue "native" du site. Si les sites utilisent des thèmes différents, tout dépendra du type de thèmes qu'ils sont, si la même mise en page leur convient (une excellente situation qui peut vous pousser à unifier tous vos thèmes) ou s'il vaut la peine de travailler les pages individuellement.

Alternative à functions.php

Ordre en fichiers

Les plugins MU peuvent contenir n'importe quel nombre de fichiers et de structures qui vous semblent logiques. Je m'en tiens à quelque chose comme cette hiérarchie:

| mu-plugins | | load.php | | réseau selena | | | inscription | | | | plugin.php | | | ... | | | jetpack | | | | plugin.php

Le fichier load.php comprend les traductions et tous les "plugins" nécessaires:

// Charger les traductions pour les plugins MU load_muplugin_textdomain ("selena_network", "/ selena-network / languages \u200b\u200b/"); // Fonctionnel pour la page d'inscription nécessite WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Un autre plugin // nécessite WPMU_PLUGIN_DIR ...

Les dossiers de plugins sont stockés dans le répertoire selena-network. Chacun a son propre plugin.php, que nous incluons dans load.php. Cela donne la flexibilité et la capacité de désactiver et d'activer instantanément des composants individuels dans un projet de travail en cas d'urgence.

Page d'inscription

Après avoir déterminé où et comment nous allons écrire le code, nous pouvons procéder à la création de la page d'inscription.

Créons une page avec l'adresse example.org/signup/ via une interface classique. En tant qu'adresse, vous pouvez utiliser n'importe quelle URL qui vous semble adaptée à votre projet.

Rediriger vers la page d'inscription requise

Pour que WordPress connaisse notre nouvelle page d'inscription et s'y redirige, en cliquant sur le lien «S'inscrire», le filtre wp_signup_location est utilisé. Il se trouve dans wp-login.php et est responsable de la redirection vers wp-signup.php par défaut.

Cas "register": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php"))); exit; // ...

Comme vous vous en souvenez, par défaut, la page d'inscription s'ouvre sur le domaine principal du réseau. C'est pourquoi network_site_url () est utilisé ici.

Ajoutons notre gestionnaire au filtre dans mu-plugins / selena-network / signup / plugin.php, qui retournera l'adresse de la page d'inscription sur le site actuel:

Fonction selena_network_signup_page ($ url) (return home_url ("signup");) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network est le préfixe que j'utilise dans les noms de toutes les fonctions des plugins MU de mon site pour éviter les collisions, il doit être remplacé par mon propre préfixe unique. Le filtre a une priorité de 99 car certains plugins comme bbPress et BuddyPress peuvent écraser cette URL par la leur (les plugins MU se chargent plus tôt que les plugins classiques, voir ci-dessus).

Notez que home_url () est utilisé, qui, contrairement à network_site_url (), retourne l'adresse du site actuel, et non le site principal du réseau.

Fonctionnalité wp-signup.php

Le fichier wp-signup.php contient beaucoup de fonctions et de code. Pour avoir une vue d'ensemble, vous pouvez utiliser le pliage de code. Ceci est généralement appelé "pliage de code" en anglais.

Au tout début du fichier de 1 à 80 lignes (en version 4.1.1), divers contrôles et sorties du "début" de la page sont effectués à l'aide de get_header ().

Ensuite, de nombreuses méthodes sont déclarées et avant de commencer à travailler avec elles, il vaut la peine de comprendre ce que fait chaque fonction. Beaucoup d'entre eux utilisent souvent d'autres fonctions avec le préfixe wpmu_ à l'intérieur, qui sont toutes déclarées dans le fichier wp-includes / ms-functions.php. Cette section est difficile à comprendre sans voir le code vous-même. Vous trouverez ci-dessous une brève description des principales fonctions en cas de problème.

  • wpmu_signup_stylesheet () - Sortie CSS supplémentaire sur la page d'inscription.
  • show_blog_form () - champs pour l'enregistrement du site (adresse, nom, visibilité pour les moteurs de recherche).
  • validate_blog_form () - validez l'adresse et le nom du site saisis en utilisant wpmu_validate_blog_signup ().
  • show_user_form () - champs pour l'enregistrement de l'utilisateur (login et adresse e-mail).
  • validate_user_form () - validation du login et de l'adresse e-mail saisis. mail en utilisant wpmu_validate_user_signup ().
  • signup_another_blog () - champs pour enregistrer de nouveaux sites en utilisant show_blog_form () pour les utilisateurs déjà enregistrés sur le site.
  • validate_another_blog_signup () - valide l'url et le titre du site en utilisant validate_blog_form ().
  • signup_user () est la fonction principale d'affichage des champs de la page d'inscription.
  • validate_user_signup () - valide le nom d'utilisateur et l'adresse e-mail. mail en utilisant validate_user_form ().
  • signup_blog () - champs pour saisir l'adresse, le nom et la visibilité du site (la deuxième étape de l'enregistrement) en utilisant show_blog_form ().
  • validate_blog_signup () - valide la connexion, l'adresse e-mail. mail, adresse et nom du site.

Tout en bas du fichier wp-signup.php (à partir de la ligne 646 de la version 4.1.1), la logique principale de la page d'inscription, qui utilise toutes les méthodes décrites ci-dessus. Cette partie du code n'est pas incluse dans la fonction. Enfin, get_footer () est appelé.

Copiez la fonctionnalité de wp-signup.php

Ensuite, nous décrirons la procédure pour copier wp-signup.php dans les plugins MU et apporter des modifications au "fork". Peut-être que cela ne semble pas être la bonne manière. Au lieu de cela, vous pouvez écrire votre propre validation de formulaire et afficher des fonctions à partir de zéro en utilisant des classes plutôt que des fonctions normales. A mon avis, wp-signup.php a déjà toute la logique nécessaire à notre page, il ne reste plus qu'à faire de petits changements.

Lorsque vous mettez à jour WordPress, wp-signup.php change de temps en temps, mais cela ne signifie pas que vous devrez synchroniser votre fork avec chaque version. Les fonctions à l'intérieur de wp-signup.php sont essentiellement engagées uniquement dans la sortie HTML, la validation des données, la création de comptes et de sites, les méthodes avec le préfixe wpmu_, déclarées dans ms-functions.php, sont impliquées.

Commençons par créer une fonction qui affichera le formulaire d'inscription sur la page. Pour ce faire, copiez wp-signup.php de la racine WordPress vers mu-plugings / selena-network / signup /. Connectons-le dans mu-plugins / selena-network / signup / plugin.php).

Requiert WPMU_PLUGIN_DIR. "/selena-network/signup/wp-signup.php";

Supprimez toutes les vérifications nécessaires et inutiles dès le début du fichier copié. En version 4.1.1, c'est tout le code de 1 à 80 lignes.

Nous sommes maintenant prêts à créer la fonction principale pour afficher le formulaire d'inscription. Pour ce faire, déplacez toute la logique de la ligne 646 à la toute fin du fichier dans une fonction appelée selena_network_signup_main. À la toute fin, nous supprimerons les deux fermetures supplémentaires

(lignes 722 et 723), ainsi qu'un appel à get_footer ().

Dans le selena_network_signup_main () nouvellement créé, au tout début, nous déclarons la variable globale active_signup, qui est utilisée par toutes les autres méthodes de ce fichier. Et ajoutons un appel à l'événement before_signup_form, que nous avons supprimé depuis le tout début du fichier.

Fonction selena_network_signup_main () (global $ active_signup; do_action ("before_signup_form"); // ...)

Il ne reste plus qu'à changer la mise en page dans tous les endroits où cela est nécessaire et la page d'inscription est prête.

Sortie du formulaire d'inscription

Il y a au moins deux options ici. Un moyen plus pratique consiste à créer un shortcode et à le placer sur la page à l'aide d'un éditeur standard.

// Créer un shortcode network_signup add_shortcode ("network_signup", "selena_network_signup_main");

La deuxième option consiste à créer un modèle de page page-signup.php dans le dossier du thème enfant. Au lieu du mot «inscription», vous pouvez utiliser un identifiant unique attribué à la page. À l'intérieur du modèle, ajoutez la disposition requise et appelez selena_network_signup_main () au bon endroit.

En conséquence, ma page d'inscription est bien meilleure et plus propre.

Page d'activation

Par défaut, WordPress divise classiquement le processus d'inscription dans Multisite en deux étapes: remplir un formulaire sur le site et activer un compte en cliquant sur le lien envoyé dans un e-mail. Après avoir rempli le formulaire créé dans la section précédente, WordPress envoie un email avec une petite instruction et un lien pour activer votre compte.

Le fichier wp-activate.php situé dans le répertoire racine de WordPress est responsable de l'affichage de la page d'activation. wp-activate.php peut également être complètement modifié. Le processus est similaire à ce que nous avons déjà fait pour wp-signup.php.

Créons une page example.org/activate/ via une interface classique. Utilisez l'URL que vous trouvez adaptée à l'adresse.

Copiez le fichier wp-activate.php dans vos plugins MU et connectez-le à mu-plugins / selena-network / signup / plugin.php.

Requiert WPMU_PLUGIN_DIR. "/selena-network/signup/wp-activate.php";

Il n'y a pas beaucoup de contenu à l'intérieur, contrairement à wp-signup.php. Le fichier n'effectue qu'une seule opération - il active le compte si la clé correcte est reçue et affiche un message d'erreur ou la réussite de l'opération.

Supprimons toutes les vérifications inutiles et exigeons - de 1 à 69 lignes dans WordPress 4.1.1. À la toute fin, supprimons l'appel get_footer (). Déplacez le reste du contenu dans la fonction selena_network_activate_main ().

Il est intéressant de noter que la constante WP_INSTALLING a été déclarée ici avant le chargement de WordPress (wp-load.php). Sa présence empêche WordPress de charger les plugins.

Comme dans le cas de la page d'inscription, il ne reste plus qu'à corriger la mise en page si nécessaire. Vous pouvez également modifier le texte des messages affichés (dans ce cas, n'oubliez pas d'ajouter le domaine texte de vos plugins MU à toutes les fonctions de traduction, par défaut il n'est installé nulle part).

La fonction prête à l'emploi peut être utilisée sur une page pré-créée via un shortcode ou un modèle séparé dans un thème enfant.

E-mails d'activation avec des liens corrects

La page d'activation est prête à fonctionner, mais WordPress ne le sait pas et enverra toujours des e-mails d'activation avec un lien vers wp-activate.php. Contrairement à wp-signup.php, il n'y a pas de filtre pour changer l'adresse. Au lieu de cela, vous devez écrire votre propre fonction qui enverra des e-mails avec les bons liens.

Au moment de remplir et de soumettre le formulaire sur la page d'inscription, WordPress appelle wpmu_signup_ utilisateur() ou wpmu_signup_ blog() selon le type d'enregistrement. Les deux fonctions créent un nouvel enregistrement dans la table wp_signups, en le remplissant du contenu nécessaire, y compris la clé d'activation du compte.

Ensuite, selon la fonction, wpmu_signup_ est appelé utilisateur_notification () ou wpmu_signup_ blog_notification (). Les deux fonctions ont des fonctionnalités similaires - elles génèrent et envoient un e-mail avec un lien d'activation, mais acceptent des arguments différents. Les deux ont des filtres pour "intercepter" l'événement.

If (! Apply_filters ("wpmu_signup_user_notification", $ user, $ user_email, $ key, $ meta)) return false;

Pour activer des comptes avec la création d'un blog:

If (! Apply_filters ("wpmu_signup_blog_notification", $ domain, $ path, $ title, $ user, $ user_email, $ key, $ meta)) (return false;)

Il ne reste plus qu'à écrire vos propres gestionnaires, à l'intérieur desquels envoyer des e-mails via wp_mail (), et à la toute fin, assurez-vous de donner false pour que WordPress n'envoie pas deux fois un e-mail d'activation - l'un est le vôtre, l'autre est un e-mail par défaut avec un lien vers wp-activate.php.

Fonction selena_network_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta \u003d array ()) (// Générer l'en-tête, le texte et les en-têtes de l'e-mail // ... // Envoyer l'e-mail ou ajouter une tâche Cron pour envoyer l'e-mail wp_mail ($ user_email , wp_specialchars_decode ($ subject), $ message, $ message_headers); // Envoyer false pour empêcher WordPress d'envoyer deux fois l'e-mail d'activation return false;) add_filter ("wpmu_signup_user_notification", "selena_network_wpmu_signup_user_notification", 10, 4);

Si vous envoyez des e-mails via un serveur SMTP ou si le nombre d'inscriptions est très élevé, vous devriez envisager de ne pas envoyer d'e-mails instantanément. Au lieu de cela, vous pouvez ajouter des tâches Cron à l'aide de WordPress Cron.

Fermer l'accès à wp-signup.php et wp-activate.php

Après avoir créé vos propres pages d'enregistrement et d'activation, vous devrez peut-être fermer les "originaux". Par exemple, si la page d'inscription contient des champs supplémentaires qui doivent être remplis. De plus, de nombreux sites WordPress sont soumis à des inscriptions de spam.

Pour résoudre deux problèmes en une seule étape, vous pouvez demander à Apache de renvoyer 404 si vous essayez d'ouvrir ces pages. Pour ce faire, il vous suffit d'enregistrer quelques RewriteRule supplémentaires dans votre fichier de configuration ou .htaccess.

RewriteEngine On RewriteBase / # Connaître les expressions régulières ne sera jamais superflu :) RewriteRule ^ wp-signup \\ .php - RewriteRule ^ wp-activate \\ .php - # BEGIN WordPress # Ne touchez pas aux règles WordPress par défaut :) # ... # FIN WordPress

Conclusion

Il existe de nombreuses solutions à ce problème et à bien d'autres "problèmes" liés à WordPress sur Internet. Par exemple, pour créer des pages d'enregistrement et d'activation, certains suggèrent de réécrire les fichiers wp-signup.php et wp-activate.php d'origine. Cela ne vaut pas la peine de le faire, car si vous mettez à jour WordPress, vous perdrez toutes les modifications apportées aux fichiers et vous ne pourrez pas non plus vérifier l'intégrité du noyau avec.

Lors du développement d'un module complémentaire, d'un thème ou d'une solution, vous devriez passer un peu de temps à vous familiariser avec ce qui se passe dans WordPress. Il existe de nombreux outils de débogage utiles pour cela.

P.S.

Pour attribuer automatiquement différents rôles aux nouveaux utilisateurs, vous pouvez utiliser le plugin Multisite User Management.

Si vous avez des questions ou des difficultés lors de la création des pages d'inscription et d'activation après avoir lu l'article, laissez un commentaire et nous vous répondrons certainement.

27.03.2015 27.03.2015

Développeur WordPress. Aime l'ordre dans tout et comprend les nouveaux outils. Inspiré de l'architecture des composants Symfony.

  • LA CLOCHE

    Il y a ceux qui lisent cette actualité avant vous.
    Abonnez-vous pour recevoir les derniers articles.
    Email
    Nom
    Nom de famille
    Comment voulez-vous lire The Bell
    Pas de spam