Sta gebruikers toe om afbeeldingen naar uw WordPress-site te verzenden

In deze zelfstudie leert u hoe u een plug-in maakt waarmee gebruikers afbeeldingen kunnen verzenden en uploaden naar de WordPress mediabibliotheek. U leert ook hoe u afbeeldingen correct uit de WordPress mediabibliotheek verwijdert en wat basisvalidatie uitvoert op geüploade afbeeldingen.


Eerder…

Deze tutorial is op verzoek van sommige gebruikers die mijn tutorial met interessante quotes voor plug-ins interessant vonden, maar waren vooral benieuwd hoe dezelfde techniek kan worden gebruikt om afbeeldingen van de frontend te uploaden. Dus hier is een herhaling van die tutorial die precies dat doet. Zie de vorige zelfstudie voor meer informatie over het instellen van plug-ins, shortcodes en nonces.

De plug-in zal:

  • toon een afbeelding upload vorm met behulp van een shortcode
  • accepteer alleen afbeeldingen van een bepaald type en maximale grootte
  • voeg een aangepast berichttype toe voor gebruikersafbeeldingen
  • voeg afbeeldingen toe aan de WordPress mediabibliotheek met een juiste bijlagebijschrift
  • niet-gepubliceerde afbeeldingen weergeven
  • sta gebruikers toe hun ongepubliceerde afbeeldingen te verwijderen

We gebruiken het ingebouwde WordPress miniatuur (of Featured Image) meta-veld om de afbeelding voor elke post te houden. Dit maakt het ook eenvoudiger om onze afbeelding weer te geven en te bewerken, omdat we de functies post_thumbnail kunnen gebruiken.

Dit is waar we naar streven:

Alle code is beschikbaar in de pluginbron bovenaan deze zelfstudie.


Stap 1 Stel de plug-in in

Maak een plugin-bestand met de naam submit_user_images.php in de wp-content / plugins / submit-user-images directory.

Raadpleeg de plugin-bron voor informatie over de plug-in header.


Stap 2 Plugin initialisatie functie

We gaan een aangepast berichttype met de naam user_images maken om onze gebruikersafbeeldingen en een aangepaste taxonomie met de naam user_image_category op te slaan. Hierdoor wordt een schoner beheer van de afbeeldingen mogelijk gemaakt dan door ze gewoon toe te wijzen aan normale berichten en categorieën.

De beginhaak en -functie

