LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere The Bell
Niente spam

I collegamenti occasionali possono essere utilizzati in una varietà di situazioni: per fornire un accesso temporaneo a un file o una pagina o per confermare la registrazione. In questo tutorial, ti mostreremo come generare e incorporare URL usa e getta.

Creazione di URL

Supponiamo di avere un sistema di autenticazione utente sul nostro sito. Dopo la registrazione, chiediamo all'utente di eseguire la procedura di verifica tramite posta elettronica. Per creare tali collegamenti, possiamo utilizzare il parametro token speciale. Un esempio di tale collegamento:

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

Non possiamo fare a meno di un database qui, quindi diamo un'occhiata alla tabella con cui lavoreremo.

CREATE TABLE pending_users (token CHAR (40) NOT NULL, username VARCHAR (45) NOT NULL, tstamp INTEGER UNSIGNED NOT NULL, PRIMARY KEY (token));

Memorizzeremo 3 campi nella tabella: token, nome utente e ora. Per generare il token, useremo la funzione sha1 (), che restituisce una stringa di 40 caratteri. Il campo tstamp memorizzerà l'ora in cui il token è stato generato in modo da poter tenere traccia dei collegamenti scaduti.

Ci sono molti modi per generare un token, ma in questo tutorial useremo le funzioni uniqid () e sha1 (). Indipendentemente dal modo in cui viene generato il token, assicurati che i valori generati siano diversi e che la probabilità di duplicati sia minima.

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

La funzione uniqid () accetta una stringa come parametro e restituisce un identificatore univoco basato sull'argomento passato e l'ora corrente. Inoltre, come secondo argomento, questa funzione accetta un valore booleano, che segnalerà a uniqid di aggiungere alcuni caratteri extra per aumentare la probabilità che il valore sia unico. La funzione sha1 accetta un identificatore univoco e crea un hash.

Dopo che queste due funzioni avranno funzionato, avremo un token univoco che possiamo utilizzare per generare indirizzi URL. Ora dobbiamo aggiungerlo al database:

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

Per farci sapere quale utente deve essere attivato, nella tabella verrà registrato anche il nome utente. In un esempio più su misura per un sito reale, puoi utilizzare un ID utente.

Ora che abbiamo tutte le informazioni di cui abbiamo bisogno, possiamo creare un URL temporaneo:

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

$ messaggio \u003d<<

Dai un'occhiata

Ora abbiamo bisogno di uno script, grazie al quale effettueremo il controllo. Tutto quello che dobbiamo fare è confrontare il token dall'URL e il token dal database. Se ce n'è uno e la sua vita non è scaduta, allora va tutto bene.

// ottieni il token if (isset ($ _ GET ["token"]) && preg_match ("/ ^ (40) $ / i", $ _GET ["token"])) ($ token \u003d $ _GET ["token"] ;) else (lancia una nuova eccezione ("il token non è valido.");) // controlla il token $ query \u003d $ db-\u003e prepare ("SELECT username, tstamp FROM pending_users WHERE token \u003d?"); $ query-\u003e execute (array ($ token)); $ riga \u003d $ query-\u003e fetch (PDO :: FETCH_ASSOC); $ query-\u003e closeCursor (); if ($ riga) (extract ($ riga);) else (lancia una nuova eccezione ("il token non è valido.");) // attiva l'account utente // ... // rimuove il token dal database $ query \u003d $ db- \u003e prepare ("DELETE FROM pending_users WHERE username \u003d? AND token \u003d? AND tstamp \u003d?",); $ query-\u003e execute (array ($ username, $ token, $ tstamp));

Dobbiamo inoltre provvedere alla verifica dei token la cui durata è scaduta:

// 1 giorno in secondi \u003d 60 secondi * 60 minuti * 24 ore $ delta \u003d 86400; // controlla se ($ _SERVER ["REQUEST_TIME"] - $ tstamp\u003e $ delta) (lancia una nuova eccezione ("il token è scaduto.");) // attiva l'account utente // ...

Quindi, avremo due controlli: uno per la validità del token, l'altro per la durata della sua esistenza.

Risultato

Questo metodo può essere utilizzato non solo per attivare gli account utente, ma anche per altre esigenze: ad esempio, per fornire un accesso una tantum o temporaneo ad alcune risorse o servizi.

Inoltre, puoi creare uno script che rimuoverà i token che non hai mai usato. Questo script può essere eseguito da solo di tanto in tanto o puoi usare cron per questo.

I temi di solito non sono funzionali, ma a volte noi sviluppatori abbiamo bisogno di implementare alcune funzionalità nel nostro tema per renderlo un po 'migliore e più facile da usare.

In questo tutorial esploreremo il termine "territorio dei plugin" e impareremo anche come utilizzare un fantastico strumento scritto da Thomas Griffin: la libreria di attivazione dei plugin TGM.

Funzionalità del tema: invasione del territorio dei plugin

I temi hanno lo scopo di cambiare il design di un sito Web WordPress. Idealmente, l'argomento dovrebbe toccare solo l'aspetto visivo. Tuttavia, nella nostra epoca d'oro di WordPress, gli sviluppatori di plugin spesso includono funzionalità nei loro temi per mantenerli competitivi sul mercato.

Questa è un'invasione del territorio dei plugin. Possiamo pensare al "territorio dei plugin" come a un pezzo di codice funzionale. Qualsiasi pezzo di codice che modifica la funzionalità del tuo sito dovrebbe essere fornito come plugin, a meno che il codice specificato non sia incorporato nel core di WordPress.

