Permiteți utilizatorilor să se trimită la site-ul dvs. WordPress Un citate Plugin

În acest tutorial, veți afla cum să creați un plugin care să permită utilizatorilor să trimită date de formular. Veți învăța, de asemenea, despre securitate, utilizând nonces.


Ce veți învăța

  • Cum se afișează și se procesează un formular folosind un scurtcod
  • Utilizați nonces pentru a asigura depunerea utilizatorilor

E mai simplu decât crezi

Codurile scurte sunt adesea folosite pentru a afișa date simple, dar pentru că sunt într-adevăr o modalitate de a ramifica dintr-o pagină sau un post și de a executa un cod, ele pot fi folosite pentru sarcini destul de complexe, cum ar fi afișarea și prelucrarea formularelor.

Vom construi un plugin care va permite utilizatorilor conectați să:

  • trimiteți citate pentru moderare și publicare
  • vizualizează citatele lor nepublicate
  • ștergeți citatele nepublicate

Iată la ce vrem:

Toate codurile sunt disponibile în sursa pluginului din partea de sus a acestui tutorial.


Pasul 1 Configurați pluginul

Dosarul plugin WordPress este localizat în folderul de instalare WordPress la wp-content / plugins. Creați un dosar în interiorul dosarului de pluginuri. Să spunem asta submit-user-citate. Acum, creați fișierul plugin-ului însuși. Să spunem asta submit_user_quotes.php. Calea către fișierul pluginului trebuie să fie acum: wp-content / plugins / trimiteți-user-citate / submit_user_quotes.php

Fiecare plugin Wordpress are nevoie de câteva informații antet, astfel încât WordPress să o poată identifica și să o pună la dispoziție pe pagina de plugin a tabloului de bord.

  

Puteți edita aceste informații conform cerințelor dvs..

Veți vedea pluginul afișat astfel:


Pasul 2 Funcția de inițializare a pluginului

Vom crea un tip de post personalizat numit Citate pentru a ne păstra cotațiile și o taxonomie personalizată numită quote_category. Acest lucru va permite o administrare mai curată a cotelor decât să le alocați pur și simplu posturilor și categoriilor normale.

Cârligul și funcția init

