In deze serie hebben we gekeken naar hoe een eenvoudig CRM-systeem kan worden gemaakt in WordPress. In het eerste deel van deze serie hebben we een WordPress-plug-in gemaakt die een 'Aangepast' aangepast berichttype registreerde, maar we moeten ons nog bezighouden met het opslaan van aanvullende informatie voor een contactpersoon.
WordPress heeft de add_meta_box ()
functie, waarmee plug-in en themaontwikkelaars aangepaste metaboxen kunnen registreren voor verschillende WordPress Administration-schermen.
WordPress registreert enkele van zijn eigen metaboxen voor weergave wanneer u een bericht of een pagina maakt. Op Pages heeft u bijvoorbeeld de Paginakenmerken metabox:
Laten we een metabox toevoegen aan onze Contacten aangepast berichttype. Open het plug-inbestand dat je hebt gemaakt in de eerste zelfstudie van deze serie. Voer vervolgens in de constructor van de plug-in de code bij zodat deze overeenkomt met de onderstaande. Dit registreert onze register_meta_boxes ()
functie tegen de add_meta_boxes
actie:
/ ** * Constructor. Wordt aangeroepen wanneer de plugin wordt geïnitialiseerd * / function __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('add_meta_boxes', array ($ this, 'register_meta_boxes'));
Vervolgens, in onze register_meta_boxes ()
functie, we voegen een oproep toe aan add_meta_box ()
. Dit vertelt WordPress dat we een metabox willen genaamd Contact details, die wordt weergegeven door onze output_meta_box ()
functie. Voeg de onderstaande code toe na de constructorfunctie:
/ ** * Registreert een metabox op ons Contact Aangepast berichttype, genaamd 'Contactdetails' * / function register_meta_boxes () add_meta_box ('contact-details', 'Contactgegevens', array ($ this, 'output_meta_box'), 'contact', 'normaal', 'hoog');
Eindelijk hebben we een output_meta_box ()
functie, die wordt aangeroepen door add_meta_box
bovenstaande. Voeg de onderstaande code toe na de register_meta_boxes ()
functie:
/ ** * Een meta-vak met contactgegevens afdrukken * * @param WP_Post $ post WordPress Post-object * / function output_meta_box ($ post)
Laten we controleren of er een metabox op onze site staat Contacten aangepast berichttype. Maak een nieuwe contactpersoon in het WordPress-dashboard door naar Contactpersonen> Nieuw toevoegen.
Als alles correct is geschreven, zou u iets moeten zien dat lijkt op het volgende screenshot:
Laten we doorgaan en een e-mailadresveld toevoegen aan deze metabox. Verander jouw output_meta_box
functioneer naar de onderstaande code:
/ ** * Een metadoos met contactgegevens afdrukken * * @param WP_Post $ post WordPress Post-object * / function output_meta_box ($ post) // Outputlabel en field echo (''); echo ('');
Sla uw plugin-code op en herlaad het Contactpersoon toevoegen-scherm. U zou ons nieuwe e-mailadresveld in de metadoos Contactgegevens moeten zien verschijnen:
We zijn nog niet helemaal klaar. We moeten WordPress vertellen dat het de inhoud moet opslaan die een gebruiker invoert in dit veld. In WordPress doen we dit door een functie te registreren tegen de save_post
actie.
Zoals bij de meeste acties, registreren we onze actie in de constructor van de plug-in:
/ ** * Constructor. Wordt aangeroepen wanneer de plugin wordt geïnitialiseerd * / function __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('add_meta_boxes', array ($ this, 'register_meta_boxes')); add_action ('save_post', array ($ this, 'save_meta_boxes'));
Laten we vervolgens onze save_meta_boxes ()
functie:
/ ** * Slaat de veldgegevens van de metabox op * * @param int $ post_id Bericht ID * / functie save_meta_boxes ($ post_id) // Controleer of dit het Aangepaste berichttype van de contactpersoon is if ('contact'! = $ _POST ['post_type ']) return $ post_id; // Controleer of de ingelogde gebruiker toestemming heeft om deze post te bewerken als (! Current_user_can ('edit_post', $ post_id)) return $ post_id; // OK om metagegevens te bewaren $ email = sanitize_text_field ($ _POST ['contact_email']); update_post_meta ($ post_id, '_contact_email', $ email);
Deze functie voert verschillende acties uit, omdat de save_post
actie kan vrij vaak worden aangeroepen door WordPress en andere plug-ins (bijvoorbeeld wanneer periodiek automatisch opslaan van een concept of een ander berichttype wordt opgeslagen). We moeten er zeker van zijn dat we alleen onze aangepaste veldgegevens opslaan als de gebruiker een contactpersoon heeft opgeslagen of bijgewerkt.
Als we een contact opslaan, zuiveren we het e-mailadres. Van de WordPress Codex:
Controleert op ongeldige UTF-8, Convert single < characters to entity, strip all tags, remove line breaks, tabs and extra white space, strip octets.
Kortom, we zorgen ervoor dat er geen funky opmaak op onze tekstreeks staat.
Ten slotte slaan we het e-mailadres op in de post-metadata, met behulp van update_post_meta
. Zie post-meta als een reeks sleutel / waarde-paren die aan een bericht zijn gekoppeld. Je kunt er zo weinig of zo veel als je wilt. In ons voorbeeld slaan we de waarde van ons aangepaste veld op tegen de sleutel _contact email
.
Maak een nieuw Contact en voer een e-mailadres in. Sla de nieuwe contactpersoon op en u zult zien dat het e-mailadres niet in het veld verschijnt:
We moeten onze bewerken output_meta_box ()
functie om de bericht-meta te lezen en deze in het invoerveld weer te geven. Verander de output_meta_box ()
functioneer naar de onderstaande code:
/ ** * Een meta-vak met contactgegevens afdrukken * * @param WP_Post $ post WordPress Post-object * / function output_meta_box ($ post) $ email = get_post_meta ($ post-> ID, '_contact_email', true); // Outputlabel en veldecho (''); echo ('');
We gebruiken get_post_meta ()
om de waarde voor de gegeven combinatie van Post-ID en metatoets te krijgen. We weten dat de meta-sleutel is _contact email
, zoals dat is wat we gebruikten toen we de aangepaste veldwaarde opsloegen update_post_meta ()
Beveiliging is uiterst belangrijk bij het indienen en verwerken van formuliergegevens. We moeten weten dat de bron van onze gegevens betrouwbaar is bij het opslaan ervan. Als we de bron van onze gegevens niet kunnen vertrouwen, moeten we deze niet opslaan - de gegevens kunnen worden aangetast of beschadigd op een manier om een bug of beveiligingsfout te proberen te exploiteren.
WordPress geeft ons nonces (een "eenmaal gebruikt nummer"), dat samen met de formuliergegevens kan worden verzonden. Deze nonce kan worden gecontroleerd wanneer onze opslagroutine wordt uitgevoerd, om ervoor te zorgen dat deze overeenkomt met de waarde die we zouden verwachten.
Dit helpt bij het voorkomen van cross-site request forgery (CSRF) -aanvallen, dat wil zeggen dat iemand probeert formuliergegevens te verzenden naar onze opslagroutine vanaf een andere website.
We moeten op twee plaatsen beveiliging toevoegen aan de bovenstaande code:
output_meta_box ()
: voeg een nonce-waarde toe aan het formuliersave_meta_boxes ()
: verifieer een ingediende nonce-waardeLaten we de output_meta_box ()
functie, vervang deze door onderstaande code:
/ ** * Een meta-vak met contactgegevens afdrukken * * @param WP_Post $ post WordPress Post-object * / function output_meta_box ($ post) $ email = get_post_meta ($ post-> ID, '_contact_email', true); // Voeg een nonce-veld toe, zodat we dit later kunnen controleren. wp_nonce_field ('save_contact', 'contacts_nonce'); // Outputlabel en veldecho (''); echo ('');
Dit gebruikt wp_nonce_field ()
, om een verborgen veld te genereren met de naam contacts_nonce
, met een actie genaamd save_contact
. De waarde ervan wordt gegenereerd door WordPress.
Laten we vervolgens de opslagroutine binnen bewerken save_meta_boxes ()
:
/ ** * Slaat de veldgegevens van de metabox op * * @param int $ post_id Bericht ID * / functie save_meta_boxes ($ post_id) // Controleer of onze nonce is ingesteld. if (! isset ($ _POST ['contacts_nonce'])) return $ post_id; // Controleer of de nonce geldig is. if (! wp_verify_nonce ($ _POST ['contacts_nonce'], 'save_contact')) return $ post_id; // Controleer of dit het Contact Aangepast berichttype is if ('contact'! = $ _POST ['post_type']) return $ post_id; // Controleer of de ingelogde gebruiker toestemming heeft om deze post te bewerken als (! Current_user_can ('edit_post', $ post_id)) return $ post_id; // OK om metagegevens te bewaren $ email = sanitize_text_field ($ _POST ['contact_email']); update_post_meta ($ post_id, '_contact_email', $ email);
Dit voegt twee controles toe aan onze opslagroutine:
Maak of bewerk uw Contact, en zorg ervoor dat het e-mailadres nu wordt opgeslagen.
In het volgende artikel gaan we geavanceerde aangepaste velden gebruiken om aangepaste velden aan onze toe te voegen Contact aangepast berichttype, waardoor we een uitgebreide gebruikersinterface kunnen maken met een breder scala aan invoertypen.