Consenti agli utenti di inviare al tuo sito WordPress un plug-in di citazioni

In questo tutorial, imparerai come creare un plug-in che consenta agli utenti di inviare i dati del modulo. Imparerai anche a conoscere la sicurezza usando nonces.


Che cosa imparerai

  • Come visualizzare ed elaborare un modulo utilizzando uno shortcode
  • Utilizzare nonces per proteggere gli invii degli utenti

È più semplice di quanto pensi

Gli shortcode sono spesso usati per visualizzare dati semplici, ma poiché sono in realtà un modo per dirottare una pagina o postare ed eseguire codice, possono essere usati per compiti abbastanza complessi, come la visualizzazione e l'elaborazione di moduli.

Costruiremo un plug-in che consentirà agli utenti registrati di:

  • inviare preventivi per la moderazione e la pubblicazione
  • guarda le loro citazioni inedite
  • cancella le loro citazioni inedite

Ecco a cosa miriamo:

Tutto il codice è disponibile nella sorgente del plugin nella parte superiore di questo tutorial.


Passaggio 1 Configurare il plug-in

La cartella del plugin WordPress si trova nella cartella di installazione di WordPress all'indirizzo wp-content / plugins. Crea una cartella all'interno della cartella dei plugin. Chiamiamolo submit-user-citazioni. Ora crea il file di plugin stesso. Chiamiamolo submit_user_quotes.php. Il percorso del tuo file plugin dovrebbe ora essere: wp-content / plugins / inviare-user-quotes / submit_user_quotes.php

Ogni plugin Wordpress necessita di alcune informazioni di intestazione in modo che WordPress possa identificarlo e renderlo disponibile nella pagina del plug-in del dashboard.

  

Puoi modificare queste informazioni secondo le tue esigenze.

Vedrai il plugin elencato in questo modo:


Fase 2 Inizializzazione del plugin

Creeremo un tipo di post personalizzato denominato Quotes per contenere le nostre citazioni e una tassonomia personalizzata denominata quote_categoria. Ciò consentirà un'amministrazione più pulita delle virgolette piuttosto che assegnarle a normali post e categorie.

Il gancio e la funzione Init

