Slik utvikler du et medlemssted med WordPress Del 3

Hva du skal skape

Tidligere i serien dekket vi hvordan du tilpasser WordPress innloggings- og registreringsskjemaene. Vi har lagt til noen egendefinerte felt i vårt registreringsskjema. I dag, i den tredje og siste delen av denne serien, vil vi dekke hvordan du kan utvikle en "min konto" -del for nettstedets brukere, hvor brukere kan redigere profilinformasjonen sin. 

Sideoppsett

Det første vi ønsker å gjøre er å opprette en sidemal for å huse innholdet vårt. Jeg liker å prefiks min sidemaler med ordet "mal". Så min fil kalles template-user-profile.php, og åpningen PHP ser slik ut: 

Jeg har lagret dette i roten til temakatalogen min. Hvis du ikke er kjent med WordPress Page Templates, foreslår jeg at du leser linken over. De er ekstremt praktiske.

La oss nå gå til WordPress-bakenden og lage en side som heter "profil", og i Sideattributter Meta Box tilordne den vår nyopprettede sidemal. Når du har publisert denne siden, bør du ha en tom side på forsiden: http: // ditt domene / profil. 

Nå for å injisere noe innhold på vår side. Vi vil at strukturen skal være sidens innhold (det vil si hva som er skrevet i WordPress WYSIWYG) og deretter vårt profilskjema for å følge. 

Det er ofte nyttig å få koden fra page.php og bruke det som utgangspunkt for sideskjemaene. Denne koden er forskjellig litt avhengig av temaet ditt, men det vil mest sannsynlig inneholde en sløyfe som spretter ut noe sideinnhold. Innholdsdelen hentes normalt ved hjelp av WordPress-funksjonen get_template_part (). Rett under der innholdet er hentet, la oss sette inn vårt skjema HTML. Så til oppsummering:

  1. Kopier og lim inn koden fra page.php til vår sidemall.
  2. Finn hvor innholdet blir sendt ut.
  3. Rett under det, sett inn følgende kode og så går vi gjennom det:

Det er ikke noe galt skjer her: skjemaet bruker Bootstrap-markup som vårt tema er bygget på Bootstrap. Andre ting å merke seg er at skjemaet sendes ved hjelp av POST-metoden, og vi har tatt med en wp_nonce_field-dette er en type sikkerhetstoken som hjelper til med å forhindre ondsinnede angrep. Hvis du ikke er kjent med WordPress's Nonces, foreslår jeg at du leser denne artikkelen. 

Henter dataene

Med det på plass, bør du ha et skjema på forsiden av nettstedet, men det gjør ikke mye. Vi vil at den skal vise dataene vi har for den innloggede brukeren. Du har kanskje lagt merke til at verdienattributtene i vårt skjema ekko ut noen PHP. 

value ="fornavn; ?>"

Akkurat nå det $ user_info objekt eksisterer ikke som vi ikke har skrevet koden ennå, så la oss starte der. Lim inn følgende kode før skjemaet i template-user-profile.php.

Ved å bruke noen WordPress-innfødte funksjoner, blir den nåværende brukerens ID, og ​​dermed kan vi få brukerens data. Dette lagres i et objekt som kalles $ user_info, og som vist ovenfor kan vi hente brukerdata ganske enkelt. For å se alle dataene som er lagret i det objektet, kan du kjøre en var_dump som så: . Dette kan være nyttig for feilsøking eller bare for å se hva du kan få tilgang til. 

Behandling av dataene

Det er et siste stykke i puslespillet, og det er å behandle dataene, slik at brukerne kan redigere profiler. For å holde orden på organisasjonen, har jeg satt medlemskapskoden til en fil som er betegnet med navnet membership.php. Dette er i lib katalog og har blitt inkludert i vår functions.php-fil. Når du har gjort dette, åpner du den nyopprettede membership.php-filen i en kodeditor, og la oss gjøre den funksjonen som vil behandle brukerens data. 

