Permiteți utilizatorilor să trimită imagini pe site-ul dvs. WordPress

În acest tutorial, veți învăța cum să creați un plugin care permite utilizatorilor să trimită imagini și să le încarce în biblioteca media WordPress. De asemenea, veți afla cum să ștergeți corect imaginile din biblioteca media WordPress, precum și să efectuați o validare de bază a imaginilor încărcate.


Anterior ...

Acest tutorial este solicitat de unii utilizatori care au găsit interesant plugin-ul meu de tutorial, dar au fost deosebit de interesați să afle cum ar putea fi folosită aceeași tehnică pentru a încărca imagini de pe interfață. Deci, iată o reiterare a tutorialului care face asta. Pentru informații detaliate despre configurarea plugin-ului, codurile scurte și noncesurile, consultați tutorialul anterior.

Pluginul va:

  • afișați o formă de încărcare a imaginii utilizând un scurtcod
  • accepta numai imagini cu un anumit tip și dimensiune maximă
  • adăugați un tip de post personalizat pentru imaginile utilizatorilor
  • adăugați imagini în biblioteca media WordPress cu o subtitrare adecvată
  • afișați imagini nepublicate
  • permite utilizatorilor să ștergă imaginile nepublicate

Vom folosi imaginea miniaturală postată de WordPress (aka Imagine recomandată) meta pentru a ține imaginea pentru fiecare post. De asemenea, este mai ușor să afișați și să lucrați cu imaginea noastră, deoarece putem folosi funcțiile post_thumbnail.

Iată la ce vrem:

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


Pasul 1 Configurați pluginul

Creați un fișier cu plugin numit submit_user_images.php în wp-content / plugins / trimiteți-user-imagini director.

Consultați sursa pluginului pentru informații despre antetul pluginului.


Pasul 2 Funcția de inițializare a pluginului

Vom crea un tip de post personalizat numit user_images pentru a ține imaginile utilizatorilor și o taxonomie personalizată numită user_image_category. Acest lucru va permite o administrare mai curată a imaginilor 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', 'sui_plugin_init'); Funcția sui_plugin_init () $ image_type_labels = array ('nume' => _x ('Imagini utilizator', 'generic nume post'), 'singular_name' => 'add_new' => _x ('Adăugați o nouă imagine a utilizatorului', 'imagine'), 'add_new_item' => "View_item" => __ ('Vezi imaginea utilizatorului'), 'search_items' => __ ('Căutare Imaginile utilizatorilor "), 'not_found' => __ ('Nu s-au găsit imagini ale utilizatorilor'), 'not_found_in_trash' => Imagine utilizator '); $ image_type_args = array (' etichete '=> $ image_type_labels,' public '=> true,' query_var '=> true,' rewrite '=> true,' capability_type '=> '=> true,' hierarchical '=> false,' map_meta_cap '=> true,' menu_position '=> null,' supports '=> ; register_post_type ('user_images', $ image_type_args); $ image_catego (nume utilizator taxonomie), 'search_items' => __ ('Nume utilizator', 'taxonomie generică nume'), "Căutare de categorii de utilizatori"), 'all_items' => __ ('Toate categoriile de imagini ale utilizatorilor'), 'parent_item' => __ (" : '),' edit_item '=> __ (' Adăugați o nouă categorie de imagine utilizator '),' update_item '=> 'new_item_name' => __ ('New Image Image Name'), 'nume_menu' => __ ("Categorii de imagini utilizator");); $ image_category_args = array ('hierarchical' => true, 'etichete' => $ image_category_labels, 'show_ui' => true, 'query_var' => true, 'rewrite' => array ('slug' => 'user_image_category') ,); register_taxonomy ('sui_image_category', array ('user_images'), $ image_category_args); $ default_image_cats = array ("umor", "peisaje", "sport", "oameni"); foreach ($ default_image_cats ca $ cat) if (! term_exists ($ cat, 'sui_image_category')) wp_insert_term ($ cat, 'sui_image_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 user_images
  • înregistrează o taxonomie personalizată numită user_image_category și o atribuie tipului postului user_images
  • adaugă unele categorii implicite la taxonomia user_image_category dacă acestea nu există deja

Acum vom avea un meniu Imagini utilizator în tabloul de bord al adminului și o modalitate de a administra imaginile utilizatorilor și categoriile acestora.


Pasul 3 Configurați câteva setări prestabilite

Va trebui să facem o validare de bază, deci să definim două constante pentru o utilizare ulterioară:

 define ('MAX_UPLOAD_SIZE', 200000); define ('TYPE_WHITELIST', serializează (array ('image / jpeg', 'image / png', 'image / gif')));

Pasul 4 Definiți un cod scurt