Ho già formulato in precedenza in uno dei miei articoli la regola pratica per il territorio dei plugin:

Se la funzionalità è correlata alla presentazione visiva del sito, dovrebbe essere inclusa nel tema; se è correlato alla funzionalità, dovrebbe essere presentato come plug-in separato.

Una regola abbastanza semplice. Le persone cercano ancora di codificare snippet funzionali nei loro temi, ma le directory dei temi (come WordPress.org o ThemeForest) non accettano temi che invadono il territorio dei plugin. Quindi offrire funzionalità nei temi è diventata una sfida definitiva.

Fortunatamente, esiste una soluzione semplice che non va contro la regola del territorio dei plugin.

Introduzione alla libreria di attivazione del plugin TGM

Configurazione dell'attivazione del plugin TGM

Notare la funzione tgmpa () con due parametri alla fine del codice. Il secondo parametro è la variabile $ config, che è anche un array come $ plugins. Come suggerisce il nome, è possibile personalizzare la libreria di attivazione del plug-in TGM utilizzando questo array. La variabile accetta anche il proprio set di opzioni:

  • id (stringa): un ID univoco per la libreria di attivazione del plug-in TGM nel tema. Questo è molto importante: se anche altri plugin utilizzano l'attivazione del plugin TGM, ID differenti prevengono possibili conflitti.
  • default_path (stringa) - Il percorso assoluto predefinito per i plugin nel tuo tema. Quando lo installi, puoi utilizzare il nome del file zip come valore per il parametro source per il tuo plugin.
  • menu (stringa) - slug del menu per la pagina di installazione del plugin.
  • has_notices (boolean) - se impostato su true, verranno emesse notifiche di amministrazione per i plug-in obbligatori / consigliati.
  • dismissible (boolean) - se impostato su true, l'utente può "chiudere" le notifiche.
  • dismiss_msg (stringa): se l'opzione ignorabile è impostata su false, questo messaggio verrà visualizzato sopra la notifica dell'amministratore.
  • is_automatic (boolean) - se impostato su true, i plug-in verranno attivati \u200b\u200bdopo che l'utente ha accettato di installarli.
  • messaggio (stringa) - HTML aggiuntivo visualizzato prima della tabella dei plugin.
  • strings (array) - un array che include i messaggi da visualizzare. Puoi definirli come stringhe tradotte. Dai un'occhiata al file example.php per un elenco completo di tutti i post.
"mytheme-tgmpa", // il tuo ID TGMPA univoco "default_path" \u003d\u003e get_stylesheet_directory (). "/ lib / plugins /", // percorso assoluto predefinito "menu" \u003d\u003e "mytheme-install-required-plugins", // menu slug "has_notices" \u003d\u003e true, // Mostra gli avvisi dell'amministratore "dismissable" \u003d\u003e false , // gli avvisi NON sono ignorabili "dismiss_msg" \u003d\u003e "Ho davvero, davvero bisogno che tu installi questi plugin, okay?", // questo messaggio verrà visualizzato all'inizio di nag "is_automatic" \u003d\u003e true, // automaticamente attiva i plugin dopo l'installazione "message" \u003d\u003e "", // messaggio da visualizzare subito prima della tabella dei plug-in" strings "\u003d\u003e array (); // L'array di stringhe di messaggio utilizzato dall'attivazione del plug-in TGM);?\u003e

Conclusione

Come puoi vedere, è possibile offrire funzionalità nei temi WordPress: devi solo pensare prima agli utenti che potrebbero passare da un tema all'altro. La libreria di attivazione del plug-in TGM offre un modo davvero intelligente per farlo.

Cosa ne pensate di questo strumento? L'hai mai usato, pensi di usarlo in futuro? Condividi i tuoi pensieri!

Creiamo la nostra pagina di registrazione per il multisito invece dello standard wp-signup.php.

In una tipica installazione di WordPress, la pagina di registrazione (autorizzazione, reimpostazione della password) mostra il file wp-login.php.

  • /wp-login.php - autorizzazione
  • /wp-login.php?action\u003dregister - registrazione
  • /wp-login.php?action\u003dlostpassword - reimposta la password

Ci sono condizioni separate per il multisito in wp-login.php. Quindi, quando fai clic sul collegamento /wp-login.php?action\u003dregister su un sito multiplo, WordPress reindirizzerà alla pagina /wp-signup.php. In molti temi, la pagina non sembra molto attraente, quindi ne creeremo una nostra.

Sito principale della rete

Per impostazione predefinita, WordPress apre la pagina di registrazione (wp-signup.php) sul dominio principale (sito) della rete. Tuttavia, puoi creare una pagina di registrazione separata per ogni sito sulla rete, anche se hanno temi diversi. Considereremo il caso in cui tutti i siti sulla rete abbiano la propria pagina di registrazione, ma viene utilizzato lo stesso tema ei siti differiscono solo per la lingua. Se vengono utilizzati temi diversi, sarà necessario scrivere più codice.

functions.php?

Non. Il nome di questo file sembra essere menzionato in ogni articolo di WordPress. Nel nostro caso, dato che la funzionalità di registrazione è pensata per più siti, ha senso spostarla nei plugin MU che vengono caricati all'apertura di qualsiasi sito.

Divagazione lirica

