Lag en enkel CRM i WordPress Opprett egendefinerte felt

I denne serien har vi sett på hvordan du lager et enkelt CRM-system i WordPress. I den første delen av denne serien opprettet vi et WordPress-plugin som registrerte en "Kontakter" tilpasset posttype, men vi har ennå ikke dekket hvordan du lagrer tilleggsinformasjon for en kontakt.

Opprette egendefinerte felt

WordPress har add_meta_box () funksjon, som gjør det mulig for plugin og temautviklere å registrere egendefinerte metakasser mot ulike WordPress-administrasjonsskjermbilder.

WordPress registrerer noen av sine egne metakasser for visning når du oppretter et innlegg eller en side. For eksempel på Sider har du Sideattributter meta boks:

La oss legge til en meta-boks til vår Kontakt egendefinert innleggstype. Åpne pluginfilen du opprettet i den første opplæringen i denne serien. Deretter oppdaterer du koden i pluginens konstruktør for å matche nedenstående. Dette registrerer vår register_meta_boxes () fungere mot add_meta_boxes handling:

/ ** * Constructor. Kalt når plugin er initialisert * / funksjon __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('add_meta_boxes', array ($ this, 'register_meta_boxes')); 

Deretter i vår register_meta_boxes () funksjon, vi legger til et anrop til add_meta_box (). Dette forteller WordPress vi vil ha en meta-boks som heter Kontaktinformasjon, som gjengis av vår output_meta_box () funksjon. Legg til underkoden etter konstruktørfunksjonen:

/ ** * Registrerer en Meta Box på vår Kontakt Custom Post Type, kalt 'Kontaktdetaljer' * / funksjon register_meta_boxes () add_meta_box ('kontaktdetaljer', 'Kontaktdetaljer', array ($ this, 'output_meta_box'), 'kontakt', 'normal', 'høy'); 

Til slutt trenger vi en output_meta_box () funksjon, som kalles av add_meta_box ovenfor. Legg til koden nedenfor etter register_meta_boxes () funksjon:

/ ** * Utfør en meta-boks med kontaktdetaljer * * @param WP_Post $ post WordPress Post-objekt * / funksjon output_meta_box ($ post) 

La oss sjekke at vi har en meta-boks som vises på vår Kontakt egendefinert innleggstype. Opprett en ny kontakt i WordPress dashboard ved å gå til Kontakter> Legg til nytt.

Hvis alt er skrevet riktig, bør du se noe som ligner på skjermbildet som følger:

Populere Meta Box med et felt

La oss gå videre og legge til et e-postadressefelt i denne meta-boksen. Forandre din output_meta_box funksjon til underkoden:

/ ** * Utfør en meta-boks med kontaktdetaljer * * @param WP_Post $ post WordPress Post-objekt * / funksjon output_meta_box ($ post) // Utgangsetikett og feltekko (''); ekko ( '');  

Lagre plugin-koden, og last på skjermbildet Legg til kontakt. Du bør se vårt nye e-postadresse-felt vises i Meta-boksen Kontaktdetaljer:

Lagre egendefinerte feltdata

Vi er ikke helt ferdige ennå. Vi må fortelle WordPress å lagre innholdet som en bruker legger inn i dette feltet. I WordPress gjør vi dette ved å registrere en funksjon mot lagre post handling.

Som med de fleste handlinger registrerer vi vår handling i pluginens konstruktør:

/ ** * Constructor. Kalt når plugin er initialisert * / funksjon __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')); 

Neste, la oss lage vår save_meta_boxes () funksjon:

/ ** * Lagrer meta-boksfeltdataene * * @param int $ post_id Post ID * / funksjon save_meta_boxes ($ post_id) // Sjekk dette er Contact Custom Post Type if ('contact'! = $ _POST ['post_type ']) return $ post_id;  // Sjekk den innloggede brukeren har tillatelse til å redigere dette innlegget hvis (! Current_user_can ('edit_post', $ post_id)) return $ post_id;  // OK for å lagre metadata $ email = sanitize_text_field ($ _POST ['contact_email']); update_post_meta ($ post_id, '_contact_email', $ email); 

Denne funksjonen utfører flere handlinger, fordi lagre post Handlingen kan kalles ganske ofte av WordPress og andre plugins (for eksempel når du periodisk lagrer et utkast eller en annen posttype lagres). Vi må være sikre på at vi bare lagrer våre egendefinerte feltdata hvis brukeren lagret eller oppdaterte en kontakt.

Hvis vi lagrer en kontakt, saniterer vi e-postadressen. Fra WordPress Codex:

Sjekker for ugyldig UTF-8, Konverter enkelt < characters to entity, strip all tags, remove line breaks, tabs and extra white space, strip octets.