Vom defini un cod scurt care ne va permite să afișăm (și să procesăm) formularul de trimitere a imaginilor utilizatorilor într-o postare sau o pagină:

 add_shortcode ('sui_form', 'sui_form_shortcode');

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 imaginilor
  • folosim noncesuri pentru a verifica dacă formularele au fost generate de pluginul nostru
  • imaginile sunt trimise utilizând wp_insert_post care dezinstalează datele înainte de a le salva în baza de date
  • utilizatorii pot vizualiza doar propriile imagini și le pot împiedica să ștergă postările de imagine ale altor utilizatori

Pasul 5 Funcția principală

Aceasta este funcția numită de codul nostru scurt. Afișează și procesează formularul de trimitere a imaginii și formularul de afișare / ștergere a imaginilor. O vom lua în bucăți de mâncare și în pasul 6 vom examina funcțiile de ajutor.

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

Trebuie să vă conectați pentru a trimite o imagine.

„; 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
 dacă este ($ _POST ['sui_upload_image_form_submitted']) && wp_verify_nonce ($ _ POST ['sui_upload_image_form_submitted'], 'sui_upload_image_form')) $ result = sui_parse_file_errors ($ _POST ['sui_image_caption' ; dacă ($ rezultat ['error']) echo '

EROARE: ". $ rezultat ['eroare']. '

„; altfel $ user_image_data = array ('post_title' => $ rezultat ['caption'], 'post_status' => 'în așteptare', 'post_author' => $ current_user-> ID, 'post_type' => 'user_images') ; dacă $ post_id = wp_insert_post ($ user_image_data)) sui_process_image ('sui_image_file', $ post_id, $ result ['caption']); wp_set_object_terms ($ post_id, (int) $ _ POST ['sui_image_category'], 'sui_image_category');
  • dacă forma de imagine a fost trimisă, va exista un câmp sui_upload_image_form_submitted care a fost generat de funcția wp_nonce_field. Apoi, putem verifica nonce și continuăm să procesăm imaginea trimisă
  • efectuați o validare trecând intrarea fișierului (unde sunt stocate datele de imagine încărcate) și datele de intrare a legendelor către o funcție de validare, sui_parse_file_errors și afișând toate erorile returnate
  • să construiască o matrice care să stabilească starea postului în așteptare (administratorul va trebui să o aprobe pentru publicare), setând tipul postului la user_images (tipul postului nostru personalizat) și setând autorul postării de imagine la utilizatorul conectat în prezent
  • dacă postarea imaginii a fost inserată cu succes, salvați imaginea în biblioteca media WordPress (sui_process_image) și setați în final categoria pentru postarea imaginii și afișați un mesaj de succes
 dacă isset ($ _POST ['sui_form_delete_submitted']) && wp_verify_nonce ($ _ POST ['sui_form_delete_submitted'], 'sui_form_delete')) if ($ user_images_deleted = sui_delete_user_images $ _POST ['sui_image_delete_id'])) echo '

". $ user_images_deleted. "imaginile au fost șterse!

„;
  • dacă forma de ștergere a imaginii a fost trimisă, va exista un câmp sui_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 imagini verificate pentru ștergere
  • verificăm că de fapt avem câteva imagini verificate pentru ștergere prin testarea $ _POST ['sui_image_delete_id']. În acest caz, le trimitem la funcția sui_delete_user_images (a se vedea pasul 6)
  • dacă imaginile au fost șterse, afișăm un mesaj de succes
 echo sui_get_upload_image_form ($ sui_image_caption = $ _POST ['sui_image_caption'], $ sui_image_category = $ _POST ['sui_image_category']); dacă ($ user_images_table = sui_get_user_images_table ($ curent_user-> ID)) echo $ user_images_table; 
  • ieșim din formularul de încărcare a imaginii
  • în cele din urmă, scoatem formularul de listare / ștergere a imaginilor prin transmiterea ID-ului utilizatorului la funcția sui_get_user_images_table (consultați pasul 6)

Pasul 6 Funcțiile Helper

