In questa serie, abbiamo studiato come creare un semplice sistema CRM in WordPress. Nella prima parte di questa serie, abbiamo creato un plug-in WordPress che registrava un tipo di messaggio personalizzato "Contatti", ma non è ancora stato spiegato come memorizzare ulteriori informazioni per un contatto.
WordPress ha il add_meta_box ()
funzione, che consente agli sviluppatori di plugin e temi di registrare le meta box personalizzate contro varie schermate di amministrazione di WordPress.
WordPress registra alcune delle sue meta box per la visualizzazione quando si crea un post o una pagina. Ad esempio, su Pages, hai il Attributi della pagina meta-box:
Aggiungiamo una meta-scatola al nostro Contatti tipo di messaggio personalizzato. Apri il file plugin che hai creato nel primo tutorial di questa serie. Quindi, nel costruttore del plugin, aggiorna il codice in modo che corrisponda al seguente. Questo registra il nostro register_meta_boxes ()
funzione contro il add_meta_boxes
azione:
/ ** * Costruttore. Chiamato quando il plugin è inizializzato * / function __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('add_meta_boxes', array ($ this, 'register_meta_boxes'));
Avanti, nel nostro register_meta_boxes ()
funzione, aggiungiamo una chiamata a add_meta_box ()
. Questo dice a WordPress che vogliamo una meta box chiamata Dettagli del contatto, che è reso dal nostro output_meta_box ()
funzione. Aggiungi il codice seguente dopo la funzione di costruzione:
/ ** * Registra una Meta Box sul nostro contatto Post Type personalizzato, chiamato 'Contact Details' * / function register_meta_boxes () add_meta_box ('contact-details', 'Contact Details', array ($ this, 'output_meta_box'), 'contatto', 'normale', 'alto');
Infine, abbiamo bisogno di un output_meta_box ()
funzione, che è chiamata da add_meta_box
sopra. Aggiungere il seguente codice dopo il register_meta_boxes ()
funzione:
/ ** * Mostra una meta box Dettagli contatto * * @param WP_Post $ post Oggetto WordPress Post * / function output_meta_box ($ post)
Controlliamo di avere una meta-box che appare sul nostro Contatti tipo di messaggio personalizzato. Crea un nuovo contatto nella dashboard di WordPress andando a Contatti> Aggiungi nuovo.
Se tutto è stato scritto correttamente, dovresti vedere qualcosa di simile allo screenshot seguente:
Andiamo avanti e aggiungiamo un campo di indirizzo email a questa meta-scatola. Cambia il tuo output_meta_box
funzione al seguente codice:
/ ** * Mostra una meta box Dettagli contatto * * @param WP_Post $ post Oggetto WordPress Post * / function output_meta_box ($ post) // Etichetta di output e campo echo (''); eco ( '');
Salvare il codice del plugin e ricaricare la schermata Aggiungi contatto. Dovresti vedere il nostro nuovo campo Indirizzo email nella casella dei dettagli del contatto:
Non abbiamo ancora finito. Dobbiamo dire a WordPress di salvare il contenuto che un utente inserisce in questo campo. In WordPress, lo facciamo registrando una funzione contro il save_post
azione.
Come con la maggior parte delle azioni, registreremo la nostra azione nel costruttore del plugin:
/ ** * Costruttore. Chiamato quando il plugin è inizializzato * / function __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('add_meta_boxes', array ($ this, 'register_meta_boxes')); add_action ('save_post', array ($ this, 'save_meta_boxes'));
Quindi, creiamo il nostro save_meta_boxes ()
funzione:
/ ** * Salva i dati del campo del meta box * * @param int $ post_id Post ID * / function save_meta_boxes ($ post_id) // Verifica questo è il contatto Tipo di messaggio personalizzato if ('contact'! = $ _POST ['post_type ']) return $ post_id; // Verifica che l'utente loggato abbia il permesso di modificare questo post se (! Current_user_can ('edit_post', $ post_id)) return $ post_id; // OK per salvare i metadati $ email = sanitize_text_field ($ _POST ['contact_email']); update_post_meta ($ post_id, '_contact_email', $ email);
Questa funzione esegue diverse azioni, perché il save_post
l'azione può essere chiamata abbastanza frequentemente da WordPress e altri plug-in (ad esempio, quando si salva automaticamente una bozza o si salva un tipo di post diverso). Dobbiamo essere sicuri di salvare i nostri dati di campo personalizzati solo se l'utente ha salvato o aggiornato un contatto.
Se stiamo salvando un contatto, disinfettiamo l'indirizzo email. Dal codice WordPress:
Controlla UTF-8 non valido, Converti singolo < characters to entity, strip all tags, remove line breaks, tabs and extra white space, strip octets.
In breve, ci assicuriamo che non ci sia formattazione funky sulla nostra stringa di testo.
Infine, memorizziamo l'indirizzo email nei metadati del post, utilizzando update_post_meta
. Pensa a post meta come a una serie di coppie chiave / valore che sono associate a un post. Puoi avere il numero minimo o il numero che vuoi. Nel nostro esempio, stiamo memorizzando il valore del nostro campo personalizzato rispetto alla chiave _contatto email
.
Crea un nuovo Contatto e inserisci un indirizzo email. Salva il nuovo contatto e noterai che l'indirizzo email non appare nel campo:
Dobbiamo modificare il nostro output_meta_box ()
funzione per leggere il meta Post e visualizzarlo nel campo di input. Cambiare il output_meta_box ()
funzione al seguente codice:
/ ** * Mostra una meta box Dettagli contatto * * @param WP_Post $ post Oggetto WordPress Post * / function output_meta_box ($ post) $ email = get_post_meta ($ post-> ID, '_contact_email', true); // Etichetta di output e campo echo (''); eco ( '');
Noi usiamo get_post_meta ()
per ottenere il valore per la combinazione Post ID e meta-chiave fornita. Sappiamo che la meta chiave è _contatto email
, poiché è quello che abbiamo usato quando abbiamo salvato il valore del campo personalizzato update_post_meta ()
La sicurezza è estremamente importante quando si inoltrano e si gestiscono i dati del modulo. Dobbiamo sapere che la fonte dei nostri dati è affidabile quando la salviamo. Se non possiamo fidarci della fonte dei nostri dati, non dobbiamo memorizzarli - i dati potrebbero essere compromessi o corrotti in un modo per tentare di sfruttare un bug o un difetto di sicurezza.
WordPress ci fornisce noces (un "numero usato una volta"), che può essere inviato insieme ai dati del modulo. Questo nonce può essere controllato quando viene eseguita la nostra routine di salvataggio, per garantire che corrisponda al valore che ci aspetteremmo.
Ciò aiuta a prevenire gli attacchi di falsificazione delle richieste tra siti (CSRF), ad esempio qualcuno che tenta di inviare i dati del modulo alla nostra routine di salvataggio da un sito Web diverso.
Abbiamo bisogno di aggiungere sicurezza al codice sopra in due punti:
output_meta_box ()
: aggiungi un valore nonce al modulosave_meta_boxes ()
: verifica un valore di nonce inviatoModifichiamo il output_meta_box ()
funzione, sostituendolo con il seguente codice:
/ ** * Mostra una meta box Dettagli contatto * * @param WP_Post $ post Oggetto WordPress Post * / function output_meta_box ($ post) $ email = get_post_meta ($ post-> ID, '_contact_email', true); // Aggiungi un campo nonce in modo che possiamo verificarlo in seguito. wp_nonce_field ('save_contact', 'contacts_nonce'); // Etichetta di output e campo echo (''); eco ( '');
Questo usa wp_nonce_field ()
, per generare un campo nascosto chiamato contacts_nonce
, con un'azione chiamata save_contact
. Il suo valore è generato da WordPress.
Successivamente, modifichiamo la routine di salvataggio in save_meta_boxes ()
:
/ ** * Salva i dati del campo del meta box * * @param int $ post_id Post ID * / function save_meta_boxes ($ post_id) // Controlla se il nostro nonce è impostato. if (! isset ($ _POST ['contacts_nonce'])) return $ post_id; // Verifica che il nonce sia valido. if (! wp_verify_nonce ($ _POST ['contacts_nonce'], 'save_contact')) return $ post_id; // Controlla questo è il tipo di post personalizzato del contatto se ('contact'! = $ _POST ['post_type']) return $ post_id; // Verifica che l'utente loggato abbia il permesso di modificare questo post se (! Current_user_can ('edit_post', $ post_id)) return $ post_id; // OK per salvare i metadati $ email = sanitize_text_field ($ _POST ['contact_email']); update_post_meta ($ post_id, '_contact_email', $ email);
Questo aggiunge due controlli alla nostra procedura di salvataggio:
Crea o modifica il tuo Contatto, e assicurarsi che l'indirizzo di posta elettronica venga ora salvato.
Nel prossimo articolo, useremo Advanced Custom Fields per aggiungere campi personalizzati al nostro Contatto tipo di post personalizzato, che ci consente di creare un'interfaccia utente ricca con una gamma più ampia di tipi di input.