Sta gebruikers toe om uw WordPress-site in te dienen een citaten-plugin

In deze zelfstudie leert u hoe u een plug-in maakt waarmee gebruikers formuliergegevens kunnen verzenden. Je leert ook over beveiliging door nonces te gebruiken.


Wat je leert

  • Een formulier weergeven en verwerken met behulp van een shortcode
  • Gebruik nonces om gebruikersinzendingen te beveiligen

Het is eenvoudiger dan je denkt

Shortcodes worden vaak gebruikt om eenvoudige gegevens weer te geven, maar omdat ze eigenlijk een manier zijn om een ​​vertakking van een pagina of post te maken en code uit te voeren, kunnen ze worden gebruikt voor vrij complexe taken, zoals het weergeven en verwerken van formulieren.

We bouwen een plug-in waarmee ingelogde gebruikers het volgende kunnen doen:

  • offertes indienen voor moderatie en publicatie
  • bekijk hun ongepubliceerde citaten
  • verwijder hun ongepubliceerde offertes

Dit is waar we naar streven:

Alle code is beschikbaar in de pluginbron bovenaan deze zelfstudie.


Stap 1 Stel de plug-in in

De map WordPress-plug-in bevindt zich in uw WordPress installatiemap op wp-content / plugins. Maak een map in de map met plug-ins. Laten we het noemen submit-user-citaten. Maak nu zelf het plugin-bestand aan. Laten we het noemen submit_user_quotes.php. Het pad naar uw plugin-bestand zou nu moeten zijn: wp-content / plugins / submit-user-quotes / submit_user_quotes.php

Elke Wordpress-plugin heeft wat header-informatie nodig, zodat WordPress het kan identificeren en op de plug-in van het dashboard beschikbaar kan maken.

  

U kunt deze informatie bewerken volgens uw eigen vereisten.

De plug-in wordt als volgt weergegeven:


Stap 2 Plugin initialisatie functie

We gaan een aangepast berichttype maken met de naam Quotes om onze offertes te houden en een aangepaste taxonomie met de naam quote_category. Dit zal een schoner beheer van de offertes mogelijk maken dan ze eenvoudig 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', 'suq_plugin_init'); function suq_plugin_init () $ quote_type_labels = array ('name' => _x ('Quotes', 'post type general name'), 'singular_name' => _x ('Quote', 'post type singular name'), 'add_new '=> _x (' Nieuwe offerte toevoegen ',' quote '),' add_new_item '=> __ (' Nieuwe offerte toevoegen '),' edit_item '=> __ (' Offerte bewerken '),' new_item '=> __ ( 'Nieuw citaat toevoegen'), 'all_items' => __ ('Citaten bekijken'), 'view_item' => __ ('Bekijk citaat'), 'search_items' => __ ('Zoekcitaten'), 'not_found' = > __ ('Geen citaten gevonden'), 'not_found_in_trash' => __ ('Geen citaten gevonden in Prullenbak'), 'parent_item_colon' => ", 'menu_name' => 'Quotes'); $ quote_type_args = array ('labels '=> $ quote_type_labels,' public '=> true,' query_var '=> true,' rewrite '=> true,' capability_type '=>' post ',' has_archive '=> true,' hierarchical '=> false, 'menu_position' => null, 'ondersteunt' => 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', 'taxonomy singular name'), 'search_items' => __ ('Search Quote Categories'), 'all_items' => __ ('All Quote Categories'), 'parent_item' => __ ('Parent Quote Categorie '),' parent_item_colon '=> __ (' Parent Quote Category: '),' edit_item '=> __ (' Edit Quote Category '),' update_item '=> __ (' Update Quote Category '),' add_new_item '= > __ ('Nieuwe citaatcategorie toevoegen'), 'nieuwe_itemnaam' => __ ('Nieuwe citaatnaam'), 'menu_name' => __ ('Offerte-categorieën'),); $ 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', 'politiek', 'sport', 'filosofie'); foreach ($ default_quote_cats als $ cat) if (! term_exists ($ cat, 'quote_category')) wp_insert_term ($ cat, 'quote_category'); 