Aici vom examina funcțiile care generează formularele, adăugăm imaginile în biblioteca media și funcția care șterge imaginile selectate.

 funcția sui_get_upload_image_form ($ sui_image_caption = ", $ sui_image_category = 0) $ out ="; $ out = '
„; $ out = = wp_nonce_field ('sui_upload_image_form', 'sui_upload_image_form_submitted'); $ out = '
„; $ out = '
„; $ out = '
„; $ out = = sui_get_image_categories_dropdown ('sui_image_category', $ sui_image_category). '
„; $ out = '
„; $ out = '
„; $ out = '„; $ out = '
„; returnați $ out;
  • funcția acceptă două 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 emite un drop-down pentru categoriile de imagini apelând sui_get_image_categories_dropdown (vezi funcția următoare)
 funcția sui_get_image_categories_dropdown (taxonomie $, selectată) return wp_dropdown_categories (array ('taxonomy' => $ taxonomie, 'name' => 'sui_image_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 imagini ale utilizatorilor din taxonomia user_image_category (taxonomia noastră personalizată)
 funcția sui_get_user_images_table ($ user_id) $ args = array ('author' => $ user_id, 'post_type' => 'user_images', 'post_status' => 'în așteptare'); $ user_images = nou WP_Query ($ args); dacă (! $ user_images-> post_count) retur 0; $ out = "; $ out. = '

Imaginile dvs. nepublicate - Faceți clic pentru a vedea dimensiunea completă

„; $ out = '
„; $ out = = wp_nonce_field ('sui_form_delete', 'sui_form_delete_submite'); $ out = '„; $ out = '„; foreach ($ user_images-> mesaje ca $ user_image) $ user_image_cats = get_the_terms ($ user_image-> ID, 'sui_image_category'); foreach ($ user_image_cats ca $ cat) $ user_image_cat = $ cat-> nume; $ post_thumbnail_id = get_post_thumbnail_id ($ user_image-> ID); $ out. = wp_nonce_field ('sui_image_delete_'. $ user_image-> ID, 'sui_image_delete_id_'. $ user_image-> ID, fals); $ out = '„; $ out = '„; $ out = '„; $ out = '„; $ out = '„; $ out = '„; $ out. = '
ImagineLegendăCategorieȘterge
". wp_get_attachment_link ($ post_thumbnail_id, "miniatură"). '". $ user_image-> post_title. '". $ user_image_cat. '
„; $ out = '„; $ out = '
„; returnați $ out;
  • acceptați ID-ul de utilizator, deoarece trebuie să obțineți o listă de imagini de utilizator numai pentru utilizatorul curent
  • creați $ args pentru a specifica utilizatorul nostru, tipul postului de user_images și imaginile utilizatorului care sunt în așteptare (încă nu au fost publicate de admin)
  • executați o interogare personalizată folosind WP_Query
  • returnează false dacă interogarea noastră nu returnează imagini de utilizator
  • începeți un formular și generați un nonce pentru formular
  • buclă prin posturile de imagini asigurându-vă că luăm de asemenea categoria postului de imagine
  • generați o casetă de selectare nonce pentru ștergerea imaginii, atribuind un nume unic pentru nonce prin concatenarea ID-ului postului de imagine al utilizatorului
  • ieșiți un rând de tabelă care conține informațiile despre postarea imaginii, precum și o casetă de selectare ștergere

De ce adăugați un nonce pentru fiecare postare de imagine?

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 sui_delete_user_images ($ images_to_delete) $ images_deleted = 0; foreach ($ images_to_delete ca $ user_image) if (isset ($ _ POST ['sui_image_delete_id_'. $ user_image]) && wp_verify_nonce ($ _ POST ['sui_image_delete_id_'. $ user_image] post_thumbnail_id = get_post_thumbnail_id ($ user_image)) wp_delete_attachment ($ post_thumbnail_id);  wp_trash_post ($ user_image); $ images_deleted ++;  retur $ images_deleted; 
  • funcția acceptă o serie de ID-uri pentru postarea imaginilor pentru a fi șterse
  • fiecare cod postal de imagine este verificat pentru a vedea dacă a fost generat un nonce pentru acesta
  • dacă neefectuarea verifică, ștergem atașamentul de imagine care există în biblioteca media prin transmiterea id-ului miniaturii imaginii postului la funcția WordPress wp_delete_attachment
  • noi, de asemenea, gunoi postul de imagine folosind funcția WordPress wp_trash_post

Dar nu atașarea miniaturilor se șterge când postul este tras?

Nu și asta pentru că WordPress stochează atașamentele ca posturi obișnuite în tabela de baze de date. Arătați-vă singur: toate fișierele atașate sunt stocate în tabelul de posturi cu un post_type de atașament. Ștergerea pur și simplu a unei postări de tip user_images nu șterge atașamentul său miniatural. Rămâne în biblioteca media pentru utilizare ulterioară dacă nu o ștergem în mod special cu wp_delete_attachment. Pentru scopurile noastre, am crezut că este mai bine să eliminați atașamentul atunci când postul utilizatorului a fost șters.


Pasul 7 Funcțiile de manipulare a imaginilor

Să ne reamintim cum arată ieșirea unui fișier html atunci când postarea unei imagini în scriptul dvs.:

 Array ([name] => ref_blind.jpg [type] => imagine / jpeg [tmp_name] => / tmp / php79xI4e [error] => 0 [size = 106290)

Transmitem matricea respectivă la funcția sui_process_image, împreună cu id-ul postului de imagine salvat al utilizatorului și imaginea de imagine santizată.

 funcția sui_process_image ($ file, $ post_id, $ caption) require_once (ABSPATH. "wp-admin" ./include/image.php); require_once (ABSPATH. "wp-admin" ./include/file.php); requ_once (ABSPATH. "wp-admin" ./includes/media.php); $ attachment_id = media_handle_upload ($ fișier, $ post_id); update_post_meta ($ post_id, '_thumbnail_id', $ attachment_id); $ attachment_data = array ('ID' => $ atașament_id, 'post_excerpt' => caption); wp_update_post ($ attachment_data); returnează $ attachment_id; 
  • trebuie să includeți scripturile de administrare WordPress care gestionează încărcarea imaginilor în spatele scenei
  • numim funcția media_handle_upload (care face parte din media.php), trecând matricea fișierului încărcat și id post
  • acum avem un id de atașament pe care îl putem folosi cu update_post_meta pentru a atribui atașamentul postului ca miniatură. Notă: "_thumbnail_id" se referă la câmpul meta miniatură internă (Imagine recomandată). Câmpurile interne Wordpress încep cu o subliniere.
  • vom folosi id-ul atașamentului pentru a actualiza legenda atașamentului utilizând funcția wp_update_post

Deoarece atașamentele sunt doar postări obișnuite, dacă actualizăm câmpul post_excerpt pentru atașament, actualizăm efectiv câmpul de legendă al atașamentului așa cum se vede în ecranul de editare a bibliotecii media.

Funcția de validare

De asemenea, validăm matricea de fișiere și captura de imagine furnizată de utilizator cu funcția sui_parse_file_errors.

 funcția sui_parse_file_errors ($ file = ", $ image_caption) $ result ['error'] =" Nu ($ file ['error']) fișier încărcat sau a existat o eroare de încărcare! "; return $ result; $ image_caption = trim (preg_replace ('/ [^ a-zA-Z0-9 \ s] + /', $ image_caption); dacă $ ($ image_caption == ") $ result ['error'] =" Captionul poate conține doar litere, numere și spații! "; $ result_title = $ image_caption; $ image_data = "$ image ['tmp_name']); dacă ! in_array ($ image_data ['mime']), $ unserialize (TYPE_WHITELIST))) $ result ['error'] = 'Imaginea trebuie să fie jpeg, png sau gif ! '; elseif (($ file [' size ']> MAX_UPLOAD_SIZE)) $ rezultat [' error '] =' Imaginea ta a fost '. MAX_UPLOAD_SIZE "octeți." Return $ result;
  • verificați elementul de eroare al matricei de fișiere pentru o eroare de încărcare html, dacă găsiți returnați o matrice de rezultate cu eroare
  • rulați unele regex pe captionul imaginii pentru a elimina toate informațiile decât spațiile și spațiile alfanumerice, înlocuind cu spații pentru lizibilitate
  • dacă vom termina cu o subtitrare goală după o dezintoxicare, vom întoarce o eroare
  • verificați tipul de imagine intern (nu aveți încredere în extensia de fișier) utilizând funcția de tip getimages PHP în funcție de constanta TYPE_WHITELIST
  • verificați dimensiunea imaginii față de constanta MAX_UPLOAD_SIZE

Pasul 8 Unele stiluri

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

 #sui_upload_image_form #sui_image_caption lățime: 500px;  #user_images font-size: 12px;  #user_images a text-align: left;  #user_images td vertical-aliniere: mijloc;  #user_images td intrare margine: 0px; 

Pasul 9 Încearcă-l

Activați pluginul, plasați codul scurt pe o pagină, conectați-vă la site-ul dvs. și testați-l. Când încărcați o imagine, veți vedea o nouă postare în meniul de administrare Imagini utilizator. Va fi în așteptarea publicării. De asemenea, veți vedea o nouă imagine afișată în biblioteca media, atașată la postarea dvs. nouă și cu titlul așa cum este prevăzut.

Î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ă imaginile publicate pentru toți utilizatorii.


Gândurile finale

S-ar putea să doriți o validare mai strictă a încărcărilor de imagini. Rețineți că acceptați date de la utilizatori care ar putea încărca în mod accidental sau rău intenționat fișiere necorespunzătoare. Verificarea tipului și dimensiunii fișierului este un început bun.

De asemenea, am creat legenda atașament prin actualizarea câmpului post_excerpt al atașamentului. De asemenea, puteți seta o descriere a atașamentului utilizând câmpul post_content al atașamentului.

Cod