We zullen de volgende initialisatiecode gebruiken om ons aangepaste berichttype en aangepaste taxonomie te maken:

 add_action ('init', 'sui_plugin_init'); function sui_plugin_init () $ image_type_labels = array ('name' => _x ('User images', 'post type general name'), 'singular_name' => _x ('User Image', 'post type singular name'), 'add_new' => _x ('Nieuwe gebruikersafbeelding toevoegen', 'afbeelding'), 'add_new_item' => __ ('Nieuwe gebruikersafbeelding toevoegen'), 'edit_item' => __ ('Edit User Image'), 'new_item '=> __ (' Nieuwe gebruikersafbeelding toevoegen '),' all_items '=> __ (' View User Images '),' view_item '=> __ (' View User Image '),' search_items '=> __ (' Zoeken User Images '),' not_found '=> __ (' Geen gebruikersafbeeldingen gevonden '),' not_found_in_trash '=> __ (' Geen gebruikersafbeeldingen gevonden in Prullenbak '),' parent_item_colon '=> ",' menu_name '=>' User Images '); $ image_type_args = array (' labels '=> $ image_type_labels,' public '=> true,' query_var '=> true,' rewrite '=> true,' capability_type '=>' post ',' has_archive '=> true,' hierarchical '=> false,' map_meta_cap '=> true,' menu_position '=> null,' supports '=> array (' title ',' editor ',' author ',' thumbnail ')) ; register_post_type ('user_images', $ image_type_args); $ image_catego ry_labels = array ('name' => _x ('User Image Categories', 'taxonomy general name'), 'singular_name' => _x ('User Image', 'taxonomy singular name'), 'search_items' => __ ( 'Search User Image Categories'), 'all_items' => __ ('Alle gebruikersbeeldcategorieën'), 'parent_item' => __ ('Parent User Image Category'), 'parent_item_colon' => __ ('Parent User Image Category : '),' edit_item '=> __ (' Edit User Image Category '),' update_item '=> __ (' Update User Image Category '),' add_new_item '=> __ (' Nieuwe categorie gebruikersafbeelding toevoegen '), 'new_item_name' => __ ('Nieuwe gebruikersnaam Image Name'), 'menu_name' => __ ('User Image Categories'),); $ image_category_args = array ('hierarchical' => true, 'labels' => $ 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 ('humor', 'landschappen', 'sport', 'mensen'); foreach ($ default_image_cats als $ cat) if (! term_exists ($ cat, 'sui_image_category')) wp_insert_term ($ cat, 'sui_image_category'); 

Wat deze code doet:

  • gebruikt de WordPress init actiehaak om een ​​plugin-initialisatiefunctie aan te roepen
  • registreert een aangepast berichttype met de naam user_images
  • registreert een aangepaste taxonomie met de naam user_image_category en wijst deze toe aan het berichttype user_images
  • voegt een aantal standaardcategorieën toe aan de taxonomie User_image_category als deze nog niet bestaat

We hebben nu een menu Gebruikersafbeeldingen in ons beheerdersdashboard en een manier om gebruikersafbeeldingen en hun categorieën te beheren.


Stap 3 Stel een aantal standaardwaarden in

We zullen wat basisvalidatie moeten doen, dus laten we twee constanten definiëren voor later gebruik:

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

Stap 4 Definieer een shortcode

We zullen een shortcode definiëren waarmee we het formulier voor het verzenden en verzenden van gebruikersafbeeldingen in een bericht of pagina kunnen weergeven (en verwerken):

 add_shortcode ('sui_form', 'sui_form_shortcode');

Veiligheid

Omdat onze plug-in gegevens van de gebruiker accepteert, implementeren we de volgende beveiligingsmechanismen:

  • alleen ingelogde gebruikers hebben toegang tot het aanmeldingsformulier voor afbeeldingen
  • we gebruiken nonces om te controleren of de formulieren zijn gegenereerd door onze plug-in
  • afbeeldingen worden ingediend met behulp van wp_insert_post, die de gegevens opschoont voordat deze in de database worden opgeslagen
  • gebruikers kunnen alleen hun eigen afbeeldingen bekijken en nonces voorkomen dat ze de beeldposten van een andere gebruiker verwijderen

Stap 5 De hoofdfunctie

Dit is de functie die door onze shortcode wordt genoemd. Het toont en verwerkt het beeldinzendingformulier en het beeldlijst / verwijderingsformulier. We nemen het in hapklare stukjes en in stap 6 zullen we de hulpfuncties bekijken.

 function sui_form_shortcode () if (! is_user_logged_in ()) ga terug '

Je moet ingelogd zijn om een ​​afbeelding in te dienen.

'; global $ current_user;
  • controleer om te zien of de gebruiker is ingelogd
  • pak de variabele WordPress $ current_user die we nodig hebben om onze gebruikers-ID te krijgen
 if (isset ($ _POST ['sui_upload_image_form_submitted']) && wp_verify_nonce ($ _ POST ['sui_upload_image_form_submitted'], 'sui_upload_image_form')) $ result = sui_parse_file_errors ($ _ FILES ['sui_image_file'], $ _POST ['sui_image_caption']) ; if ($ result ['error']) echo '

FOUT: ' . $ result ['error']. '

'; else $ user_image_data = array ('post_title' => $ result ['caption'], 'post_status' => 'pending', 'post_author' => $ current_user-> ID, 'post_type' => 'user_images') ; if ($ 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');
  • als het afbeeldingsformulier is ingediend, is er een veld sui_upload_image_form_submitted dat is gegenereerd door onze functie wp_nonce_field. We kunnen dan de nonce verifiëren en doorgaan met het verwerken van de ingezonden afbeelding
  • voer enige validatie uit door de bestandsinvoer (waar de geüploade afbeeldingsgegevens worden opgeslagen) door te geven en invoergegevens bij een validatiefunctie te typen, sui_parse_file_errors en eventuele geretourneerde fouten weer te geven
  • een array maken die de status van het bericht in de wachtrij zet (de beheerder zal het nu moeten goedkeuren voor publicatie), het berichttype instellen op user_images (ons aangepast berichttype), en de auteur van het beeld plaatsen op de huidig ​​aangemelde gebruiker
  • als het afbeeldingsbericht met succes is ingevoegd, sla dan de afbeelding op in de WordPress mediabibliotheek (sui_process_image) en stel tenslotte de categorie voor de afbeeldingspost in en toon een succesbericht
 if (isset ($ _POST ['sui_form_delete_submitted']) && wp_verify_nonce ($ _ POST ['sui_form_delete_submitted'], 'sui_form_delete')) if (isset ($ _ POST ['sui_image_delete_id'])) if ($ user_images_deleted = sui_delete_user_images ( $ _POST ['sui_image_delete_id'])) echo '

