Omdirigere brukere til egendefinerte sider etter rolle

WordPress blir brukt mer og mer som et webapplikasjonsramme. Med den bruken saken kommer en haug med ekstra omstendigheter som WordPress ikke dekker. Ønsker du virkelig at brukerne dine skal se WordPress admin?

I min webapplikasjonsutvikling erfaring, er svaret på det spørsmålet vanligvis "nei".

I dag skal jeg lære deg hvordan du kan omdirigere en bruker basert på deres rolle til en tilpasset side i WordPress.


Komme i gang

La oss starte dette ved å bygge et plugin. Du vil ha dette i et plugin, fordi det er sannsynlig at du vil endre temaet design og fortsatt vil ha omdirigeringsfunksjonaliteten. Eventuell funksjonalitet du vil leve forbi dagens tema design, skal være i et plugin.

Opprett en ny plugin-mappe i din wp-innhold / tillegg katalog kalt 'cm-redirect-by-rolle'og legg til en fil som heter cm-omdirigere-by-role.php. Til den filen skal vi legge til den grunnleggende WordPress-pluginhodet sett nedenfor.

Nå som du har en plugin startet, kan vi se på hvordan brukerinnlogging fungerer.


Brukerlogg Flow

Standardpunktet som en bruker kan logge på på WordPress-siden din er via http://yoursite.com/wp-login.php. Når du logger deg på et nettsted fra den plasseringen, sender nettstedet deg til WordPress admin dashboard.

Det betyr at WordPress admin starter opp, og du må bruke en admin-handling for å fange brukeren. Jeg hekker alltid admin_init handling siden det går sent nok til at du har tilgang til brukerdata, men ikke så sent at brukeren vil se noe på dashbordet.

Bruker admin_init handling betyr at selv om de allerede er logget inn og prøver å få tilgang til WordPress admin, vil de fortsatt bli omdirigert.

La oss nå se koden vi skal bruke. For vårt eksempel antar vi at vi vil omdirigere alle abonnenter, men dette vil fungere med en hvilken som helst standard eller tilpasset rolle i WordPress.

/ ** * Omdirigerer brukere basert på deres rolle * * @since 1.0 * @author SFNdesign, Curtis McHale * * @uses wp_get_current_user () Returnerer et WP_User-objekt for den nåværende brukeren * @uses wp_redirect () Omdirigerer brukeren til den angitte nettadressen * / funksjon cm_redirect_users_by_role () $ current_user = wp_get_current_user (); $ role_name = $ current_user-> roller [0]; hvis ('abonnent' === $ roll_name) wp_redirect ('http://yoursite.com/dashboard');  // // // cm_redirect_users_by_role add_action ('admin_init', 'cm_redirect_users_by_role');

Vi starter denne prosessen ved å få vårt nåværende brukerobjekt med wp_get_current_user (). Ut av det får vi vårt navn og tildeler det til $ role_name variabel.

Så sjekker vi om $ role_name samsvarer med rollen vi vil omdirigere. Hvis det gjør vi bruker vi wp_redirect å sende brukeren til vårt valgsted.

Selv om dette vil fungere, har vi enda et stykke å legge til.


Gjør det AJAX trygt

Når du lager AJAX-anrop i WordPress, bør du alltid ringe WordPress AJAX-rutefilen som er inne i WordPress-administrasjonen. Hvis vi forlater vår kode som det er noe AJAX-anrop laget av våre matchende roller vil mislykkes siden det vil møte vår betingede og bli omdirigert.

For å fikse det må vi sjekke om vi for øyeblikket gjør et AJAX-anrop, og hvis så, hopp over rollen, sjekk.

funksjon cm_redirect_users_by_role () hvis (! definert ('DOING_AJAX')) $ current_user = wp_get_current_user (); $ role_name = $ current_user-> roller [0]; hvis ('abonnent' === $ roll_name) wp_redirect ('http://yoursite.com/dashboard');  // hvis $ roll_name // hvis DOING_AJAX // cm_redirect_users_by_role add_action ('admin_init', 'cm_redirect_users_by_role');

Nå har vi vår omdirigeringsfunksjon innpakket i en sjekk for DOING_AJAX konstant. Hvis det er definert, kjører vi et AJAX-anrop, og vi ønsker å hoppe over viderekoblingskoden.


Konklusjon

Det er det vi kan nå omdirigere brukere basert på deres rolle til et tilpasset sted å velge. Vi kan til og med omdirigere brukere med forskjellige roller til forskjellige sider hvis vi ville.

Alt vi trenger å gjøre er å legge til et sekund betinget for å matche den andre rollen og sette stedet til der vi ønsket å omdirigere.