Vom folosi următorul cod de inițiere pentru a crea tipul de post personalizat și taxonomia personalizată:

 add_action ('init', 'suq_plugin_init'); funcția suq_plugin_init () $ quote_type_labels = array ('nume' => _x ('Citate', 'nume post general'), 'singular_name' => '=> _x (' Adăugați o nouă cotație ',' citat '),' add_new_item '=> __ (' 'Citează cotația'), 'all_items' => __ ('View Quotes'), 'view_item' => __ (' > __ ("Nu au fost găsite citate"), "not_found_in_trash" => __ ("Nu s-au găsit citate în coșul de gunoi"), "parent_item_colon" => "," menu_name "=>" Citate ") $ quote_type_args = '=> true,' rewrite '=> true,' capability_type '=>' post ',' has_archive '=> true,' hierarchical ' 'quote_category_labels = array (' name '=> _x ("nume" => "Categorii de citare", "nume general de taxonomie"), "singular_name" => _x ( ("Categorii de cotație de căutare"), "all_items" => __ ("Toate categoriile de cotatii"), "parent_item" => __ (" '', 'update_item' => __ ('Categoria de cotație de actualizare'), 'add_new_item' = 'parent_item_colon' => > __ ("Adăugați o nouă categorie de citare"), "new_item_name" => __ ("Nume nou de cotă"), "nume_menu" => __ ("Categorii de cotatii");); $ 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 ('citate'), $ quote_category_args); $ default_quote_cats = array ("umor", "politică", "sport", "filozofie"); foreach ($ default_quote_cats ca $ cat) if (! term_exists ($ cat, 'quote_category')) wp_insert_term ($ cat, 'quote_category'); 

Ce face acest cod:

  • utilizează cârligul de acțiune init WordPress pentru a apela o funcție de inițializare a pluginului
  • înregistrează un tip de post personalizat numit Citate
  • înregistrează o taxonomie personalizată numită quote_category și o atribuie tipului postului Citate
  • adaugă unele categorii implicite la taxonomia quote_category dacă acestea nu există deja

Acum vom avea un meniu Cotații în tabloul de bord al adminului nostru și o modalitate de a administra ghilimele și categoriile acestora.


Pasul 3 Definiți un cod scurt

Apoi, vom defini un cod scurt care ne va permite să afișăm (și să procesăm) formularul de trimitere a cotelor de utilizator într-o postare sau o pagină:

 add_shortcode ('suq_form', 'suq_form_shortcode');

Aici folosim funcția WordPress add_shortcode pentru a defini un scurtcod numit suq_form și o funcție numită suq_form_shortcode care va fi apelată ori de câte ori WordPress întâlnește codul scurt [suq_form] într-o postare sau o pagină.

Înainte de a ne uita la funcțiile de afișare și prelucrare a formularului, să vorbim puțin despre?


Securitate

Deoarece pluginul acceptă date de la utilizator, implementăm următoarele mecanisme de securitate:

  • numai utilizatorii conectați au acces la formularul de trimitere a mesajelor
  • folosim noncesuri pentru a verifica dacă formularele au fost generate de pluginul nostru
  • citatele sunt trimise utilizând wp_insert_post care dezinstalează datele înainte de a le salva în baza de date
  • utilizatorii își pot vedea numai propriile cotații și nu le pot împiedica să ștergă citatele altor utilizatori

Nonces

Un nonce este un număr folosit o dată. Le folosim pentru a verifica dacă datele care ne revin sunt de fapt din formele pe care le-am creat.

Aici generăm un câmp nonce folosind wp_nonce_field care va fi inclus în forma noastră ca un câmp ascuns:

 wp_nonce_field ('suq_form_create_quote', 'suq_form_create_quote_submitted');

Pentru că acum este un câmp ascuns în forma noastră, se va întoarce la noi când se va trimite formularul. Apoi, putem verifica dacă nonce este valid utilizând wp_verify_nonce:

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

Asta se va întoarce adevărat dacă verificarea nu este confirmată.


Pasul 4 Funcția principală

Aceasta este funcția numită de codul nostru scurt. Afișează și procesează formularul de trimitere a cotei și formularul de listare / ștergere a cotelor. O vom lua în bucăți de mâncare și în pasul 5 vom analiza funcțiile de ajutor.

 funcția suq_form_shortcode () if (! is_user_logged_in ()) return '

Trebuie sa fiti logat pentru a posta un citat.

„; global $ current_user;
  • verificați dacă utilizatorul este conectat
  • apuca variabila WordPress $ current_user de care avem nevoie pentru a obține ID-ul nostru de utilizator
 ($ _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']); dacă "$ suq_quote_author! =" && $ suq_quote_text! = ") $ quote_data = array ('post_title' => $ suq_quote_author, 'post_content' => $ suq_quote_text, 'post_status' => $ current_user-> ID, 'post_type' => 'citate'); dacă quote_id = wp_insert_post ($ quote_data)) wp_set_object_terms ($ quote_id, (int) $ _ POST ['suq_quote_category'], 'quote_category'); echo "

Citat creat și așteptând moderare!

„; altceva // câmpul autor sau text este ecou gol '

Citat NU este salvat! Cine a spus asta? și Citat nu trebuie să fie goale.

„;
  • dacă forma de creare a cotelor a fost trimisă, va exista un câmp suq_form_create_quote_submitted care a fost generat de funcția wp_nonce_field. Apoi, putem verifica nonce și putem proceda la procesarea ofertei trimise
  • efectuați o validare de bază, asigurându-vă că atât câmpul de autor al citării, cât și câmpul de text citat au ceva în ele, dacă nu, afișați mesajul de eroare
  • să construiască o matrice care să stabilească starea postului în așteptare (administratorul va trebui să o aprobe acum pentru publicare), setarea tipului de post la ghilimele (tipul postului nostru personalizat) și setarea autorului citării la utilizatorul conectat în prezent
  • dacă cotația a fost introdusă cu succes, setați categoria pentru cotație și afișați un mesaj de succes
 dacă isset ($ _POST ['suq_form_delete_submitted']) && wp_verify_nonce ($ _ POST ['suq_form_delete_submitted'], 'suq_form_delete')) if ($ quote_deleted = suq_delete_quotes $ _POST ['suq_delete_id'])) echo '

". $ quotes_deleted. "citatele au fost șterse!

„;
  • dacă forma de ștergere a cotelor a fost trimisă, va exista un câmp suq_form_delete_submitted care a fost generat de funcția wp_nonce_field. Apoi, putem verifica nonce și continuăm să procesăm matricea de citate verificate pentru ștergere
  • verificăm că avem de fapt câteva ghilimele verificate pentru ștergere prin testarea $ _POST ['suq_delete_id']. În acest caz, le trimitem către funcția suq_delete_quotes (vezi Pasul 5)
  • dacă citatele au fost șterse, afișăm un mesaj de succes
 echo suq_get_create_quote_form ($ suq_quote_author, $ suq_quote_text, $ suq_quote_category); dacă ($ quotes_table = suq_get_user_quotes ($ curent_user-> ID)) echo $ quotes_table; 
  • ieșim din formularul de creare a cotelor
  • în cele din urmă, emise formularul de listare / ștergere a cotațiilor prin transmiterea ID-ului utilizatorului la funcția suq_get_user_quotes (a se vedea pasul 5)

Pasul 5 Funcțiile Helper

Aici vom examina funcțiile care generează formularele și funcția care șterge ghilimele selectate.

 funcția 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_submite'); $ out = '
„; $ out = '
„; $ out = '
„; $ out. = suq_get_quote_categories_dropdown ('quote_category', $ suq_quote_category). '
„; $ out = '
„; $ out = '