Utilizzeremo il seguente codice di inizializzazione per creare il nostro tipo di post personalizzato e la nostra tassonomia personalizzata:

 add_action ('init', 'suq_plugin_init'); function suq_plugin_init () $ quote_type_labels = array ('name' => _x ('Quotes', 'nome del tipo generico'), 'singular_name' => _x ('Quote', 'post type singular name'), 'add_new '=> _x (' Aggiungi nuovo preventivo ',' quota '),' add_new_item '=> __ (' Aggiungi nuovo preventivo '),' edit_item '=> __ (' Modifica preventivo '),' new_item '=> __ ( 'Aggiungi nuovo preventivo'), 'all_items' => __ ('Visualizza quotazioni'), 'view_item' => __ ('Visualizza preventivo'), 'search_items' => __ ('Query di ricerca'), 'not_found' = > __ ('Nessuna citazione trovata'), 'not_found_in_trash' => __ ('Nessuna citazione trovata nel cestino'), 'parent_item_colon' => ", 'menu_name' => 'Quotazioni'); $ quote_type_args = array ('etichette '=> $ quote_type_labels,' public '=> true,' query_var '=> true,' rewrite '=> true,' capability_type '=>' post ',' has_archive '=> true,' hierarchical '=> false, 'menu_position' => null, 'supports' => array ('title', 'editor', 'author')); register_post_type ('quotes', $ quote_type_args); $ quote_category_labels = array ('name' => _x ( 'Quote categories', 'taxonomy general name'), 'singular_name' => _x ( 'Quote', 'nome tassonomio singolare'), 'search_items' => __ ('Cerca categorie di preventivo'), 'all_items' => __ ('Tutte le categorie di preventivo'), 'parent_item' => __ ('Parent Quote Category '),' parent_item_colon '=> __ (' Parent Quote Category: '),' edit_item '=> __ (' Modifica categoria quote '),' update_item '=> __ (' Aggiorna quotazione categoria '),' add_new_item '= > __ ('Aggiungi nuova categoria di quotazioni'), 'new_item_name' => __ ('Nuovo nome preventivo'), 'menu_name' => __ ('Categorie di preventivo'),); $ quote_category_args = array ('hierarchical' => true, 'labels' => $ quote_category_labels, 'show_ui' => true, 'query_var' => true, 'rewrite' => array ('slug' => 'quote_category') ,); register_taxonomy ('quote_category', array ('quotes'), $ quote_category_args); $ default_quote_cats = array ('humor', 'politics', 'sport', 'filosofia'); foreach ($ default_quote_cats as $ cat) if (! term_exists ($ cat, 'quote_category')) wp_insert_term ($ cat, 'quote_categoria'); 

Cosa fa questo codice:

  • usa il hook di azione init di WordPress per chiamare una funzione di inizializzazione del plugin
  • registra un tipo di messaggio personalizzato denominato Quotes
  • registra una tassonomia personalizzata denominata quote_categoria e la assegna al tipo di post Quotes
  • aggiunge alcune categorie predefinite alla tassonomia quote_categoria se non esistono già

Ora avremo un menu di preventivi nella nostra bacheca di amministrazione e un modo per amministrare le citazioni e le loro categorie.


Passaggio 3 Definire un codice funzione

Successivamente, definiremo uno shortcode che ci consentirà di visualizzare (ed elaborare) il modulo di invio delle citazioni dell'utente in un post o una pagina:

 add_shortcode ('suq_form', 'suq_form_shortcode');

Qui usiamo la funzione add_shortcode di WordPress per definire uno shortcode chiamato suq_form e una funzione chiamata suq_form_shortcode che verrà chiamata ogni volta che WordPress incontra lo shortcode [suq_form] in un post o una pagina.

Prima di esaminare le funzioni di visualizzazione e elaborazione dei moduli, parliamo un po '?


Sicurezza

Poiché il nostro plugin accetta i dati dell'utente, implementiamo i seguenti meccanismi di sicurezza:

  • solo gli utenti che hanno effettuato l'accesso hanno accesso al modulo di invio post
  • usiamo nonce per verificare che i moduli siano stati generati dal nostro plugin
  • le virgolette sono inviate usando wp_insert_post che sanifica i dati prima di salvarli nel database
  • gli utenti possono solo visualizzare le proprie quotazioni e non impedisce loro di eliminare le virgolette di altri utenti

nonces

Un nonce è un numero usato una volta. Li usiamo per verificare che i dati che ci vengono restituiti provengano effettivamente dai moduli che abbiamo creato.

Qui generiamo un campo nonce usando wp_nonce_field che sarà incluso nel nostro modulo come campo nascosto:

 wp_nonce_field ('suq_form_create_quote', 'suq_form_create_quote_submitted');

Poiché ora è un campo nascosto nel nostro modulo, tornerà da noi quando il modulo verrà inviato. Possiamo quindi verificare che il nonce sia valido usando wp_verify_nonce:

 wp_verify_nonce ($ _ POST ['suq_form_create_quote_submitted'], 'suq_form_create_quote')))

Ciò restituirà vero se il nonce verifica.


Passaggio 4 La funzione principale

Questa è la funzione chiamata dal nostro shortcode. Visualizza ed elabora il modulo di invio preventivo e il modulo di quotazione / cancellazione preventivo. Lo prenderemo in pezzi di dimensioni ridotte e nel passaggio 5 esamineremo le funzioni di supporto.

 function suq_form_shortcode () if (! is_user_logged_in ()) return '

Devi essere registrato per pubblicare un preventivo.

'; global $ current_user;
  • controlla per vedere se l'utente è loggato
  • prendi la variabile WordPress $ current_user di cui avremo bisogno per ottenere il nostro ID utente
 if (isset ($ _POST ['suq_form_create_quote_submitted']) && wp_verify_nonce ($ _ POST ['suq_form_create_quote_submitted'], 'suq_form_create_quote')) $ suq_quote_author = trim ($ _ POST ['suq_quote_author']); $ suq_quote_text = trim ($ _ POST ['suq_quote_text']); if ($ suq_quote_author! = "&& $ suq_quote_text! =") $ quote_data = array ('post_title' => $ suq_quote_author, 'post_content' => $ suq_quote_text, 'post_status' => 'in sospeso', 'post_autore' => $ current_user-> ID, 'post_type' => 'quotes'); if ($ quote_id = wp_insert_post ($ quote_set)) wp_set_object_terms ($ quote_id, (int) $ _ POST ['suq_quote_category'], 'quote_categoria'); eco '