Wat deze code doet:

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

We hebben nu een Quotes-menu in ons beheerdersdashboard en een manier om offertes en hun categorieën te beheren.


Stap 3 Definieer een shortcode

Vervolgens definiëren we een shortcode waarmee we het aanmeldingsformulier voor gebruikersopgaven in een bericht of pagina kunnen weergeven (en verwerken):

 add_shortcode ('suq_form', 'suq_form_shortcode');

Hier gebruiken we de functie add_shortcode van WordPress om een ​​shortcode met de naam suq_form en een functie met de naam suq_form_shortcode te definiëren die wordt aangeroepen wanneer WordPress de shortcode [suq_form] in een bericht of een pagina tegenkomt.

Voordat we naar de functies voor formulierenweergave en verwerking kijken, laten we het even hebben?


Veiligheid

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

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

nonces

Een nonce is een getal dat één keer wordt gebruikt. We gebruiken ze om te controleren of de gegevens die bij ons binnenkomen eigenlijk afkomstig zijn van de formulieren die we hebben gemaakt.

Hier genereren we een nonce-veld met behulp van wp_nonce_field dat als een verborgen veld in ons formulier zal worden opgenomen:

 wp_nonce_field ('suq_form_create_quote', 'suq_form_create_quote_submitted');

Omdat het nu een verborgen veld is in onze vorm, komt het terug bij ons wanneer het formulier wordt ingediend. We kunnen vervolgens controleren of de nonce geldig is met behulp van wp_verify_nonce:

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

Dat zal waar terugkeren als de nonce verifieert.


Stap 4 De hoofdfunctie

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

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

Je moet ingelogd zijn om een ​​offerte te plaatsen.

'; 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 ['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' => 'pending', 'post_author' => $ current_user-> ID, 'post_type' => 'aanhalingstekens'); if ($ quote_id = wp_insert_post ($ quote_data)) wp_set_object_terms ($ quote_id, (int) $ _ POST ['suq_quote_category'], 'quote_category'); echo '

Citaat gemaakt en in afwachting van moderatie!

'; else // auteur of tekstveld is lege echo '

Quote NIET bewaard! Wie zei het? en Quote mag niet leeg zijn.

';
  • als het aanmaakformulier voor het aanhalingsteken is ingediend, is er een veld suq_form_create_quote_submitted dat is gegenereerd door onze functie wp_nonce_field. We kunnen dan de nonce verifiëren en doorgaan met het verwerken van de ingediende quote
  • doe wat basisvalidatie door ervoor te zorgen dat de citaatauteur en citaattekstvelden beide iets bevatten, zo niet, geef dan een foutmelding weer
  • 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 offertes (ons aangepast berichttype) en de auteur van het citaat instellen op de huidig ​​aangemelde gebruiker
  • als het citaat met succes is ingevoegd, stel dan de categorie in voor het citaat en toon een succesbericht
 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. 'quote (s) verwijderd!

';
  • als het aanhalingsteken verwijderingsformulier is ingediend, is er een veld suq_form_delete_submitted dat is gegenereerd door onze functie wp_nonce_field. We kunnen vervolgens de nonce verifiëren en doorgaan met het verwerken van de reeks offertes die is gecontroleerd voor verwijdering
  • we controleren of we sommige offertes hebben gecontroleerd op verwijdering door $ _POST ['suq_delete_id'] te testen. Als dat het geval is, geven we ze af aan de functie suq_delete_quotes (zie stap 5)
  • als offertes zijn verwijderd, wordt een succesbericht weergegeven
 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; 
  • we voeren het offerteaanvraagformulier uit
  • ten slotte geven we het citaatlijst / verwijderingsformulier uit door het gebruikers-ID door te geven aan de functie suq_get_user_quotes (zie stap 5)

Stap 5 Helperfuncties

