WordPress Roller og evner Et virkelighetseksempel

Dette er en firedelers serieopplæring som dekker WordPress-brukere, roller og evner. Serien vil dekke arkitekturen og utformingen av brukerrollene i WordPress; Fremhev de viktigste funksjonene for samhandling med brukere og styring av roller og evner; og i den siste opplæringen skal vi bygge et virkelighetseksempel som demonstrerer nytten av denne APIen.


Introduksjon

Denne opplæringen vil være fokusert på å bygge en praktisk løsning ved hjelp av WordPress-roller og -funksjonssystemet. Hvis du har gått glipp av de to siste opplæringsprogrammene, vil jeg anbefale at du sjekker dem ut. Den første delen "WordPress Roller and Capabilities: The Basics" forklarer utformingen av dette systemet; mens den andre delen "WordPress Roller and Capabilities: Funksjoner of Note" fokuserer på funksjonene og klassene WordPress tilbyr for å samhandle med systemet.

Løsningen foreslått i denne opplæringen er den samme jeg bruker for en av mine premium WordPress-plugins. Jeg har valgt det etter å ha prøvd forskjellige tilnærminger. Det er enkelt, kort og innkapslet i en klasse. Du kan enkelt tilpasse det til ditt eget plugin. Koden er tilgjengelig på GitHub; og er ikke lisensiert. Det kommer også uten garantier, og du er fri til å bruke og lisensiere det som du ønsker.


Trinn 1 Scenarioet

Vi bygger et WordPress-plugin som har et spesielt klientadministrasjonspanel. Dette administrasjonspanelet skal bare være tilgjengelig for et begrenset sett av brukere. Disse brukerne kan velges av bloggadministratoren. Han kan aktivere forskjellige roller, brukere eller alle av dem for å få tilgang til klientadministrasjonspanelet eller -funksjonene.

Bortsett fra det, må vi ha et begrenset mediebibliotek tilgang for brukere med tilgang til klientpanelet. WordPress har en spesiell mulighet til å få tilgang til og laste opp filer til mediebiblioteket: "Last opp filer"Dette gir brukeren (eller rollen) full tilgang til mediebiblioteket. Dette er ikke bra, spesielt at bilder (eller filer) ikke kan hierarkiseres under forskjellige kategorier hvor du kan begrense tilgangen for hver enkelt.

Vi må begrense mediebiblioteket bare tilgang til filene brukeren har lastet opp. Han burde ikke ha tilgang til andre brukeres opplastinger. Denne begrensningen bør bare brukes til brukere som ikke har "Last opp filer"Andre brukere og roller er ikke opptatt av denne begrensningen, siden de allerede har full tilgang til mediebiblioteket.

Vår blogg vil ha disse fire kategoriene av brukere:

De to første settene av brukere er de som ikke vil ha tilgang til plugin-klientpanelet. Jeg har fremhevet det faktum at det er brukere som har tilgang til mediebiblioteket, og et sett som ikke gjør det. Det er viktig at løsningen vår ikke påvirker de to første kategoriene, og la deres evner være intakt.

Med det i tankene, bør vår klasse gjøre to ting:

  • Angi de riktige tillatelsene til det tredje og fjerde settet av brukere
  • Aktiver et begrenset Media Library-tilgang til den fjerde kategorien. Det bør sørge for at etter at du deaktiverer plugin-modulen eller endrer brukerens rettigheter, får denne kategorien brukere tilbake sine opprinnelige tillatelser.

Trinn 2 Plugin-grensesnittet

Før du lager vår klasse, la oss få en dypere ide om plugin. Pluggen har en ganske enkel struktur. Den består av to forskjellige menyer: En for administratoren, og den fungerer som et administrativt panel, kun tilgjengelig for brukere med mulighet for "manage_options"Den andre menyen er for klienter og gir tilgang til klientpanelet. Dette panelet krever en"wptuts_client_page" evne.