Quota creata e in attesa di moderazione!

'; else // autore o campo di testo è vuoto echo '

Quota NON salvata! Chi l'ha detto? e la quotazione non deve essere vuota.

';
  • se il modulo di creazione preventivo è stato inviato, ci sarà un campo suq_form_create_quote_submitted che è stato generato dalla nostra funzione wp_nonce_field. Possiamo quindi verificare il nonce e procedere all'elaborazione del preventivo presentato
  • fare alcune convalide di base assicurandosi che i campi di testo dell'autore citazione e del testo di citazione abbiano entrambi qualcosa, in caso contrario visualizzano un messaggio di errore
  • costruisci un array impostando lo stato del post in sospeso (l'amministratore dovrà ora approvarlo per la pubblicazione), impostando il tipo di messaggio tra virgolette (il nostro tipo di post personalizzato) e impostando l'autore dell'offerta sull'utente attualmente loggato
  • se la citazione è stata inserita correttamente, impostare la categoria per il preventivo e visualizzare un messaggio di successo
 if (isset ($ _POST ['suq_form_delete_submitted']) && wp_verify_nonce ($ _ POST ['suq_form_delete_submitted'], 'suq_form_delete')) if (isset ($ _ POST ['suq_delete_id'])) if ($ quotes_deleted = suq_delete_quotes ( $ _POST ['suq_delete_id'])) echo '

'. $ quotes_deleted. 'citazione (s) cancellata!

';
  • se è stato inviato il modulo di cancellazione preventivo, ci sarà un campo suq_form_delete_submitted che è stato generato dalla nostra funzione wp_nonce_field. Possiamo quindi verificare il nonce e procedere all'elaborazione della matrice di preventivi controllati per l'eliminazione
  • controlliamo la presenza di alcune virgolette controllate per l'eliminazione testando $ _POST ['suq_delete_id']. Se è così, li consegniamo alla funzione suq_delete_quotes (vedi Passaggio 5)
  • se le virgolette sono state cancellate, viene visualizzato un messaggio di successo
 echo suq_get_create_quote_form ($ suq_quote_author, $ suq_quote_text, $ suq_quote_category); if ($ quotes_table = suq_get_user_quotes ($ current_user-> ID)) echo $ quotes_table; 
  • produciamo il modulo di creazione delle quote
  • infine, viene generato il modulo di quotatura / cancellazione passando l'ID utente alla funzione suq_get_user_quotes (vedere il Passaggio 5)

Passaggio 5 Funzioni di supporto

Qui vedremo le funzioni che generano i moduli e la funzione che elimina le virgolette selezionate.

 function suq_get_create_quote_form ($ suq_quote_author = ", $ suq_quote_text =", $ suq_quote_category = 0) $ out. = '
'; $ out. = wp_nonce_field ('suq_form_create_quote', 'suq_form_create_quote_submitted'); $ out. = '
'; $ out. = '
'; $ out. = '
'; $ out. = suq_get_quote_categories_dropdown ('quote_category', $ suq_quote_category). '
'; $ out. = '
'; $ out. = '

'; $ out. = ''; $ out. = '
'; restituire $ out;
  • la funzione accetta 3 argomenti opzionali per ripopolare i campi del modulo. Questa è una comodità per l'utente.
  • viene emesso un campo nonce che controlliamo quando il modulo viene inviato
  • produciamo un menu a discesa per le categorie di preventivo chiamando suq_get_quote_categories_dropdown (vedi la prossima funzione)
 function suq_get_quote_categories_dropdown ($ taxonomy, $ selected) return wp_dropdown_categories (array ('taxonomy' => $ taxonomy, 'name' => 'suq_quote_category', 'selected' => $ selected, 'hide_empty' => 0, 'echo' => 0)); 
  • la funzione accetta 2 argomenti incluso l'ID dell'elemento della categoria attualmente selezionata
  • usiamo la funzione wp_dropdown_categories di WordPress per creare un menu a discesa che elenca le categorie di preventivo dalla tassonomia quote_categoria (la nostra tassonomia personalizzata)
 function suq_get_user_quotes ($ user_id) $ args = array ('author' => $ user_id, 'post_type' => 'quotes', 'post_status' => 'in sospeso'); $ posts = new WP_Query ($ args); se (! $ posts-> post_count) restituisce 0; $ out. = '

Le tue citazioni non pubblicate

'; $ out. = '
'; $ out. = wp_nonce_field ('suq_form_delete', 'suq_form_delete_submitted'); $ out. = ''; $ out. = ''; foreach ($ post-> post come $ post) $ quote_cat = get_the_terms ($ post-> ID, 'quote_categoria'); foreach ($ quote_cat come $ cat) $ quote_cat = $ cat-> nome; $ out. = wp_nonce_field ('suq_post_delete_'. $ post-> ID, 'suq_post_delete_id_'. $ post-> ID, falso); $ out. = ''; $ out. = ''; $ out. = ''; $ out. = ''; $ out. = ''; $ out. = ''; $ out. = '
DettoCitazioneCategoriaElimina
'. $ post-> post_title. ''. $ post-> post_content. ''. $ quote_cat. '
'; $ out. = ''; $ out. = '
'; restituire $ out;
  • accetta l'ID utente perché è necessario ottenere un elenco di preventivi solo per l'utente corrente
  • crea $ args per specificare il nostro utente, il tipo di post di citazioni e citazioni che sono in sospeso (non ancora pubblicate dall'amministratore)
  • eseguire una query personalizzata usando WP_Query
  • restituisce false se la nostra query non restituisce virgolette
  • avvia un modulo e genera un nonce per il modulo
  • scorrere tra le virgolette assicurandoci di prendere anche la categoria della citazione
  • generare un nonce per la casella di controllo delete quote, assegnando un nome univoco per il nonce concatenando l'ID post
  • visualizza una riga della tabella contenente le informazioni sulle quote e una casella di controllo Elimina

Perché aggiungere un nonce per ogni citazione?

I moduli possono essere manipolati nel browser per postare dati imprevisti. Nel nostro caso, a ogni casella di spunta viene assegnato il valore di un post. Ma cosa succede se un utente malintenzionato ha alterato quel valore e ha causato la nostra funzione di eliminazione per rimuovere un post che non era effettivamente elencato?

Un modo per evitarlo, è usare nonce per ogni riga di dati del post, assicurandosi che i nonces siano nominati univocamente con il valore del post da eliminare. Verifichiamo quindi la nonce al momento dell'invio del modulo per assicurarci che sia un vero valore di ritorno.

 function suq_delete_quotes ($ quotes_to_delete) $ quotes_deleted = 0; foreach ($ quotes_to_delete come $ quote) if (isset ($ _ POST ['suq_post_delete_id_'. $ quote]) && wp_verify_nonce ($ _ POST ['suq_post_delete_id_'. $ quote], 'suq_post_delete_'. $ quota)) wp_trash_post ($ citazione); $ quotes_deleted ++;  return $ quotes_deleted; 
  • la funzione accetta un array di ID di preventivo da eliminare
  • ogni preventivo è controllato per vedere se è stato generato un nonce per esso
  • se il nonce verifica, cancelliamo la citazione usando la funzione Wordpress wp_trash_post

Passo 6 Alcuni stili

Basta rilasciare queste informazioni di stile nel file style.css nella cartella del tema:

 #suq_quote_author width: 300px;  #suq_quote_text width: 400px; altezza: 100px;  #quotes font-size: 12px;  #quotes th text-align: left; 

Passaggio 7 Provalo

Attiva il plugin, inserisci lo shortcode in una pagina, accedi al tuo sito e testalo.

La sorgente completa del codice del plugin e un link al sito demo sono elencati all'inizio di questo tutorial.

La cartella di origine contiene anche un modello di pagina Wordpress con un ciclo personalizzato che mostra le quotazioni pubblicate per tutti gli utenti.


Pensieri finali

  • il plugin delle citazioni potrebbe essere migliorato offrendo un'opzione di modifica. Così com'è, gli utenti possono solo cancellare le loro virgolette
  • potresti anche includere un'opzione di caricamento dell'immagine per illuminare le cose
  • magari aggiungi alcuni campi personalizzati al tipo di post delle citazioni per informazioni sui meta virali

link utili

  • Non stampa Wordpress
  • Tipi di messaggi personalizzati
  • Tassonomie personalizzate