La oss først løpe gjennom logikken. Når send-knappen er slått, vil vi sjekke at vårt nonce-felt er sendt - dette kontrollerer at dataene kommer fra riktig sted. 

Hvis denne tilstanden er oppfylt, vil vi få den nåværende brukerens ID, da vi trenger dette for å lagre dataene mot. Da ønsker vi å ordne våre data til en struktur WordPress liker - i dette tilfellet er det en matrise med bestemte nøkler. Før vi lagrer dataene, vil vi også validere og sanitere det. Og til slutt vil vi vise meldinger til brukeren vår, enten av suksess eller feil.

Og koden for alt som ser noe ut som dette:

 sanitize_text_field ($ _POST ['first_name']), 'last_name' => sanitize_text_field ($ _POST ['last_name']), 'user_email' => sanitize_email ($ _POST ['email']), 'twitter_name' => sanitize_text_field $ _POST ['twitter_name']), 'user_pass' => $ _POST ['pass1'],); hvis (! tomt ($ user_data ['user_pass'])) // Validere passordene for å sjekke at de er de samme. hvis (strcmp ($ user_data ['user_pass'], $ _POST ['pass2'])! == 0) wp_redirect ('? password-error = true'); exit;  else // Hvis passordfeltene ikke er angitte, lagrer du ikke. unset ($ user_data ['user_pass']);  // Lagre verdiene til innlegget. foreach ($ user_data som $ key => $ verdi) $ results = "; // http://codex.wordpress.org/Function_Reference/wp_update_user if ($ key == 'twitter_name') $ results = update_user_meta user_id, $ key, $ value); unset ($ user_data ['twitter_name']); elseif ($ key == 'user_pass') wp_set_password ($ user_data ['user_pass'], $ user_id); ['user_pass']); else // Lagre de gjenværende verdiene. $ results = wp_update_user (array ('ID' => $ user_id, $ key => $ value)); Hvis (! er_wp_error ($ resultater) ) wp_redirect ('? profile-updated = true'); wp_redirect ('? profile-updated = false'); avslutte; add_action ('tutsplus_process_user_profile', 'tutsplus_process_user_profile_data');

Nå kan du legge merke til at dataene blir lagret ved hjelp av tre forskjellige WordPress-funksjoner:

  • update_user_meta () for Twitter-navnet
  • wp_set_password () for passordet
  • wp_update_user () for de gjenværende dataene

Og du har rett til å stille spørsmål til dette. I utgangspunktet må de tilpassede metadataene (Twitter-navnet) behandles ved hjelp av den relative funksjonen og ikke den generelle oppdateringsbrukerfunksjonen. Som for passordet, mens det kan fungere med wp_update_user (), Jeg har hatt problemer med det og foretrekker å bruke denne metoden. Husk dette er bare en guide, og ofte er koden rettet mot å demonstrere ulike metoder for å oppnå dine krav. 

Ok, så nå har vi vår funksjon til å behandle dataene, men det blir ikke kalt hvor som helst. På slutten av vår funksjon kan du se at det er en handling knyttet til den. Så for å ringe den funksjonen trenger vi bare å bruke WordPress som følger med: do_action () ;. Lim så denne linjen over skjemaet ditt i brukerprofil-siden-malen vi opprettet tidligere:

Med det på plass, når vi sender inn skjemaet, skal det løpe gjennom vår funksjon og behandle dataene. 

Feil og suksessmeldinger

Vårt profilskjema skal lagre eller avvise dataene nå. Kanskje de to passordene ikke var de samme og lagret ikke. Det finnes ingen meldinger for å gi tilbakemeldinger fra brukerne. La oss redde brukerne litt sorg og gi dem noen meldinger. 