Denne funksjonen finnes ikke i WordPress; Vi må legge til og tildele den til de angitte brukerne eller rollene. Men før det, la oss ta en titt på plugin.

 / * Plugin Name: WordPress Roller Plugin Plugin URI: https://github.com/omarabid/WordPress-Roles-Plugin Beskrivelse: En WordPress Roller Plugin Forfatter: Abid Omar Forfatter URI: http://omarabid.com Versjon: 1.0 * / // Legg til en admin brukermeny til WordPress Dashboard add_action ('admin_menu', 'wptuts_admin_menu'); funksjon wptuts_admin_menu () add_menu_page ('Admin tilgang', 'Admin tilgang', 'manage_options', 'wptuts-admin', 'wptuts_admin_page');  funksjon wptuts_admin_page () echo 'Admin Page';  // Legg til en klient brukermeny til WordPress Dashboard add_action ('admin_menu', 'wptuts_client_menu'); funksjon wptuts_client_menu () add_menu_page ('Client Access', 'Client Access', 'wptuts_client', 'wptuts-client', 'wptuts_client_page');  funksjon wptuts_client_page () echo 'Client Page'; 

Vi har to "admin_menu"handlingskroker som legger til Admin-menyen for både administratoren og klienten. Vi kan forkorte den til bare en krok som legger til begge, men jeg foretrekker å skille de to. Hver"add_menu_page"funksjon kroker til en annen funksjon som vil vise sidens innhold.

Deretter må vi initialisere vår Roller-klasse. Klassekoden er plassert i en annen fil; og initialiseringsprosessen gjøres under "i det"krok som sikrer at WordPress er ferdig med å laste.

Konstruktorfunksjonen aksepterer tre parametere:

  • $ alle Boolsk (valgfri) Hvis du vil gi klienten tilgang til alle brukere på bloggen, kan du sette dette til ekte og ignorere de gjenværende parameterne.
  • $ roller Array (valgfritt) En gruppe med roller 'ids som vil ha tilgang til klientpanelet.
  • $ brukere Array (valgfritt) Et utvalg med brukernavn som vil ha tilgang til klientpanelet.
 // Laster og initialiser roller klassen add_action ('init', 'wptuts_start_plugin'); funksjon wptuts_start_plugin () require_once ('roles_class.php'); $ all = false; $ roller = array ('abonnent'); $ users = array (3); nye wpttuts_roles ($ alle, $ roller, $ brukere); 

Trinn 3 Rollen Klassen

Egenskapene

Klassen har bare 3 egenskaper: $ alle, $ roller og $ brukere. Disse er de samme variablene som du overfører til konstruktørfunksjonen. Verdien av variablene endres ikke i vårt eksempel; men i et reelt praktisk tilfelle vil du kanskje slå sammen med en annen kilde. For dette har du set_entities funksjon. Du kan imøtekomme det til dine egne behov.

 / ** * @var boolean * / privat $ alle; / ** * @var array * / private $ roller; / ** * @var array * / private $ brukere; / ** * Angi tillatelsesenhetene * * @param boolean $ alle * @param array $ roller * @param array $ users * / private funksjon set_entities ($ alle, $ roller, $ brukere) $ this-> all = $ alle; $ this-> roller = $ roller; $ this-> users = $ users; 

Konstruksjonsfunksjonen

I et første trinn initialiserer konstruktørfunksjonen $ alle, $ roller og $ brukere variabler ved hjelp av set_entitites () funksjon. Deretter kaller det en privat funksjon for å sette inn mulighetene, og en annen for begrensning av mediebiblioteket. Dette er akkurat de trinnene vi har definert i vårt scenario.

 / ** * Oppretter en ny forekomst av Roller klassen * * @param boolean $ alle * @param array $ roller * @param array $ users * / function __construct ($ all = false, $ roller = array (), $ users = array ()) // Sett de tillatte enhetene $ this-> set_entities ($ all, $ roller, $ users); // Angi tillatelsen til brukertilgang $ this-> set_permissions (); // Media Library Filter $ this-> media_filter (); 

Statiske funksjoner

Statiske funksjoner krever ikke klasseinitialisering. De ligner på uavhengige funksjoner, men bare knyttet til den angitte klassen. Jeg har bestemt meg for å holde noen funksjoner statiske fordi de kan brukes uavhengig; og du kan finne dem nyttige i en annen kontekst.