Kort sagt, vi sørger for at det ikke er noe funky formatering på vår tekststreng.

Endelig lagrer vi e-postadressen i post-metadataene, ved hjelp av update_post_meta. Tenk på innleggmeta som en serie av nøkkel / verdipar som er knyttet til et innlegg. Du kan ha så få eller så mange du vil. I vårt eksempel lagrer vi verdien av vårt tilpassede felt mot nøkkelen _Kontakt Epost.

Leser egendefinerte feltdata

Lage en ny Ta kontakt med og skriv inn en e-postadresse. Lagre den nye kontakten, og du vil merke at e-postadressen ikke vises i feltet:

Vi må redigere vår output_meta_box () fungere for å lese Post-meta, og vise det i inntastingsfeltet. Endre output_meta_box () funksjon til underkoden:

/ ** * Utfør en kontaktdetaljer meta-boks * * @param WP_Post $ post WordPress Post-objekt * / funksjon output_meta_box ($ post) $ email = get_post_meta ($ post-> ID,'contact_email ', true); // Output label og field echo (''); ekko ( '');  

Vi bruker get_post_meta () for å få verdien for den gitte post-ID- og meta-tastkombinasjonen. Vi vet at meta-nøkkelen er _Kontakt Epost, som det er det vi brukte da vi lagret den egendefinerte feltverdien i update_post_meta ()

Sikkerhet

Sikkerheten er ekstremt viktig når du sender inn og håndterer skjemadata. Vi må vite at kilden til våre data er troverdig når du lagrer den. Hvis vi ikke kan stole på kilden til dataene våre, må vi ikke lagre det - dataene kan bli kompromittert eller ødelagt på en måte å prøve å utnytte en feil eller sikkerhetsfeil.

WordPress gir oss nonces (et "nummer som brukes en gang"), som kan sendes sammen med skjemadataene. Denne nonce kan kontrolleres når vår lagre rutine kjører, for å sikre at den samsvarer med verdien vi forventer.

Dette bidrar til å forhindre angrep på grunn av forespørsler om overfallsforespørsler (CSRF), dvs. at noen prøver å sende skjemadata til vår lagringsrutine fra et annet nettsted.

Vi må legge til sikkerhet til ovennevnte kode på to steder:

  1. output_meta_box (): Legg til en ikke-verdi i skjemaet
  2. save_meta_boxes (): Bekreft en innsendt ikke-verdi

La oss redigere output_meta_box () funksjon, erstatt den med nedenstående kode:

/ ** * Utfør en kontaktdetaljer meta-boks * * @param WP_Post $ post WordPress Post-objekt * / funksjon output_meta_box ($ post) $ email = get_post_meta ($ post-> ID,'contact_email ', true); // Legg til et nonce-felt slik at vi kan sjekke det senere. wp_nonce_field ('save_contact', 'contacts_nonce'); // Output label og field echo (''); ekko ( ''); 

Dette bruker wp_nonce_field (), å generere et skjult felt som heter contacts_nonce, med en handling kalt save_contact. Dens verdi genereres av WordPress.

Deretter la vi redigere lagringsrutinen i save_meta_boxes ():

/ ** * Lagrer metaboksfeltdataene * * @param int $ post_id Post ID * / funksjon save_meta_boxes ($ post_id) // Sjekk om vår nonce er satt. hvis (! isset ($ _POST ['contacts_nonce']))) return $ post_id;  // Verifiser at nonce er gyldig. hvis (! wp_verify_nonce ($ _POST ['contacts_nonce'], 'save_contact')) return $ post_id;  // Sjekk dette er Contact Custom Post Type if ('contact'! = $ _POST ['post_type']) return $ post_id;  // Sjekk den innloggede brukeren har tillatelse til å redigere dette innlegget hvis (! Current_user_can ('edit_post', $ post_id)) return $ post_id;  // OK for å lagre metadata $ email = sanitize_text_field ($ _POST ['contact_email']); update_post_meta ($ post_id, '_contact_email', $ email); 

Dette legger til to sjekker til vår lagringsrutine:

  1. Kontroller at et nonce-felt er angitt i vårt skjema. Hvis ikke, ikke lagre noe.
  2. Sjekk at ikke-feltfeltets verdi er det vi forventer. Hvis ikke, ikke lagre noe.

Lag eller rediger din Ta kontakt med, og sørg for at e-postadressen nå blir lagret.

Neste…

I neste artikkel skal vi bruke Avanserte egendefinerte felt for å legge til egendefinerte felt i vår Ta kontakt med egendefinert innleggstype, slik at vi kan lage et rikt brukergrensesnitt med et bredere spekter av inngangstyper.