I vår tutsplus_process_user_profile () funksjon du kanskje har lagt merke til at den legger til forskjellige spørringsstrenger til nettadressen, avhengig av resultatet av behandlingen. Så hvis alt er lagret og vellykket, vil nettadressen vår bli lagt til ?profil-updated = sant, og disse varierer basert på resultatene. Det vi trenger å gjøre er å utløse en melding basert på disse svarene. 

Nedenfor har jeg brukt et filter for å gripe inn på innholdet, og gjennom magien til $ _GET Vi kan sjekke parametrene og spytte ut det vi trenger. 

Ok, ikke helt der - vi bruker en funksjon som heter tutsplus_get_message_markup () ovenfor, men vi har ikke definert det ennå. Det tar i to parametere:

  • en streng: meldingen som skal vises
  • en streng: alvorlighetsgraden av varsel for å vise basert på Bootstrap  

Så la oss definere vår tutsplus_get_message_markup () funksjon:

'; $ output. = ''; $ output. = '

'. $ melding. '

'; $ output. = '
'; returnere $ output;

Flott. Nå kan våre medlemmer se om deres data blir lagret eller ikke. 

Ekstra kreditt

Så nå har vi en fungerende prototype for et medlemssted. Mye av denne funksjonaliteten leveres med WordPress, men vi har stylet og tweaked det for å gjøre det til en bedre opplevelse for våre brukere. Så nå, la oss bare prutte vår "Jeg er og krysse vår 'T for å forbedre opplevelsen akkurat det litt mer. 

For det første vil vi Hold ikke-loggede brukere i stand til å få tilgang til profilsiden. En enkel omdirigering til hjemmesiden vil gjøre. Jeg har gjort en funksjon som bare gjør det, og jeg kaller det på sider jeg vil få tilgang til utelukkende av innloggede brukere. 

Her er funksjonen, som er plassert i membership.php: 

Nå kan vi bare ringe funksjonen øverst på brukerprofil-siden. 

Neste opp vil vi beholde brukerne godt, abonnenter-ut av administrasjonsområdet. Og på toppen av det, la oss fjern administrasjonslinjen for innloggede brukere. Igjen, la oss sette dette inn i vår membership.php.

Og til slutt er det ikke veldig enkelt å navigere på innlogging / logout skjermene. La oss legge til noen brukerspesifikke navigasjon. Det jeg har gjort er å opprette en funksjon som utsender den aktuelle koden, og dette kalles så i våre maler / header.php hvor hovednavigasjonen gjengis. 

'; hvis (is_user_logged_in ()) echo '
  • '; ekko '' . $ welcome_message. ''; ekko '
  • '; ekko '
  • '; ekko '' . __ ('Log out', 'salvie'). ''; ekko '
  • '; annet echo '
  • '; ekko '' . __ ('Logg inn', 'salvie'). ''; ekko '
  • '; ekko '';

    Sammendrag

    WordPress er et fantastisk grunnlag for et medlemsapplikasjon. Den har allerede så mye av funksjonaliteten knyttet til denne typen søknad. På toppen av det har folkene på WordPress gjort det ganske enkelt å hekte på hendelser og filtrere innhold slik at vi kan forlenge det som allerede er der. 

    Jeg håper dette har gitt deg metodene, ideene og kunnskapen til å utvikle dine egne medlemssteder. Dette er på ingen måte en hel guide om dette emnet, men det tjener som et grunnlag.

    Eventuelle tilbakemeldinger er velkomne, og jeg skal gjøre mitt beste for å svare på eventuelle spørsmål i kommentarene.

    Ting å merke seg

    Merk: Hvis du laster ned koden fra GitHub-depotet, inneholder den alle filene for å få temaet ditt i gang. Tanken er at du kan ta tak i repo og bare kjøre de nødvendige Gulp and Bower-kommandoene, og du vil være borte! Hvis du bare vil ha filene som inneholder kode som er spesifikke for denne serien, er filene oppført nedenfor: 

    • alle filene i administrasjonsmappen  
    • lib / admin.php 
    • lib / membership.php
    • mal-user-profile.php