Vale la pena notare che i plug-in MU vengono caricati prima dei plug-in normali e prima che il core di WordPress sia completamente caricato, quindi chiamare alcune funzioni può portare a errori fatali in PHP. Anche questo caricamento "anticipato" ha i suoi vantaggi. Ad esempio, all'interno di qualsiasi tema, non puoi aggrapparti ad alcune azioni che vengono attivate anche prima che il file functions.php venga caricato dal tema. Un esempio di ciò sono le azioni del plugin Jetpack del modulo jetpack_module_loaded_related-posts (related-posts - il nome del modulo) con cui è possibile tracciare l'attività dei moduli in Jetpack. È impossibile "aggrapparsi" a questa azione dal file del tema, perché l'azione ha già funzionato prima del caricamento del tema - i plugin vengono caricati prima dei temi. Per un'immagine generale dell'ordine di caricamento di WordPress, vedere la pagina di riferimento dell'azione nel codice.

Ordina in file

I plugin MU possono contenere qualsiasi numero di file e qualsiasi struttura che ti sembra logica. Mi attengo a qualcosa di simile a questa gerarchia:

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

Tutti i "plugin" necessari per la nostra rete sono collegati nel file load.php:

// Carica i traduttori per tutti i componenti aggiuntivi load_muplugin_textdomain ("selena_network", "/ selena-network / languages \u200b\u200b/"); // La registrazione alla rete richiede WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Un altro plugin // richiede WPMU_PLUGIN_DIR ...

All'interno della cartella selena-network ci sono le cartelle dei plugin, ognuna ha il proprio plugin.php, che includiamo in load.php. Questo ti dà flessibilità e la possibilità di spegnere e riaccendere rapidamente le cose.

Indirizzo della pagina di registrazione

Per specificare l'indirizzo della pagina di registrazione, viene utilizzato il filtro wp_signup_location. Può essere trovato all'interno del file wp-login.php ed è responsabile del reindirizzamento a wp-signup.php.

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

Aggiungiamo la nostra funzione a mu-plugins / selena-network / signup / plugin.php, che restituirà l'indirizzo della pagina di registrazione sul sito corrente:

Funzione selena_network_signup_page ($ url) (return home_url (). "/ Registrati /";) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network è il prefisso che uso nei nomi di tutte le funzioni all'interno dei plugin MU sul mio sito per evitare collisioni, dovrebbe essere sostituito con il mio prefisso univoco. Il filtro ha una priorità di 99 perché alcuni plugin come bbPress e BuddyPress potrebbero sovrascrivere questo URL con il proprio (i plugin MU vengono caricati prima dei plugin normali, vedi sopra). Nota che home_url () viene utilizzato al posto di network_site_url () per mantenere il visitatore nello stesso dominio. Qualsiasi URL può essere utilizzato come indirizzo.

Crea una pagina

Ora creiamo una pagina con l'indirizzo site.com/signup/ tramite l'interfaccia normale e nella cartella del tema figlio, il modello per la nostra nuova pagina è page-signup.php. È possibile utilizzare un ID univoco al posto della parola "registrazione".

All'interno del nuovo modello, è necessario chiamare la funzione selena_network_signup_main (), che visualizzerà il modulo di registrazione.

Vale la pena notare che l'intero processo con i modelli non è richiesto e invece puoi creare il tuo shortcode, che chiamerà anche la funzione selena_network_signup_main ().

wp-signup.php e wp-activation.php