Disse funksjonene er filter_roles () og filter_users (); som er knyttet til to andre funksjoner role_has_caps () og user_has_caps (). Funksjonene spiller en del av et filter. De filtrerer roller (eller brukere) basert på evner de har og ikke har.

Begge funksjonene godtar to argumenter:

  • $ inkludere Array En rekke evner som rollen har.
  • $ utelukke Array En rekke evner som rollen ikke har.
 / ** * Filtrer alle roller i bloggen basert på evner * * @static * @param array $ inkluderer Array of capabilities to include * @param array $ ekskluder Array of capabilities to exclude * @return array * / statisk funksjon filter_roles ($ Inkluder, $ ekskluder) $ filtered_roles = array (); global $ wp_roles; $ roller = $ wp_roles-> get_names (); foreach ($ roller som $ role_id => $ role_name) $ role = get_role ($ role_id); hvis (selv: role_has_caps ($ rolle, $ inkluderer) &&! selv :: role_has_caps ($ rolle, $ ekskluder)) $ filtered_roles [] = $ role_id;  returnere $ filtered_roles;  / ** * Filtrer alle brukere av bloggen basert på evner * * @static * @param array $ inkluderer Array of capabilities to include * @param array $ exclude Array of capabilities to exclude * @return array * / static function filter_users ( $ inkluderer, $ ekskluder) $ filtered_users = array (); $ users = get_users (); foreach ($ brukere som $ bruker) $ user = ny WP_User ($ user-> ID); hvis (selv :: user_has_caps ($ user, $ include) &&! selv :: user_has_caps ($ user, $ exclude)) $ filtered_users [] = $ bruker-> ID;  returnere $ filtered_users; 

Funksjonene løp gjennom alle roller og brukere i databasen. For hver rolle (eller bruker) kontrollerer den om den har de nødvendige evner, og har ikke muligheten til å utelukke. Denne sjekken er ferdig med role_has_caps () og user_has_caps () funksjoner.

Disse to funksjonene (role_has_caps () og user_has_caps ()) godta to argumenter:

  • $ rolle (eller $ user) string Roll-ID eller bruker-ID.
  • $ caps Array En rekke muligheter for å sjekke imot.

Hvis rollen (eller brukeren) har de angitte egenskapene i $ caps array, returnerer funksjonen sann. I andre tilfelle returnerer funksjonen falsk. Funksjonen går i utgangspunktet gjennom hver evne og kontrollerer at rollen (eller brukeren) har den angitte evnen.

 / ** * Returnerer sant hvis en rolle har evnene i passordet array * * @ statisk * @param $ rolle * @param $ caps * @return bool * / statisk funksjon role_has_caps ($ rolle, $ caps) foreach ($ caps som $ cap) if (! $ role-> has_cap ($ cap)) return false;  returnere sann;  / ** * Returnerer sant hvis en bruker har evnene i passordet array * * @static * @param $ user * @param $ caps * @return bool * / statisk funksjon user_has_caps ($ bruker, $ caps) foreach $ caps som $ cap) if (! $ user-> has_cap ($ cap)) return false;  returnere sann; 

Legge til tillatelser

Dette er det første trinnet med å pålegge loven til pluginet vårt. Jeg har distribuert funksjonaliteten over 3 funksjoner: En for å sette tillatelser til alle brukere, en for å sette tillatelser til rollene, og en annen for å sette tillatelser til de angitte brukerne. Hovedfunksjonen bestemmer bare hvilke funksjoner som skal ringes.

 / ** * Angi tilgangsrettigheter for meny og sider * / privat funksjon set_permissions () $ this-> set_all_permissions (); hvis (! $ this-> all) $ this-> set_roles_permissions (); $ Dette-> set_users_permissions (); 