„; $ out = '„; $ out = '
„; returnați $ out;
  • funcția acceptă trei argumente opționale pentru repopularea câmpurilor formularului. Aceasta este o comoditate pentru utilizator.
  • un camp nonce este ieșire pe care o verificăm când este trimis formularul
  • vom scoate un dropdown pentru categoriile de citare prin apelul suq_get_quote_categories_dropdown (vezi funcția următoare)
 funcția suq_get_quote_categories_dropdown (taxonomie $, selectată $) return wp_dropdown_categories (array ('taxonomy' => $ taxonomy, 'name' => 'suq_quote_category', 'selected' => $ selected, 'hide_empty' => 0)); 
  • funcția acceptă 2 argumente, inclusiv elementul ID al categoriei selectate în prezent
  • folosim funcția WordPress wp_dropdown_categories pentru a crea o meniuri care afișează categoriile de citare din taxonomia quote_category (taxonomia noastră personalizată)
 funcția suq_get_user_quotes ($ user_id) $ args = array ('author' => $ user_id, 'post_type' => 'citate', 'post_status' => 'în așteptare'); $ posts = nou WP_Query ($ args); dacă (! $ posts-> post_count) retur 0; $ out = '

Citatele dvs. nepublicate

„; $ out = '
„; $ out. = wp_nonce_field ('suq_form_delete', 'suq_form_delete_submite'); $ out = '„; $ out = '„; foreach ($ posturi-> postări ca $ post) $ quote_cats = get_the_terms ($ post-> ID, 'quote_category'); foreach ($ quote_cats ca $ cat) $ quote_cat = $ cat-> nume; $ out = = wp_nonce_field ('suq_post_delete_'. $ post-> ID, 'suq_post_delete_id_'. $ post-> ID, false); $ out = '„; $ out = '„; $ out = '„; $ out = '„; $ out = '„; $ out = '„; $ out. = '
A spus ByCitatCategorieȘterge
". $ post-> post_title. '". $ post-> post_content. '". $ quote_cat. '
„; $ out = '„; $ out = '
„; returnați $ out;
  • acceptați ID-ul de utilizator, deoarece trebuie să obțineți o listă de cotații numai pentru utilizatorul curent
  • creați $ args pentru a specifica utilizatorul nostru, tipul postului de citate și citate care sunt în așteptare (încă nepublicate de admin)
  • executați o interogare personalizată folosind WP_Query
  • returnează false dacă interogarea noastră nu returnează nici un citat
  • începeți un formular și generați un nonce pentru formular
  • buclă prin citate, asigurându-ne că luăm de asemenea categoria citatului
  • generați o casetă de validare nonce pentru ștergerea citării, atribuind un nume unic pentru nonce prin concatenarea codului postului
  • ieșiți un rând de masă care conține informația despre citat, precum și o casetă de selectare ștergere

De ce adăugați un nonce pentru fiecare cotă?

Formularele pot fi manipulate în browser pentru a publica date neașteptate. În cazul nostru, în fiecare casetă de ștergere este atribuită valoarea unei postări. Dar dacă un utilizator rău intenționat a modificat acea valoare și a determinat funcția de ștergere să elimine o postare care nu a fost înregistrată?

O modalitate de a evita acest lucru este de a utiliza nonces pentru fiecare rând de date post, asigurându-se că noncesurile sunt denumite în mod unic cu valoarea postului care urmează să fie ștearsă. Apoi, verificăm nonce după trimiterea formularului pentru a ne asigura că este o valoare reală de returnare.

 funcția suq_delete_quotes ($ quotes_to_delete) $ quotes_deleted = 0; foreach ($ quotes_to_delete ca $ quote) if (isset ($ _ POST ['suq_post_delete_id_'. $ quote]) && wp_verify_nonce ($ _ POST ['suq_post_delete_id_'. citat); $ cotes_deleted ++;  returnează $ quotes_deleted; 
  • funcția acceptă o serie de ID-uri de citare pentru a fi șterse
  • fiecare cod de identificare este verificat pentru a vedea dacă a fost generat un nonce pentru acesta
  • în cazul în care nonce verifică, vom stropi citat utilizând funcția Wordpress wp_trash_post

Pasul 6 Un stil

Puneți doar informațiile despre acest stil în fișierul style.css din dosarul tematic:

 #suq_quote_author width: 300px;  #suq_quote_text width: 400px; height: 100px;  #cotări font-size: 12px;  #quotes th text-aliniere: stânga; 

Pasul 7 Încearcă-l

Activați pluginul, plasați codul scurt pe o pagină, conectați-vă la site-ul dvs. și testați-l.

În partea de sus a acestui tutorial este afișată sursa codului complet de plugin și un link de site demo.

Dosarul sursă conține, de asemenea, un șablon de pagină Wordpress cu o buclă personalizată care afișează citate publicate pentru toți utilizatorii.


Gândurile finale

  • pluginul de citate ar putea fi îmbunătățit prin oferirea unei opțiuni de editare. Așa cum este, utilizatorii pot șterge doar citatele lor
  • puteți include, de asemenea, o opțiune de încărcare a imaginii pentru a lumina lucrurile
  • adăugați probabil câteva câmpuri personalizate la tipul postului de citate pentru informații despre meta

Link-uri utile

  • Wordpress nonces
  • Tipuri personalizate de postări
  • Taxonomii personalizate
Cod