'. $ user_images_deleted. 'afbeeldingen (s) verwijderd!

';
  • als het formulier voor het verwijderen van afbeeldingen is ingediend, is er een veld sui_form_delete_submitted dat is gegenereerd door onze functie wp_nonce_field. We kunnen dan de nonce verifiëren en doorgaan met het verwerken van de array met afbeeldingen die zijn gecontroleerd voor verwijdering
  • we controleren dat we sommige afbeeldingen hebben gecontroleerd op verwijdering door $ _POST ['sui_image_delete_id'] te testen. Als dat het geval is, geven we ze af aan de functie sui_delete_user_images (zie Stap 6)
  • als afbeeldingen zijn verwijderd, wordt een succesbericht weergegeven
 echo sui_get_upload_image_form ($ sui_image_caption = $ _POST ['sui_image_caption'], $ sui_image_category = $ _POST ['sui_image_category']); if ($ user_images_table = sui_get_user_images_table ($ current_user-> ID)) echo $ user_images_table; 
  • we voeren het beelduploadformulier uit
  • ten slotte voeren we het formulier voor afbeeldingen en verwijderingen uit door de gebruikers-ID door te geven aan de functie sui_get_user_images_table (zie stap 6)

Stap 6 Helperfuncties

Hier zullen we kijken naar de functies die de formulieren genereren, de afbeeldingen toevoegen aan de mediabibliotheek en de functie die de geselecteerde afbeeldingen verwijdert.

 function sui_get_upload_image_form ($ sui_image_caption = ", $ sui_image_category = 0) $ out ="; $ uit. = '
'; $ out. = wp_nonce_field ('sui_upload_image_form', 'sui_upload_image_form_submitted'); $ uit. = '
'; $ uit. = '
'; $ uit. = '
'; $ out. = sui_get_image_categories_dropdown ('sui_image_category', $ sui_image_category). '
'; $ uit. = '
'; $ uit. = '
'; $ uit. = ''; $ uit. = '
'; return $ out;
  • de functie accepteert 2 optionele argumenten voor het herbevolken van de formuliervelden. Dit is een gemak voor de gebruiker.
  • er wordt een nonce-veld uitgevoerd dat we controleren wanneer het formulier wordt verzonden
  • we voeren een vervolgkeuzemenu uit voor de afbeeldingscategorieën door sui_get_image_categories_dropdown aan te roepen (zie volgende functie)
 functie sui_get_image_categories_dropdown ($ taxonomy, $ selected) return wp_dropdown_categories (array ('taxonomy' => $ taxonomy, 'name' => 'sui_image_category', 'selected' => $ selected, 'hide_empty' => 0, 'echo' => 0)); 
  • de functie accepteert 2 argumenten inclusief de element-ID van de momenteel geselecteerde categorie
  • we gebruiken de functie WordPress wp_dropdown_categories om een ​​vervolgkeuzelijst te maken met de gebruikersbeeldcategorieën uit de taxonomie User_image_category (onze aangepaste taxonomie)
 function sui_get_user_images_table ($ user_id) $ args = array ('author' => $ user_id, 'post_type' => 'user_images', 'post_status' => 'in behandeling'); $ user_images = nieuwe WP_Query ($ args); als (! $ user_images-> post_count) 0 retourneert; $ out = "; $ out. = '

Je ongepubliceerde afbeeldingen - Klik om de volledige grootte te zien

'; $ uit. = '
'; $ uit. = wp_nonce_field ('sui_form_delete', 'sui_form_delete_submitted'); $ uit. = ''; $ uit. = ''; foreach ($ user_images-> berichten als $ user_image) $ user_image_cats = get_the_terms ($ user_image-> ID, 'sui_image_category'); foreach ($ user_image_cats als $ cat) $ user_image_cat = $ cat-> naam; $ 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, false); $ uit. = ''; $ uit. = ''; $ uit. = ''; $ uit. = ''; $ uit. = ''; $ uit. = ''; $ uit. = '
BeeldOnderschriftCategorieVerwijder
'. wp_get_attachment_link ($ post_thumbnail_id, 'thumbnail'). ''. $ user_image-> post_title. ''. $ user_image_cat. '
'; $ uit. = ''; $ uit. = '
'; return $ out;
  • accepteer de gebruikers-ID omdat we alleen een lijst met gebruikersafbeeldingen voor de huidige gebruiker moeten hebben
  • maak $ args aan om onze gebruiker, het berichttype van user_images en gebruikersafbeeldingen op te geven die nog in behandeling zijn (nog niet gepubliceerd door de beheerder)
  • voer een aangepaste query uit met WP_Query
  • return false als onze vraag geen gebruikersafbeeldingen retourneert
  • start een formulier en genereer een nonce voor het formulier
  • loop door de afbeeldingen en zorg ervoor dat we ook de categorie van de afbeeldingspost pakken
  • genereer een nonce voor het selectievakje voor het verwijderen van afbeeldingen, waarbij u een unieke naam voor de nonce toekent door het ID van het gebruikersimage te koppelen
  • output een tabel rij met de afbeelding post info evenals een verwijderen aankruisvakje

Waarom een ​​nonce toevoegen voor elke afbeelding?

Formulieren kunnen in de browser worden gemanipuleerd om onverwachte gegevens achter te houden. In ons geval is aan elk selectievakje voor verwijderen de waarde van een bericht toegewezen. Maar wat als een kwaadwillende gebruiker die waarde heeft gewijzigd en onze verwijderfunctie heeft veroorzaakt om een ​​bericht te verwijderen dat niet daadwerkelijk werd vermeld?

Een manier om dit te voorkomen, is om nonces te gebruiken voor elke rij postgegevens, zodat de nonces een unieke naam krijgen met de postwaarde die moet worden verwijderd. Vervolgens controleren we de nonce bij het indienen van het formulier om te controleren of het een echte retourwaarde is.

 function sui_delete_user_images ($ images_to_delete) $ images_deleted = 0; foreach ($ images_to_delete as $ user_image) if (isset ($ _ POST ['sui_image_delete_id_'. $ user_image]) && wp_verify_nonce ($ _ POST ['sui_image_delete_id_'. $ user_image], 'sui_image_delete_'. $ user_image)) if ($ post_thumbnail_id = get_post_thumbnail_id ($ user_image)) wp_delete_attachment ($ post_thumbnail_id);  wp_trash_post ($ user_image); $ images_deleted ++;  return $ images_deleted; 
  • de functie accepteert een reeks afbeeldingspost-id's om te verwijderen
  • elke afbeeldingspost-ID wordt gecontroleerd om te zien of er een nonce voor is gegenereerd
  • als de nonce verifieert, verwijderen we de afbeeldingbijlage die in de mediabibliotheek bestaat door de id van de miniatuurafbeelding van de afbeelding door te geven aan de WordPress-functie wp_delete_attachment
  • we verwijderen ook de afbeeldingspost met de WordPress-functie wp_trash_post

Maar wordt de thumbnail-bijlage niet verwijderd wanneer het bericht in de prullenbak wordt geplaatst?

Nee en dat komt omdat WordPress bijlagen als normale berichten opslaat in de posts-databasetabel. Kijk zelf: alle bijlagen worden opgeslagen in de berichtentabel met een post_type van bijlage. Als u een bericht van het type user_images verwijdert, wordt de thumbnail-bijlage niet verwijderd. Het blijft in de mediabibliotheek voor toekomstig gebruik, tenzij we het specifiek verwijderen met wp_delete_attachment. Voor onze doeleinden dacht ik dat het het beste was om de bijlage te verwijderen wanneer het bericht van de gebruiker werd verwijderd.


Stap 7 De beeldverwerkingsfuncties

Laten we ons eraan herinneren hoe de uitvoer van een html-bestandsinvoer eruit ziet wanneer een afbeelding naar uw script wordt geplaatst:

 Array ([naam] => ref_blind.jpg [type] => image / jpeg [tmp_name] => / tmp / php79xI4e [fout] => 0 [grootte] => 106290)

We geven die array door aan de functie sui_process_image, samen met de id van de opgeslagen afbeelding van de gebruikersafbeelding en de ondertiteling van de gescande afbeelding.

 function sui_process_image ($ file, $ post_id, $ caption) require_once (ABSPATH. "wp-admin". '/includes/image.php'); require_once (ABSPATH. "wp-admin". '/includes/file.php'); require_once (ABSPATH. "wp-admin". '/includes/media.php'); $ attachment_id = media_handle_upload ($ bestand, $ post_id); update_post_meta ($ post_id, '_thumbnail_id', $ attachment_id); $ attachment_data = array ('ID' => $ attachment_id, 'post_excerpt' => $ caption); wp_update_post ($ attachment_data); return $ attachment_id; 
  • we moeten de WordPress-beheerscripts opnemen die beelduploads achter de schermen afhandelen
  • we noemen de functie media_handle_upload (die deel uitmaakt van media.php), geven deze door aan de geüploade bestandsmatrix en de post-id
  • nu hebben we een bijlage-ID die we kunnen gebruiken met update_post_meta om de bijlage aan de post toe te wijzen als miniatuur. Opmerking: "_thumbnail_id" verwijst naar het meta-veld van de interne thumbnail (Uitgelichte afbeelding). Interne WordPress-velden beginnen met een onderstrepingsteken.
  • we gebruiken vervolgens de bijlage-id om het bijschrift van de bijlage bij te werken met de functie wp_update_post

Omdat bijlagen alleen gewone berichten zijn, werken we het bijschriftveld van de bijlage bij in het bewerkingsscherm van de mediabibliotheek, als we het veld post_excerpt voor de bijlage bijwerken..

De validatiefunctie

We valideren ook de bestandsmatrix en de door de gebruiker geleverde afbeelding bijschrift met de functie sui_parse_file_errors.

 function sui_parse_file_errors ($ file = ", $ image_caption) $ result = array (); $ result ['error'] = 0; if ($ bestand ['error']) $ result ['error'] =" Nee bestand geupload of er was een upload fout! "; return $ result; $ image_caption = trim (preg_replace ('/ [^ a-zA-Z0-9 \ s] + /',", $ image_caption)); if ($ image_caption == ") $ result ['error'] =" Uw bijschrift mag alleen letters, cijfers en spaties bevatten! "; return $ result; $ result ['caption'] = $ image_caption; $ image_data = getimagesize ($ file ['tmp_name']); if (! in_array ($ image_data ['mime'], unserialize (TYPE_WHITELIST))) $ result ['error'] = 'Je afbeelding moet een jpeg, png of gif zijn ! '; elseif (($ file [' size ']> MAX_UPLOAD_SIZE)) $ result [' error '] =' Je afbeelding was '. $ file [' size '].' bytes! Het mag niet groter zijn dan '. MAX_UPLOAD_SIZE. 'Bytes.'; Retourneer $ resultaat;
  • controleer het foutelement van de array van bestanden voor een HTML-upload-fout. Als gevonden, retourneert u een resultaatarray met fout
  • voer wat regex uit op het bijschrift van de afbeelding om alles behalve alfanumerieke gegevens en spaties te verwijderen en te vervangen door spaties voor leesbaarheid
  • als we na het opschonen een leeg bijschrift krijgen, geven we een foutmelding
  • controleer het interne afbeeldingstype (vertrouw de bestandsextensie niet) met behulp van de PHP-getimagesize-functie tegen de constante TYPE_WHITELIST
  • controleer de afbeeldingsgrootte tegen de constante MAX_UPLOAD_SIZE

Stap 8 Enkele styling

Voeg deze stijlinformatie toe aan het style.css-bestand in uw themamap:

 #sui_upload_image_form #sui_image_caption width: 500px;  #user_images font-size: 12px;  #user_images th text-align: left;  #user_images td vertical-align: middle;  #user_images td input margin: 0px; 

Stap 9 Probeer het uit

Activeer de plug-in, zet de shortcode op een pagina, log in op uw site en test deze. Wanneer u een afbeelding uploadt, wordt een nieuw bericht weergegeven onder het menu Beheer van gebruikersafbeeldingen. Het zal in afwachting zijn van publicatie. Je ziet ook een nieuwe afbeelding in je mediabibliotheek, gekoppeld aan je nieuwe bericht en met het bijschrift zoals voorzien.

De broncode van de volledige plug-incode en een link naar de demosite staan ​​bovenaan deze zelfstudie.

De bronmap bevat ook een Wordpress-paginasjabloon met een aangepaste lus die gepubliceerde afbeeldingen voor alle gebruikers weergeeft.


Laatste gedachten

Wellicht wilt u een strengere validatie plaatsen bij uw beelduploads. Vergeet niet dat u gegevens accepteert van gebruikers die mogelijk ongepaste of opzettelijk ongepaste bestanden uploaden. Het controleren van het bestandstype en de grootte is een goed begin.

We hebben ook de bijlagebijschrift gemaakt door het post_excerpt-veld van de bijlage bij te werken. U kunt ook een bijlagebeschrijving instellen met behulp van het veld post_content van de bijlage.