De set_all_permissions () funksjonsløyfer gjennom alle brukerne i bloggen, og legg til (eller fjern) "wptuts_client"evne avhengig av verdien av $ alle variabel. Vi får hele listen over brukere som bruker get_users () funksjon; og initialiser en ny WP_User motta for å få tilgang til add_cap () og remove_cap () funksjoner.

 / ** * Angi tillatelsene for ALLE brukere * / privat funksjon set_all_permissions () $ users = get_users (); foreach ($ brukere som $ bruker) $ user = ny WP_User ($ user-> ID); hvis ($ this-> all) $ user-> add_cap ('wptuts_client');  ellers $ user-> remove_cap ('wptuts_client'); 

De set_roles_permissions () funksjonsløyfer gjennom alle roller i bloggen og fjerner "wptuts_client"evne. Etter det løper det gjennom roller i $ roller array og legger til "wptuts_client"evne. Det første trinnet var å sikre at vi rydde evnen fra roller som tidligere har hatt det.

 / ** * Angi tillatelsene for Roller * / privat funksjon set_roles_permissions () global $ wp_roles; $ roller = $ wp_roles-> get_names (); foreach ($ roller som $ role_id => $ role_name) $ role = get_role ($ role_id); $ Rolle> remove_cap ( 'wptuts_client');  hvis (! tomt ($ this-> roller)) foreach ($ this-> roller som $ role_id) $ role = get_role ($ role_id); $ Rolle> add_cap ( 'wptuts_client'); 

De set_users_permissions () funksjonen gjør det samme som den siste funksjonen. Den eneste forskjellen er at den målretter brukere i stedet for roller.

 / ** * Angi tillatelsene for bestemte Brukere * / private funksjon set_users_permissions () $ users = get_users (); foreach ($ brukere som $ bruker) $ user = ny WP_User ($ user-> ID); $ Bruker-> remove_cap ( 'wptuts_client');  hvis (! tom ($ dette-> brukere)) foreach ($ this-> brukere som $ user_id) $ user = ny WP_User ($ user_id); $ Bruker-> add_cap ( 'wptuts_client'); 

Media Library Filter

Nå har vi satt de riktige tillatelsene for de rette enhetene. (Å være enten en bruker eller en rolle) Vi må også begrense mediebibliotekets tilgang til den fjerde kategorien som vi skiller seg ut i scenariet.

Denne kategorien av roller (eller brukere) har "wptuts_client"evne, men har ikke"Last opp filer"evne. Og det er her våre filterfunksjoner kommer inn i spill. De hjelper oss å filtrere og returnere denne kategorien av roller (eller brukere).

For denne kategorien legger vi til to muligheter "Last opp filer"og"remove_upload_files"."Last opp filer"gir full tilgang til mediebiblioteket, og den andre funksjonen vil bli brukt til å filtrere mediebibliotekspostene, og det vil også bli brukt til å fjerne"Last opp filer"evne en gang"wptuts_client"evnen er også fjernet.

 / ** * Begrens media tilgang * / privat funksjon media_filter () // Bruk mediefilteret for nåværende Klienter $ roller = self :: filter_roles (array ('wptuts_client'), array ('upload_files')); $ users = self :: filter_users (array ('wptuts_client'), array ('upload_files')); $ this-> roles_add_cap ($ roller, 'upload_files'); $ this-> roles_add_cap ($ roller, 'remove_upload_files'); $ this-> users_add_cap ($ brukere, 'upload_files'); $ this-> users_add_cap ($ users, 'remove_upload_files'); // Begrens tilgang til mediebiblioteket add_filter ('parse_query', array (& $ this, 'restrict_media_library')); // For rengjøringsformål $ clean_roles = self :: filter_roles (array ('remove_upload_files'), array ('wptuts_client')); $ clean_users = self :: filter_users (array ('remove_upload_files'), array ('wptuts_client')); $ this-> roles_remove_cap ($ clean_roles, 'upload_files'); $ this-> roles_remove_cap ($ clean_roles, 'remove_upload_files'); $ this-> users_remove_cap ($ clean_users, 'upload_files'); $ this-> users_remove_cap ($ clean_users, 'remove_upload_files'); 