Hier zullen we kijken naar de functies die de formulieren genereren en de functie die de geselecteerde aanhalingstekens verwijdert.

 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'); $ uit. = '
'; $ uit. = '
'; $ uit. = '
'; $ out. = suq_get_quote_categories_dropdown ('quote_category', $ suq_quote_category). '
'; $ uit. = '
'; $ uit. = '

'; $ uit. = ''; $ uit. = '
'; return $ out;
  • de functie accepteert 3 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 geven een dropdown voor de quote-categorieën door suq_get_quote_categories_dropdown aan te roepen (zie volgende functie)
 functie 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)); 
  • 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 citaatcategorieën uit de taxonomie quote_category (onze aangepaste taxonomie)
 function suq_get_user_quotes ($ user_id) $ args = array ('author' => $ user_id, 'post_type' => 'citaten', 'post_status' => 'in behandeling'); $ posts = new WP_Query ($ args); als (! $ posts-> post_count) 0 retourneert; $ uit. = '

Je ongepubliceerde citaten

'; $ uit. = '
'; $ out. = wp_nonce_field ('suq_form_delete', 'suq_form_delete_submitted'); $ uit. = ''; $ uit. = ''; foreach ($ posts-> berichten als $ post) $ quote_cats = get_the_terms ($ post-> ID, 'quote_category'); foreach ($ quote_cats als $ cat) $ quote_cat = $ cat-> name; $ out. = wp_nonce_field ('suq_post_delete_'. $ post-> ID, 'suq_post_delete_id_'. $ post-> ID, false); $ uit. = ''; $ uit. = ''; $ uit. = ''; $ uit. = ''; $ uit. = ''; $ uit. = ''; $ uit. = '
Said ByCitaatCategorieVerwijder
'. $ post-> post_title. ''. $ post-> post_content. ''. $ quote_cat. '
'; $ uit. = ''; $ uit. = '
'; return $ out;
  • accepteer de gebruikers-ID omdat we alleen een lijst met offertes voor de huidige gebruiker nodig hebben
  • maak $ args om onze gebruiker te specificeren, het berichttype van offertes en quotes 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 aanhalingstekens retourneert
  • start een formulier en genereer een nonce voor het formulier
  • doorloop de citaten en zorg ervoor dat we ook de categorie van het citaat pakken
  • genereer een nonce voor het aanvinken van het aanhalingsteken, en wijs een unieke naam toe voor de nonce door de post-ID samen te voegen
  • output een tabel rij met de prijsopgave info evenals een verwijderen aankruisvakje

Waarom een ​​nonce toevoegen voor elke quote?

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 suq_delete_quotes ($ quotes_to_delete) $ quotes_deleted = 0; foreach ($ quotes_to_delete als $ quote) if (isset ($ _ POST ['suq_post_delete_id_'. $ quote]) && wp_verify_nonce ($ _ POST ['suq_post_delete_id_'. $ quote], 'suq_post_delete_'. $ quote)) wp_trash_post ($ citaat); $ quotes_deleted ++;  return $ quotes_deleted; 
  • de functie accepteert een array met quote-ID's om te verwijderen
  • elke quote ID wordt gecontroleerd om te zien of er een nonce voor is gegenereerd
  • als de nonce verifieert, verpotten we de quote met behulp van de Wordpress-functie wp_trash_post

Stap 6 Sommige styling

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

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

Stap 7 Probeer het uit

Activeer de plug-in, zet de shortcode op een pagina, log in op uw site en test deze.

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 offertes voor alle gebruikers weergeeft.


Laatste gedachten

  • de quotes-plugin kan worden verbeterd door een bewerkingsoptie aan te bieden. Zoals het is, kunnen gebruikers alleen hun offertes verwijderen
  • je zou ook een optie voor het uploaden van afbeeldingen kunnen toevoegen om dingen op te vrolijken
  • voeg misschien enkele aangepaste velden toe aan het offerteteksttype voor citaat-metaprojecten

handige links

  • Wordpress nonces
  • Aangepaste berichttypen
  • Aangepaste taxonomieën