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<< 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. 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. 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. 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: 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. 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. 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. 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. 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. 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. 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é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 (). 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: Dans wp-activate.php, vous devez faire quelque chose de similaire: 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. 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. 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. 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. 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. 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é. 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. nul. Ne renvoie rien. 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. 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 ...) 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 ...)) 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")); Si vous êtes dans __construct (). Surtout, __FILE__ doit «regarder» le fichier principal du plugin: Register_activation_hook (__ FILE__, array ($ this, "YOUR_METHOD_NAME")); 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"); 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. 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. 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. 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. 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. 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. 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. 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é. 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émentairesVérifier
Résultat
Fonctionnalité du thème: invasion du territoire du plugin
Introduction à la bibliothèque d'activation du plugin TGM
Configuration de l'activation du plug-in TGM
"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
Site principal du réseau
functions.php?
Digression lyrique
Ordre en fichiers
Adresse de la page d'inscription
Créer une page
wp-signup.php et wp-activate.php
Nous envoyons des lettres d'activation
Conclusion
Prime. Protection anti-spam
Comment ça fonctionne
Conditions d'utilisation
Une note sur la portée variable
Retour
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)
Exemples de
#1. Exécuter la fonction lorsque le plugin est activé
# 2. Exécuter une méthode de classe
# 3. Exécution d'une méthode de classe à partir d'un fichier séparé
# 4. Exécuter une méthode de classe à partir de la classe elle-même
# 5 Faites quelque chose juste après avoir activé le plugin
# 6 Une autre démonstration de l'utilisation de la fonction
Site principal du réseau
Alternative à functions.php
Ordre en fichiers
Page d'inscription
Rediriger vers la page d'inscription requise
Fonctionnalité wp-signup.php
Copiez la fonctionnalité de wp-signup.php