Ora iniziamo a creare una funzione che visualizzerà il modulo di registrazione. Per fare ciò, copia i file wp-signup.php e wp-activation.php dalla radice di WordPress a mu-plugings / selena-network / signup / (e non dimenticare di collegarli all'interno di mu-plugins / selena-network / signup / plugin.php) ... Ulteriori manipolazioni con i file sono estremamente difficili e richiedono molto tempo da descrivere, quindi dovrai farle tu stesso. Descriverò solo cosa deve essere fatto esattamente e pubblicherò i file sorgente del mio progetto:

  1. All'inizio del file, rimuovere tutto require, chiamate di funzione e altro codice al di fuori delle funzioni.
  2. Rinomina tutte le funzioni aggiungendo prefissi univoci ai nomi.
  3. Avvolgi la parte inferiore del codice wp-signup.php nella funzione selena_network_signup_main e scrivi global $ active_signup all'inizio; ...
  4. Sostituisci il layout con il tuo nei posti giusti.

All'interno di wp-activation.php, devi fare qualcosa di simile:

  1. Rimuovere tutto il codice al di fuori delle funzioni, racchiudere il layout in una funzione separata.
  2. Modificare il layout nei punti in cui è necessario.

Il file wp-activation.php è responsabile della pagina di attivazione dell'account. Come per la pagina di registrazione, è necessario creare un modello separato per essa, all'interno del quale chiamare la funzione dal file wp-activation.php.

Inviamo lettere di attivazione

La pagina di registrazione invia al visitatore un'e-mail con un collegamento per attivare il proprio account. Per impostazione predefinita, questo viene fatto dalla funzione wpmu_signup_user_notification () dal file ms-functions.php. La sua funzionalità può essere presa in prestito per la tua funzione. Il motivo per smettere di usare questa funzione è perché invia il link di attivazione dell'account da wp-activation.php. Puoi "disabilitare" questa funzione usando il filtro wpmu_signup_user_notification, dando false su di esso (se non lo fai, la lettera di attivazione verrà inviata due volte, ok, infatti, due lettere diverse).

Funzione armyofselenagomez_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta \u003d array ()) (// ... // Codice dalla funzione wpmu_signup_user_notification () wp_mail ($ user_email, wp_specialchars_decode ($ message_headers), $ message), $ ; return false;) add_filter ("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

Di conseguenza, la pagina di registrazione nel tema Selena sembra molto più pulita e accurata.

Conclusione

Ci sono molti altri modi non molto corretti su Internet per fare lo stesso: reindirizzamenti Apache, moduli AJAX che non funzioneranno senza Java Script, ecc. Non mi è piaciuto molto tutto questo, quindi ho provato a farlo nel modo più corretto possibile sul mio proprio sito web.

Nota che dovresti modificare i file con attenzione e cercare di non deviare molto dall'originale, in modo che in futuro, se WordPress cambia i file wp-signup.php e wp-activation.php, sarebbe più facile confrontarli per trovare le modifiche.

Non dimenticare di esaminare il codice sorgente di tutte le funzioni sopra descritte per comprendere appieno cosa e come sta accadendo all'interno del codice.

Bonus. Protezione dagli spammer

Anche i più piccoli siti WordPress sono soggetti a frequenti registrazioni di spam. Puoi scrivere infinite condizioni per filtrare i bot, spesso più come provare a creare intelligenza artificiale 🙂 Nel caso di un multisito, il solito reindirizzamento in Apache mi ha aiutato molto, con il quale, aprendo /wp-signup.php e /wp-acitvate.php, ho chiesto 404 (Non sono un esperto della configurazione di Apache, quindi le mie regole potrebbero non essere molto corrette).

RewriteEngine su RewriteBase / RewriteRule ^ wp-signup \\ .php - RewriteRule ^ wp-activation \\ .php - # BEGIN WordPress # Non toccare le regole di WordPress per impostazione predefinita :) # ... # END WordPress

P. S. Cerco di descrivere nel modo più dettagliato possibile alcune cose di terze parti, perché quando ho iniziato, a volte non c'era nessuno a suggerire e spiegare molte cose. Credo anche che questi piccoli suggerimenti su altri materiali spingano qualcuno a imparare qualcosa di nuovo e ad espandere il proprio campo di conoscenza. Le espressioni regolari sono utilizzate nelle voci RewriteRule, non sono affatto complesse, ad esempio, il carattere ^ indica l'inizio di una riga.

Registra una funzione da attivare quando il plugin è attivato.

Questa funzione collega la funzione di callback specificata all'hook activ_ (plugin) ed è un wrapper attorno a questo hook.

(plugin) nell'hook activ_ (plugin) viene sostituito con il nome del relativo plugin al file principale del plugin. Ad esempio, se il plugin si trova: wp-content / plugins / sampleplugin / sample.php, il nome dell'hook sarà: activ_sampleplugin / sample.php.

Dalla versione 3.1. L'hook si attiva solo quando il plug-in è attivato e non si attiva quando il plug-in viene aggiornato automaticamente.

Come funziona

Il plugin viene attivato dalla funzione activ_plugin (), in cui viene attivato l'hook activ_ (plugin).

La funzione activ_plugin () nel kernel viene chiamata dopo che l'ambiente VI è stato caricato. Questa funzione collega il file del plugin principale (e tutto ciò che è specificato in esso) e quindi attiva la funzione di callback specificata tramite un hook. Per questo motivo, tutte le funzioni e le classi del plugin sono disponibili nella nostra funzione di callback. Tuttavia, poiché tutti i principali hook WP sono già stati attivati \u200b\u200bquando viene caricato l'ambiente VI, nessun evento plugin appeso agli hook, ad esempio plugins_loaded, non si attiverà più quando il file plug-in principale è connesso. Ciò significa che il nostro plugin sarà connesso, ma non completamente: non come dovrebbe essere connesso quando è già attivato.

Quindi, ad esempio, se un plugin fa qualcosa durante l'evento plugins_loaded, allora tutte queste azioni semplicemente non avverranno quando il plugin viene attivato. Ad esempio, se collega un file di traduzione, il file di traduzione non verrà connesso quando viene attivata la funzione di callback specificata per register_activation_hook ().

Di norma, dopo che la funzione di callback è stata attivata, ci sono 2 eventi su cui le funzioni possono essere bloccate: activ_plugin e shutdown.

Per fare qualcosa di straordinario quando si attiva un plugin, vedere l'esempio 5.

Condizioni d'uso

La funzione non funzionerà se la chiami nel momento in cui viene attivato un hook, ad esempio plugins_loaded, init. La funzione deve essere chiamata direttamente dal file del plugin principale. Regole di attivazione:

    register_activation_hook () dovrebbe essere chiamato dal file del plugin principale dove si trova la direttiva Plugin Name: ... e non dovrebbe essere chiamato da nessun hook come plugins_loaded o init.

    La funzione hook deve trovarsi nello stesso file dell'hook o essere inclusa in anticipo da un altro file.

    Nella funzione hook, l'eco non funziona. Perché c'è un reindirizzamento e non vedrai l'eco. Ma die () può essere utilizzato.

  1. Le variabili globali (se presenti) devono essere definite in modo esplicito per poter accedere dalla funzione hook.

Una nota sulla portata variabile

Quando un plug-in è attivato, il file del plug-in principale non è incluso nell'ambito globale, ma all'interno della funzione activ_plugin (). Pertanto, le variabili considerate globali durante il normale funzionamento del plug-in non saranno globali.

Ad esempio, la funzione utilizzata in register_activation_hook () potrebbe non vedere le variabili globali, anche se le hai dichiarate come globali all'interno di questa funzione. Esempio:

$ myvar \u003d "qualcosa"; register_activation_hook (__ FILE__, "myplugin_activate"); function myplugin_activate () (global $ myvar; echo $ myvar; // La variabile non è uguale a "qualcosa")

A causa di questa caratteristica, le variabili globali devono essere sempre specificate esplicitamente. Tutte le variabili globali devono essere definite come globali, anche se la variabile è specificata nel corpo del plugin. Solo in questo caso ci sarà accesso ovunque. Esempio:

Global $ myvar; // indica esplicitamente che questa è una variabile globale $ myvar \u003d "qualcosa"; register_activation_hook (__ FILE__, "myplugin_activate"); funzione myplugin_activate () (global $ myvar; echo $ myvar; //\u003e qualcosa)

Non ci sono ganci.

ritorna

nullo. Non restituisce nulla.

Utilizzando

register_activation_hook ($ file, $ funzione); $ file (stringa) (obbligatorio) Il percorso del file php principale del plugin incluso il nome del plugin stesso. Di solito viene utilizzata la costante magica PHP __FILE__. $ funzione (stringa / array / lambda) (obbligatorio)

Il nome della funzione di callback. Per le classi, usa un array: array ($ this, "nome_funzione"); ...

La funzione riceverà una variabile booleana $ network_wide - se il plugin è attivato per l'intera rete di siti quando è multisito.

Esempi di

# 1. Esecuzione di una funzione durante l'attivazione di un plugin

Supponiamo di avere una funzione my_plugin_activate () nel file principale del plug-in: wp-content / plugins / myplugin / myplugin.php, quindi per eseguire questa funzione durante l'attivazione del plug-in utilizzare il seguente codice:

Register_activation_hook (__ FILE__, "my_plugin_activate"); function my_plugin_activate () (// Codice di attivazione ...)

# 2. Esecuzione di un metodo di classe

Se il plugin utilizza una classe PHP, il codice di attivazione viene aggiunto in questo modo:

Register_activation_hook (__ FILE__, array ("My_Plugin", "install")); class My_Plugin (funzione statica install () (// Non creare alcun output qui ...))

# 3. Esecuzione di un metodo di classe da un file separato

Se la classe che contiene la funzione di attivazione si trova in un file separato, registra la funzione di attivazione in questo modo:

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

# 4. Esecuzione di un metodo di classe dalla classe stessa

Se ti trovi all'interno di __construct (). È importante sottolineare che __FILE__ deve "guardare" il file del plugin principale:

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

# 5 Fai qualcosa subito dopo aver attivato il plugin

Dopo aver attivato il plugin, vengono attivati \u200b\u200bsolo due hook: activ_plugin e shutdown.

Quando devi fare qualcosa subito dopo aver attivato un plugin, puoi allegare una funzione ad essi.

Quando una tale soluzione non funziona, è possibile utilizzare le opzioni WP: salvare i dati in un'opzione e quindi verificare l'opzione e fare qualcosa se l'opzione è:

// File principale del plugin. ... function my_plugin_activate () (// aggiungi un'opzione in modo che in seguito se ce n'è una per fare qualcosa. add_option ("Activated_Plugin", "Plugin-Slug"); // Ecco il codice di attivazione ...) register_activation_hook (__ FILE__, " my_plugin_activate "); function load_plugin () (if (is_admin () && get_option ("Activated_Plugin") \u003d\u003d "Plugin-Slug") (// elimina l'opzione aggiunta in modo che non funzioni più // e fai quello che ci serve ... delete_option ("Activated_Plugin "); // Fai qualcosa una volta, dopo aver attivato il plugin // Ad esempio: add_action (" init "," my_init_function ");)) add_action (" admin_init "," load_plugin ");

Un'altra opzione per fare qualcosa durante l'attivazione del plugin è creare il tuo evento in questo modo:

Funzione my_plugin_activate () (// Installa il nostro hook in modo che tu possa allegarlo dai file del plugin stesso do_action ("my_plugin_activate");) register_activation_hook (__ FILE__, "my_plugin_activate");

# 6 Un'altra dimostrazione dell'utilizzo della funzione

Un piccolo plugin che mostra come utilizzare la funzione:

/ * Nome plugin: A Descrizione test: A Test * / require_once dirname (__ FILE__). "/my_other_file.php"; / * Questo codice non funzionerà. L'hook di attivazione deve essere chiamato dal file principale. register_activation_hook (dirname (__ FILE__). "/my_other_file.php", "my_other_function"); * / // Questo è codice funzionante. register_activation_hook (__ FILE__, "test_activated"); / * Questo è il modo corretto per dichiarare e accedere alle variabili globali. Le variabili globali devono essere dichiarate chiaramente. Senza questo, non avrai accesso a loro. * / global $ qualche_var; $ some_var \u003d "hey"; // Funzione di attivazione funzione test_activated () (// qui $ some_var non sarà uguale a hey global $ some_var; // E qui $ some_var sarà uguale a hey // Questa funzione è definita nel file "my_other_file.php" my_other_function (); / * Questa questo non funzionerà. Se hai bisogno di scrivere i log in un file temporaneo, usa fopen / fwrite. Se vuoi verificare se l'hook di attivazione funziona, usa exit () all'interno della funzione hook. * / echo "test_activated called!";)

Ti consente di utilizzare un'installazione di WordPress per più siti contemporaneamente. Inoltre, ogni sito riceve le proprie tabelle nel database con un prefisso univoco.

Le tabelle con i dati degli utenti registrati sono comuni a tutti i siti della rete. Questo è un vantaggio decisivo e registrandoti una volta puoi avere accesso a diversi siti. Inoltre, su ogni sito lo stesso account può avere diritti diversi. Ad esempio, su un sito un utente può essere un editore e su un altro un amministratore.

In una tipica installazione di WordPress, la pagina di registrazione, accesso e reimpostazione della password visualizza il file wp-login.php.

  • wp-login.php - autorizzazione
  • wp-login.php? action \u003d register - registrazione
  • wp-login.php? action \u003d lostpassword - reimpostazione della password

In modalità multisito, il core di WordPress inizia a comportarsi in modo leggermente diverso e quando fai clic sul collegamento wp-login.php? Action \u003d register, si verificherà un reindirizzamento a wp-signup.php. Questa è la tua pagina di registrazione alla rete, che è il sito WordPress predefinito.

Oltre a registrare account utente regolari, è possibile creare un nuovo sito Web su di esso, se il super amministratore ha abilitato questa funzione nelle impostazioni di rete (Amministrazione di rete → Impostazioni → Impostazioni di rete).

Nella maggior parte dei temi, la pagina di registrazione non ha un bell'aspetto. Molte skin utilizzano framework CSS come Bootstrap e le loro classi specifiche per modellare diversi elementi sulle pagine, quindi è difficile scrivere un singolo HTML che funzioni per tutti.

Ma non disperare se la pagina sembra disordinata. Il file wp-signup.php è fantastico all'inizio, quando non hai tempo per lavorare su ogni dettaglio del sito, puoi concentrarti su altre pagine e contenuti più importanti.

Quando sei pronto per creare la tua pagina di registrazione, wp-signup.php sarà un buon esempio per comprendere facilmente la gamma di funzioni che WordPress fornisce per la gestione e la convalida dell'input dell'utente e la creazione di nuovi account.

Sito principale della rete

Per impostazione predefinita, WordPress apre una pagina di registrazione (wp-signup.php) sul dominio principale (sito) della rete. Tuttavia, puoi creare pagine di registrazione per ogni sito sulla rete, anche se hanno temi.

Considereremo il caso in cui tutti i siti della rete utilizzino lo stesso tema, ma ognuno di essi ha una pagina di registrazione. I siti differiscono nella lingua (inglese e russo), quindi la pagina di registrazione verrà visualizzata nella lingua "nativa" del sito. Se i siti utilizzano temi diversi, tutto dipenderà dal tipo di temi che sono, se lo stesso layout si adatta a loro (una situazione eccellente che può spingerti a unificare tutti i tuoi temi) o se vale la pena elaborare le pagine individualmente.

Alternativa a functions.php

Ordina in file

I plugin MU possono contenere un numero qualsiasi di file e strutture che ti sembrano logiche. Mi attengo a qualcosa di simile a questa gerarchia:

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

Il file load.php include le traduzioni e tutti i "plugin" necessari:

// Carica le traduzioni per i plugin MU load_muplugin_textdomain ("selena_network", "/ selena-network / languages \u200b\u200b/"); // Funzionale per la pagina di registrazione richiede WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Un altro plugin // richiede WPMU_PLUGIN_DIR ...

Le cartelle dei plugin sono archiviate nella directory selena-network. Ognuno ha il proprio plugin.php, che includiamo in load.php. Ciò offre flessibilità e la possibilità di disabilitare e abilitare istantaneamente i singoli componenti in un progetto funzionante in caso di emergenza.

Pagina di registrazione

Dopo aver capito dove e come scriveremo il codice, possiamo procedere alla creazione della pagina di registrazione.

Creiamo una pagina con l'indirizzo example.org/signup/ tramite una normale interfaccia. Come indirizzo, puoi utilizzare qualsiasi URL che sembra appropriato per il tuo progetto.

Reindirizza alla pagina di registrazione richiesta

Affinché WordPress possa conoscere la nostra nuova pagina di registrazione e reindirizzarla, quando si fa clic sul collegamento "Registrati", viene utilizzato il filtro wp_signup_location. Può essere trovato all'interno di wp-login.php ed è responsabile del reindirizzamento a wp-signup.php per impostazione predefinita.

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

Come ricordi, per impostazione predefinita, la pagina di registrazione si apre sul dominio principale della rete. Questo è il motivo per cui network_site_url () viene utilizzato qui.

Aggiungi il nostro gestore al filtro in mu-plugins / selena-network / signup / plugin.php, che restituirà l'indirizzo della pagina di registrazione sul sito corrente:

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

selena_network è il prefisso che utilizzo nei nomi di tutte le funzioni all'interno dei plugin MU sul mio sito per evitare collisioni, dovrebbe essere sostituito con il mio prefisso univoco. Il filtro ha una priorità di 99 perché alcuni plugin come bbPress e BuddyPress potrebbero sovrascrivere questo URL con il proprio (i plugin MU vengono caricati prima dei plugin normali, vedi sopra).

Si noti che viene utilizzata home_url () che, a differenza di network_site_url (), restituisce l'indirizzo del sito corrente, non il sito principale della rete.

Funzionalità wp-signup.php

Il file wp-signup.php contiene molte funzioni e codice. Per vedere il quadro generale, puoi usare la piegatura del codice. Questo di solito è chiamato "piegatura del codice" in inglese.

All'inizio del file da 1 a 80 righe (nella versione 4.1.1), vengono eseguiti vari controlli e output dell '"inizio" della pagina utilizzando get_header ().

Successivamente, vengono dichiarati molti metodi e prima di iniziare a lavorarci, vale la pena capire cosa fa ciascuna funzione. Molti di loro usano spesso altre funzioni con il prefisso wpmu_ all'interno, tutte dichiarate nel file wp-includes / ms-functions.php. Questa sezione è difficile da capire senza vedere il codice da soli. Di seguito una breve descrizione delle principali funzioni in caso di problemi.

  • wpmu_signup_stylesheet () - Visualizza CSS aggiuntivo nella pagina di registrazione.
  • show_blog_form () - campi per la registrazione del sito (indirizzo, nome, visibilità per i motori di ricerca).
  • validate_blog_form () - convalida l'indirizzo e il nome del sito immessi utilizzando wpmu_validate_blog_signup ().
  • show_user_form () - campi per la registrazione dell'utente (login e indirizzo e-mail).
  • validate_user_form () - convalida del login e dell'indirizzo e-mail inseriti. posta utilizzando wpmu_validate_user_signup ().
  • signup_another_blog () - campi per la registrazione di nuovi siti utilizzando show_blog_form () per gli utenti che sono già registrati sul sito.
  • validate_another_blog_signup () - Controlla l'URL e il titolo del sito utilizzando validate_blog_form ().
  • signup_user () è la funzione principale per visualizzare i campi della pagina di registrazione.
  • validate_user_signup () - convalida il login e l'email. mail utilizzando validate_user_form ().
  • signup_blog () - campi per inserire l'indirizzo, il nome e la visibilità del sito (il secondo passaggio della registrazione) utilizzando show_blog_form ().
  • validate_blog_signup () - convalida il login, l'indirizzo e-mail. posta, indirizzo e nome del sito.

In fondo al file wp-signup.php (dalla riga 646 nella versione 4.1.1), la logica principale della pagina di registrazione, che utilizza tutti i metodi sopra. Questa parte del codice non è inclusa nella funzione. Alla fine viene chiamato get_footer ().

Copia la funzionalità di wp-signup.php

Successivamente, descriveremo la procedura per copiare wp-signup.php nei plugin MU e apportare modifiche al "fork". Forse questo potrebbe non sembrare il modo giusto. Invece, puoi scrivere la tua convalida del modulo e visualizzare le funzioni da zero usando le classi piuttosto che le normali funzioni. Secondo me, wp-signup.php ha già tutta la logica necessaria per la nostra pagina, resta solo da fare piccole modifiche.

Quando aggiorni WordPress, wp-signup.php cambia di volta in volta, ma questo non significa che ad ogni versione dovrai sincronizzare il tuo fork. Le funzioni all'interno di wp-signup.php sono essenzialmente impegnate solo nell'output HTML, nella convalida dei dati, nella creazione di account e siti, sono coinvolti metodi con il prefisso wpmu_, dichiarato in ms-functions.php.

Cominciamo creando una funzione che mostrerà il form di registrazione nella pagina. Per fare ciò, copia wp-signup.php dalla radice di WordPress in mu-plugings / selena-network / signup /. Collegiamolo all'interno di mu-plugins / selena-network / signup / plugin.php).

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

Rimuoviamo tutti i controlli necessari e non necessari dall'inizio del file copiato. Nella versione 4.1.1, questo è tutto il codice da 1 a 80 righe.

Siamo ora pronti per creare la funzione principale per visualizzare il form di registrazione. Per fare ciò, sposta tutta la logica dalla riga 646 alla fine del file in una funzione chiamata selena_network_signup_main. Alla fine, rimuoveremo le due chiusure extra

(linee 722 e 723), così come una chiamata a get_footer ().

Nella selena_network_signup_main () appena creata, all'inizio, dichiariamo la variabile globale active_signup, che viene utilizzata da tutti gli altri metodi di questo file. E aggiungiamo una chiamata all'evento before_signup_form, che abbiamo rimosso dall'inizio del file.

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

Ora non resta che modificare il layout in tutti i punti in cui è necessario e la pagina di registrazione è pronta.

Emissione del modulo di registrazione

Ci sono almeno due opzioni qui. Un modo più conveniente è creare uno shortcode e inserirlo nella pagina utilizzando un normale editor.

// Crea uno shortcode network_signup add_shortcode ("network_signup", "selena_network_signup_main");

La seconda opzione è creare un modello di pagina page-signup.php nella cartella del tema figlio. Invece della parola "registrazione", puoi utilizzare un ID univoco assegnato alla pagina. All'interno del modello, aggiungi il layout richiesto e chiama selena_network_signup_main () nel posto giusto.

Di conseguenza, la mia pagina di registrazione sembra molto migliore e più pulita.

Pagina di attivazione

Per impostazione predefinita, WordPress divide convenzionalmente il processo di registrazione in Multisite in due passaggi: compilare un modulo sul sito e attivare un account quando si fa clic sul collegamento inviato in un'e-mail. Dopo aver compilato il modulo creato nella sezione precedente, WordPress invia un'e-mail con una piccola istruzione e un collegamento per attivare il tuo account.

Il file wp-activation.php situato nella directory principale di WordPress è responsabile della visualizzazione della pagina di attivazione. wp-activation.php può anche essere completamente modificato. Il processo è simile a quello che abbiamo già fatto per wp-signup.php.

Creiamo una pagina example.org/activate/ tramite un'interfaccia normale. Usa qualsiasi URL che trovi adatto per l'indirizzo.

Copiamo il file wp-activation.php nei nostri plugin MU e collegiamolo a mu-plugins / selena-network / signup / plugin.php.

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

Non c'è molto contenuto all'interno, a differenza di wp-signup.php. Il file esegue una sola operazione: attiva l'account se viene ricevuta la chiave corretta e visualizza un messaggio di errore o un'operazione riuscita.

Rimuoviamo tutti i controlli e requisiti non necessari: da 1 a 69 righe in WordPress 4.1.1. Alla fine, rimuoviamo la chiamata get_footer (). Spostare il resto del contenuto nella funzione selena_network_activate_main ().

È interessante notare che la costante WP_INSTALLING è stata dichiarata qui prima di caricare WordPress (wp-load.php). La sua presenza fa sì che WordPress non carichi i plugin.

Come nel caso della pagina di registrazione, non resta che correggere il layout dove necessario. Puoi anche cambiare il testo dei messaggi visualizzati (in questo caso, non dimenticare di aggiungere il dominio del testo dei tuoi plugin MU a tutte le funzioni del traduttore, per impostazione predefinita non è installato da nessuna parte).

La funzione già pronta può essere utilizzata su una pagina pre-creata tramite uno shortcode o un modello separato in un tema figlio.

Email di attivazione con collegamenti corretti

La pagina di attivazione è pronta, ma WordPress non lo sa e invierà comunque e-mail di attivazione con un collegamento a wp-activation.php. A differenza di wp-signup.php, non esiste un filtro per modificare l'indirizzo. Invece, è necessario scrivere una propria funzione che invierà e-mail con i collegamenti corretti.

Al momento della compilazione e dell'invio del modulo nella pagina di registrazione, WordPress chiama wpmu_signup_ utente() o wpmu_signup_ blog() a seconda del tipo di registrazione. Entrambe le funzioni creano un nuovo record nella tabella wp_signups, riempiendolo con il contenuto necessario, tra cui c'è una chiave di attivazione dell'account.

Quindi, a seconda della funzione, viene chiamato wpmu_signup_ utente_notification () o wpmu_signup_ blog_notification (). Entrambe le funzioni hanno funzionalità simili: generano e inviano un'e-mail con un collegamento di attivazione, ma accettano argomenti diversi. Entrambi hanno filtri per "intercettare" l'evento.

Se (! Apply_filters ("wpmu_signup_user_notification", $ user, $ user_email, $ key, $ meta)) restituisce false;

Per attivare gli account con la creazione di un blog:

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

Non resta che scrivere i propri gestori, all'interno dei quali inviare e-mail tramite wp_mail (), e alla fine assicurarsi di fornire false in modo che WordPress non invii un'e-mail di attivazione due volte: una è tua, l'altra è un'e-mail predefinita con un collegamento a wp-activation.php.

Funzione selena_network_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta \u003d array ()) (// Genera l'intestazione, il testo e le intestazioni dell'email // ... // Invia l'email o aggiungi un'attività Cron per inviare l'email wp_mail ($ user_email , wp_specialchars_decode ($ subject), $ message, $ message_headers); // Invia false per impedire a WordPress di inviare due volte l'email di attivazione return false;) add_filter ("wpmu_signup_user_notification", "selena_network_wpmu_signup_user_notification", 10, 4);

Se stai inviando email tramite un server SMTP o il numero di registrazioni è molto alto, dovresti considerare di non inviare email immediatamente. Invece, puoi aggiungere Cron Tasks usando WordPress Cron.

Chiusura dell'accesso a wp-signup.php e wp-activation.php

Dopo aver creato le proprie pagine di registrazione e attivazione, potrebbe essere necessario chiudere gli "originali". Ad esempio, se la pagina di registrazione contiene campi aggiuntivi che devono essere compilati. Inoltre, molti siti WordPress sono soggetti a registrazioni di spam.

Per risolvere due problemi in un unico passaggio, puoi chiedere ad Apache di restituire 404 se provi ad aprire queste pagine. Per fare ciò, devi solo registrare un paio di RewriteRules aggiuntive nel tuo file di configurazione o .htaccess.

RewriteEngine On RewriteBase / # Conoscere le espressioni regolari non sarà mai superfluo :) RewriteRule ^ wp-signup \\ .php - RewriteRule ^ wp-activation \\ .php - # BEGIN WordPress # Non toccare le regole di WordPress per impostazione predefinita :) # ... # FINE WordPress

Conclusione

Ci sono molte soluzioni per questo e molti altri "problemi" relativi a WordPress su Internet. Ad esempio, per creare pagine di registrazione e attivazione, alcuni suggeriscono di riscrivere l'originale wp-signup.php e wp-activation.php. Non vale la pena farlo, perché se aggiorni WordPress, perderai tutte le modifiche apportate ai file e non sarai nemmeno in grado di verificare l'integrità del core con.

Durante lo sviluppo di qualsiasi componente aggiuntivo, tema o soluzione, dovresti dedicare un po 'di tempo a capire cosa sta succedendo all'interno di WordPress. Ci sono molti utili strumenti di debug per questo.

P.S.

Per assegnare automaticamente ruoli diversi ai nuovi utenti, è possibile utilizzare il plug-in Gestione utenti multisito.

Se hai domande o difficoltà durante la creazione delle pagine di registrazione e attivazione dopo aver letto l'articolo, lascia un commento e ti risponderemo sicuramente.

27.03.2015 27.03.2015

Sviluppatore WordPress. Ama l'ordine in tutto e comprende nuovi strumenti. Ispirato all'architettura dei componenti di Symfony.

  • LA CAMPANA

    C'è chi ha letto questa notizia prima di te.
    Iscriviti per ricevere gli ultimi articoli.
    E-mail
    Nome
    Cognome
    Come vuoi leggere The Bell
    Niente spam