Etter å ha satt mulighetene til denne kategorien, hekser vi på "parse_queryfilter. Dette filteret lar oss endre innleggene returnert av WP_Query. I vårt tilfelle skal vi sette "forfatter"spørringsvariabel. Dette resulterer i å returnere kun innlegg opprettet av den angitte forfatteren.

 / ** * Begrens tilgang til mediebiblioteket * * @param $ wp_query * / offentlig funksjon restrict_media_library ($ wp_query) hvis (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/upload.php')) (current_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('author', $ current_user-> ID);  annet hvis (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/media-upload.php')) if (current_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('author', $ current_user-> ID); 

Den fullstendige koden

 hvis (! class_exists ('wpttuts_roles')) class wpttuts_roles / ** * Bestemmer om alle brukere vil ha de nødvendige tillatelsene * * @var boolean * / private $ all; / ** * En matrise med rollene som har de nødvendige tillatelsene * * @var array * / private $ roller; / ** * En matrise med brukernavnene som har de nødvendige tillatelsene * * @var array * / private $ users; / ** * Oppretter en ny forekomst av Roller klassen * * @param boolean $ alle * @param array $ roller * @param array $ users * / function __construct ($ all = false, $ roller = array (), $ users = array ()) // Sett de tillatte enhetene $ this-> set_entities ($ all, $ roller, $ users); // Angi tillatelsen til brukertilgang $ this-> set_permissions (); // Media Library Filter $ this-> media_filter ();  / ** * Angi tillatelsesenhetene * * @param boolean $ alle * @param array $ roller * @param array $ users * / private funksjon set_entities ($ alle, $ roller, $ brukere) $ this-> all = $ alt; $ this-> roller = $ roller; $ this-> users = $ users;  / ** * Angi tilgangsrettigheter for meny og sider * / privat funksjon set_permissions () $ this-> set_all_permissions (); hvis (! $ this-> all) $ this-> set_roles_permissions (); $ Dette-> set_users_permissions ();  / ** * Angi tillatelsene for ALLE brukere * / privat funksjon set_all_permissions () $ users = get_users (); foreach ($ brukere som $ bruker) $ user = ny WP_User ($ user-> ID); hvis ($ this-> all) $ user-> add_cap ('wptuts_client');  ellers $ user-> remove_cap ('wptuts_client');  / ** * Angi tillatelsene for Roller * / privat funksjon set_roles_permissions () global $ wp_roles; $ roller = $ wp_roles-> get_names (); foreach ($ roller som $ role_id => $ role_name) $ role = get_role ($ role_id); $ Rolle> remove_cap ( 'wptuts_client');  hvis (! tomt ($ this-> roller)) foreach ($ this-> roller som $ role_id) $ role = get_role ($ role_id); $ Rolle> add_cap ( 'wptuts_client');  / ** * Angi tillatelsene for bestemte Brukere * / private funksjon set_users_permissions () $ users = get_users (); foreach ($ brukere som $ bruker) $ user = ny WP_User ($ user-> ID); $ Bruker-> remove_cap ( 'wptuts_client');  hvis (! tom ($ dette-> brukere)) foreach ($ this-> brukere som $ user_id) $ user = ny WP_User ($ user_id); $ Bruker-> add_cap ( 'wptuts_client');  / ** * Begrens media tilgang * / privat funksjon media_filter () // Bruk mediefilteret for currenct AdPress Clients $ roller = self :: filter_roles (array ('wptuts_client'), array ('upload_files')) ; $ users = self :: filter_users (array ('wptuts_client'), array ('upload_files')); $ this-> roles_add_cap ($ roller, 'upload_files'); $ this-> roles_add_cap ($ roller, 'remove_upload_files'); $ this-> users_add_cap ($ brukere, 'upload_files'); $ this-> users_add_cap ($ users, 'remove_upload_files'); // Begrens tilgang til mediebiblioteket add_filter ('parse_query', array (& $ this, 'restrict_media_library')); // For rengjøringsformål $ clean_roles = self :: filter_roles (array ('remove_upload_files'), array ('wptuts_client')); $ clean_users = self :: filter_users (array ('remove_upload_files'), array ('wptuts_client')); $ this-> roles_remove_cap ($ clean_roles, 'upload_files'); $ this-> roles_remove_cap ($ clean_roles, 'remove_upload_files'); $ this-> users_remove_cap ($ clean_users, 'upload_files'); $ this-> users_remove_cap ($ clean_users, 'remove_upload_files');  / ** * Legg til evnen til et Array of Roles * * @param $ roller * @param $ cap * / privat funksjon roles_add_cap ($ roller, $ cap) foreach ($ roller som $ rolle) $ role = get_role ($ rolle); $ Rolle> add_cap ($ cap);  / ** * Legg til mulighet til et Array av brukere * * @param $ brukere * @param $ cap * / privat funksjon users_add_cap ($ brukere, $ cap) foreach ($ brukere som $ bruker) $ user = ny WP_User ($ bruker); $ Bruker-> add_cap ($ cap);  / ** * Fjern en funksjon fra et Array of Roles * * @param $ roller * @param $ cap * / privat funksjon roles_remove_cap ($ roller, $ cap) foreach ($ roller som $ rolle) $ role = get_role ($ rolle); $ Rolle> remove_cap ($ cap);  / ** * Fjern en mulighet fra et Array av brukere * * @param $ brukere * @param $ cap * / privat funksjon users_remove_cap ($ brukere, $ cap) foreach ($ brukere som $ bruker) $ user = ny WP_User ($ bruker); $ Bruker-> remove_cap ($ cap);  / ** * Filtrer alle roller i bloggen basert på evner * * @static * @param array $ inkluderer Array of capabilities to include * @param array $ ekskluder Array of capabilities to exclude * @return array * / statisk funksjon filter_roles ($ inkluderer, $ ekskluder) $ filtered_roles = array (); global $ wp_roles; $ roller = $ wp_roles-> get_names (); foreach ($ roller som $ role_id => $ role_name) $ role = get_role ($ role_id); hvis (selv: role_has_caps ($ rolle, $ inkluderer) &&! selv :: role_has_caps ($ rolle, $ ekskluder)) $ filtered_roles [] = $ role_id;  returnere $ filtered_roles;  / ** * Returnerer sant hvis en rolle har evnene i passordet array * * @ statisk * @param $ rolle * @param $ caps * @return bool * / statisk funksjon role_has_caps ($ rolle, $ caps) foreach $ caps som $ cap) if (! $ role-> has_cap ($ cap)) return false;  returnere sann;  / ** * Filtrer alle brukere av bloggen basert på evner * * @static * @param array $ inkluderer Array of capabilities to include * @param array $ exclude Array of capabilities to exclude * @return array * / static function filter_users ( $ inkluderer, $ ekskluder) $ filtered_users = array (); $ users = get_users (); foreach ($ brukere som $ bruker) $ user = ny WP_User ($ user-> ID); hvis (selv :: user_has_caps ($ user, $ include) &&! selv :: user_has_caps ($ user, $ exclude)) $ filtered_users [] = $ bruker-> ID;  returnere $ filtered_users;  / ** * Returnerer sant hvis en bruker har evnene i passordet array * * @static * @param $ user * @param $ caps * @return bool * / statisk funksjon user_has_caps ($ bruker, $ caps) foreach $ caps som $ cap) if (! $ user-> has_cap ($ cap)) return false;  returnere sann;  / ** * Begrens tilgang til mediebibliotek * * @param $ wp_query * / offentlig funksjon restrict_media_library ($ wp_query) hvis (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/upload.php'))  hvis (current_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('author', $ current_user-> ID);  annet hvis (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/media-upload.php')) if (current_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('author', $ current_user-> ID); 

Konklusjon

I denne opplæringen prøvde jeg å bruke materialet vi lærte fra de to foregående innleggene for å skape en tilpasset løsning for roller og evner. Løsningen var innkapslet i en klasse som kan tilpasses for dine egne behov eller plugins. Du kan finne koden på Github.

Hvis du har spørsmål, forslag eller forbedringer, kan du legge inn det i kommentarene.