Acesta este un tutorial în patru părți care acoperă tema utilizatorilor, rolurilor și capabilităților WordPress. Seria va acoperi arhitectura și designul rolurilor utilizatorilor în WordPress; evidențiați cele mai importante funcții pentru interacțiunea cu utilizatorii și gestionarea rolurilor și a capacităților; și în ultimul tutorial, vom construi un exemplu din viața reală care demonstrează utilitatea acestui API.
Acest tutorial va fi axat pe construirea unei soluții practice utilizând sistemul de roluri și capabilități WordPress. Dacă ați pierdut ultimele două tutoriale, aș fi foarte sugerat să le verificați. Prima parte "Rolurile și capabilitățile WordPress: Bazele" explică proiectarea acestui sistem; în timp ce partea a doua "WordPress roluri și capabilități: Funcții de notă" se concentrează pe funcții și clase WordPress oferă să interacționeze cu sistemul.
Soluția propusă în acest tutorial este aceeași pe care o folosesc pentru unul dintre pluginurile mele premium WordPress. Am ales-o după ce am încercat diferite abordări. Este simplu, scurt și încapsulat într-o clasă. Puteți să o adaptați cu ușurință pentru propriul plugin. Codul este disponibil pe GitHub; și nu este licențiată. De asemenea, nu vine cu garanții și sunteți liber să îl utilizați și să îl acordați licenței așa cum doriți.
Construim un plugin WordPress care are un panou de administrare client special. Acest panou de administrare trebuie să fie accesibil numai unui număr limitat de utilizatori. Acești utilizatori pot fi selectați de administratorul blogului. El poate permite diferitelor roluri, utilizatorilor sau tuturor utilizatorilor să acceseze panoul sau funcțiile administratorului clientului.
În afară de aceasta, trebuie să avem acces la o bibliotecă media restricționată pentru utilizatorii cu acces la Panoul de clienți. WordPress are o capacitate specială de a accesa și de a încărca fișiere în Biblioteca Media: "încărca fișiere
"Acest lucru oferă utilizatorului (sau rolului) un acces deplin la Biblioteca Media.Acest lucru nu este un lucru bun, mai ales că fotografiile (sau fișierele) nu pot fi ierarhizate în diferite categorii în care puteți restricționa accesul pentru fiecare.
Trebuie să restricționăm accesul Bibliotecii Media numai la fișierele pe care le-a încărcat utilizatorul. Nu ar trebui să aibă acces la încărcările altor utilizatori. Această restricție ar trebui aplicată numai utilizatorilor care nu au "încărca fișiere
"Alte utilizatori și roluri nu sunt preocupați de această restricție, deoarece au deja acces deplin la Biblioteca Media.
Blogul nostru va avea aceste patru categorii de utilizatori:
Primele două seturi de utilizatori sunt cele care nu vor avea acces la pluginul Panoul de clienți. Am subliniat faptul că există utilizatori care au acces la Biblioteca Media și un set care nu are. Este esențial ca soluția noastră să nu afecteze primele două categorii și să lase capabilitățile intacte.
În acest sens, clasa noastră ar trebui să facă două lucruri:
Înainte de a crea clasa noastră, să avem o idee mai profundă despre plugin. Pluginul are o structură destul de simplă. Este alcătuită din două meniuri diferite: una pentru administrator și servește drept panou administrativ, accesibil numai pentru utilizatorii cu capacitatea de a "manage_options
"Al doilea meniu este pentru clienti si ofera acces la panoul de clienti Acest panou necesita un"wptuts_client_page
"capacitate.
Această capacitate nu există în WordPress; trebuie să adăugăm și să îl atribuim utilizatorilor sau rolurilor specificate. Dar, înainte de asta, să aruncăm o privire asupra plugin-ului.
/ * Plugin Nume: WordPress roluri Plugin Plugin URI: https://github.com/omarabid/WordPress-Roles-Plugin Descriere: Un roluri WordPress Plugin Autor: Abid Omar Autor URI: http://omarabid.com Versiune: 1.0 * / / Adăugați un meniu de utilizator Administrator în tabloul de bord WordPress add_action ('admin_menu', 'wptuts_admin_menu'); funcția wptuts_admin_menu () add_menu_page ('Admin Access', 'Admin Access', 'manage_options', 'wptuts-admin', 'wptuts_admin_page'); funcția wptuts_admin_page () echo 'Pagina de administrare'; // Adăugați un meniu de utilizator client în tabloul de bord WordPress add_action ('admin_menu', 'wptuts_client_menu'); funcția wptuts_client_menu () add_menu_page ('Client Access', 'Client Access', 'wptuts_client', 'wptuts-client', 'wptuts_client_page'); funcția wptuts_client_page () echo 'Pagina de client';
Avem doua "admin_menu
"cârlige de acțiune care adaugă meniul Administrator atât pentru administrator, cât și pentru client, îl putem scurta doar într-un singur cârlig care le adaugă pe amândouă,add_menu_page
"funcționează cu o altă funcție care va afișa conținutul paginii.
Apoi, trebuie să inițializăm clasa rolurilor noastre. Codul de clasă este plasat într-un alt fișier; iar procesul de inițializare se face în timpul "init
"cârlig care asigură că WordPress a terminat încărcarea.
Funcția constructor acceptă trei parametri:
$ toate
Boolean (opțional) Dacă doriți să oferiți clientului acces la toți utilizatorii de pe blog, puteți seta acest lucru la adevărat și să ignorați parametrii rămași.$ roluri
Array (opțional) O matrice cu id-uri de roluri care vor avea acces la panoul client.utilizatorii $
Array (opțional) Un tablou cu numele de utilizator al utilizatorilor care vor avea acces la panoul client.// Încarcă și inițializează clasa de roluri add_action ('init', 'wptuts_start_plugin'); funcția wptuts_start_plugin () require_once ('roles_class.php'); $ all = false; $ roles = array ("abonat"); $ users = array (3); noi wpttuts_roles ($ toate, $ roluri, $ utilizatori);
Clasa are doar 3 proprietăți: $ toate
, $ roluri
și utilizatorii $
. Acestea sunt aceleași variabile pe care le treceți la funcția constructorului. Valoarea variabilelor nu este modificată în exemplul nostru; dar într-un caz real, este posibil să doriți să fuzionați cu o altă sursă. Pentru aceasta, aveți set_entities
funcţie. Puteți să vă adaptați la nevoile dvs..
/ ** * @var boolean * / privat $ toate; / ** * @var array * / roluri private $; / ** * @var array * / utilizatori particulari $; / ** * Setați entitățile de permisiune * * @param boolean $ all * @param array $ roluri * @param array $ users * / set privat set_entities ($ all, $ roles, $ users) $ this-> all = $ toate; $ this-> roles = $ roluri; $ this-> users = $ users;
Într-o primă etapă, funcția constructor inițializează $ toate
, $ roluri
și utilizatorii $
variabilele utilizând set_entitites ()
funcţie. Apoi, el numește o funcție privată pentru setarea capabilităților, iar alta pentru restricția Bibliotecii Media. Acestea sunt exact pașii pe care i-am definit în scenariul nostru.
/ ** * Crează o nouă instanță a clasei de roluri * * @param boolean $ all * @param array $ roluri * @param array $ users * / function __construct ($ all = false, $ roles = array () = array ()) // Setați entitățile permise $ this-> set_entities ($ all, $ roles, $ users); // Setați permisiunea de acces utilizator $ this-> set_permissions (); // Biblioteca media Filtru $ this-> media_filter ();
Funcțiile statice nu necesită inițierea clasei. Ele sunt similare cu funcțiile independente, ci pur și simplu legate de clasa specificată. Am decis să păstrez unele funcții statice deoarece pot fi utilizate independent; și le puteți găsi utile în alt context.
Aceste funcții sunt filter_roles ()
și filter_users ()
; care sunt asociate cu alte două funcții role_has_caps ()
și user_has_caps ()
. Funcțiile joacă rolul unui filtru. Ei filtrează roluri (sau utilizatori) pe baza capacităților pe care le au și nu le au.
Ambele funcții acceptă două argumente:
$ includ
mulțime O serie de capabilități pe care le are rolul.$ exclude
mulțime O serie de capabilități pe care rolul nu le are./ ** * Filtrează toate rolurile blogului pe baza capabilităților * * @static * @param array $ include Array de capabilități pentru a include * @param array $ exclude Array de capabilități pentru a exclude * @return array * / funcția statică filter_roles ($ include, exclude $) $ filtered_roles = array (); global $ wp_roles; $ roluri = $ wp_roles-> get_names (); foreach ($ roluri ca $ role_id => $ role_name) $ role = get_role ($ role_id); ($ role, $ exclude)) $ filtered_roles [] = $ role_id; returnează $ filtered_roles; / ** * Filtrează toți utilizatorii blogului pe baza capabilităților * * @static * @param array $ include Array de capabilități pentru a include * @param array $ exclude Array de capabilități pentru a exclude * @return array * / funcția statică filter_users ( $ include, $ exclude) $ filtered_users = array (); $ users = get_users (); foreach ($ utilizatori ca $ user) $ user = nou WP_User ($ user-> ID); dacă self :: user_has_caps ($ user, $ include) &&! self :: user_has_caps ($ user, $ exclude)) $ filtered_users [] = $ user-> ID; returnează $ filtered_users;
Funcționează buclă prin toate rolurile și utilizatorii din baza de date. Pentru fiecare rol (sau utilizator), verifică dacă are capacitățile necesare și nu are capacitatea de a exclude. Această verificare se efectuează cu role_has_caps ()
și user_has_caps ()
funcții.
Aceste două funcții (role_has_caps ()
și user_has_caps ()
) acceptă două argumente:
Dacă rolul (sau utilizatorul) are capacitățile specificate în capace $
array, funcția returnează adevărat. În celălalt caz, funcția revine false. Funcția practică buclele prin fiecare capabilitate și verifică dacă rolul (sau utilizatorul) are capacitatea specificată.
/ ** * Returnează adevărat dacă un rol are capabilitățile în matricea trecută * * @static * @param $ role * @param $ caps * @return bool * / funcție statică role_has_caps ($ role, $ caps) foreach ($ capace ca $ cap) if (! $ role-> has_cap ($ cap)) return false; return true; / ** * Returnează adevărat dacă un utilizator are capabilitățile în matricea trecută * * @static * @param $ user * @param $ caps * @return bool * / funcția statică user_has_caps ($ user, $ caps) foreach $ caps ca $ cap) if (! $ user-> has_cap ($ cap)) return false; return true;
Acesta este primul pas în impunerea legii pluginului nostru. Am distribuit funcționalitatea peste 3 funcții: una pentru setarea permisiunilor pentru toți utilizatorii, una pentru setarea permisiunilor pentru roluri și una pentru setarea permisiunilor pentru utilizatorii specificați. Funcția principală decide pur și simplu ce funcții trebuie să apeleze.
/ ** * Setați permisiunile de acces pentru meniuri și pagini * / set privat set_permissions () $ this-> set_all_permissions (); dacă (! $ acest-> toate) $ this-> set_roles_permissions (); $ This-> set_users_permissions ();
set_all_permissions ()
funcționează prin toți utilizatorii din blog și adaugă (sau elimină) mesajul "wptuts_client
"capacitate în funcție de valoarea $ toate
variabil. Avem lista completă a utilizatorilor folosind get_users ()
funcţie; și inițializați un nou WP_User
obiect pentru a obține acces la add_cap ()
și remove_cap ()
funcții.
/ ** * Setați permisiunile pentru TOATE utilizatorii * / funcția privată set_all_permissions () $ users = get_users (); foreach ($ utilizatori ca $ user) $ user = nou WP_User ($ user-> ID); dacă ($ acest-> toate) $ user-> add_cap ('wptuts_client'); altceva $ user-> remove_cap ('wptuts_client');
set_roles_permissions ()
funcționează prin toate rolurile din blog și elimină "wptuts_client
"capabilitate, după care se rotește prin roluri în $ roluri
matrice și adaugă "wptuts_client
"Prima etapă a fost aceea de a ne asigura că ne curățăm capacitatea de rolurile pe care le-a avut înainte.
/ ** * Setați permisiunile pentru Roles * / funcția privată set_roles_permissions () global $ wp_roles; $ roluri = $ wp_roles-> get_names (); foreach ($ roluri ca $ role_id => $ role_name) $ role = get_role ($ role_id); $-Simulare> remove_cap ( 'wptuts_client'); dacă (! empty ($ this-> roles)) foreach ($ this-> roluri ca $ role_id) $ role = get_role ($ role_id); $-Simulare> add_cap ( 'wptuts_client');
set_users_permissions ()
funcția face același lucru ca și ultima funcție. Singura diferență este că se adresează utilizatorilor în locul rolurilor.
/ ** * Setați permisiunile pentru anumiți utilizatori * / set privat set_users_permissions () $ users = get_users (); foreach ($ utilizatori ca $ user) $ user = nou WP_User ($ user-> ID); $ User-> remove_cap ( 'wptuts_client'); if (! empty ($ this-> users)) foreach ($ this-> utilizatori ca $ user_id) $ user = new WP_User ($ user_id); $ User-> add_cap ( 'wptuts_client');
Acum am setat permisiunile potrivite pentru entitățile potrivite. (Fiind un utilizator sau un rol) Trebuie să restrângem accesul bibliotecii media pentru a patra categorie pe care am distins-o în scenariu.
Această categorie de roluri (sau utilizatori) are funcția "wptuts_client
"capacitate, dar nu are"încărca fișiere
"și aici funcționează funcțiile noastre de filtrare, care ne vor ajuta să filtreze și să returneze această categorie de roluri (sau utilizatori).
Pentru această categorie, vom adăuga două capabilități "încărca fișiere
" și "remove_upload_files
""încărca fișiere
"va oferi acces complet la Biblioteca Media și cealaltă capabilitate va fi utilizată pentru filtrarea posturilor din Biblioteca Media și va fi de asemenea utilizată pentru a elimina"încărca fișiere
"capacitatea o dată"wptuts_client
"capacitatea este de asemenea eliminată.
/ ** * Restrict Media Access * / funcția privată media_filter () // Aplicați filtrul media pentru clienții curenți $ roles = self :: filter_roles (array ('wptuts_client'), array ('upload_files')); $ users = auto :: filter_users (array ('wptuts_client'), array ('upload_files')); $ this-> roles_add_cap ($ roluri, 'upload_files'); $ this-> roles_add_cap ($ roluri, 'remove_upload_files'); $ this-> users_add_cap ($ users, 'upload_files'); $ this-> users_add_cap ($ users, 'remove_upload_files'); // restricționează accesul bibliotecii media add_filter ('parse_query', array (& $ this, 'restrict_media_library')); // pentru curățare $ clean_roles = self :: filter_roles (array ('remove_upload_files'), array ('wptuts_client')); $ clean_users = auto :: 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');
Dupa ce am setat capabilitatile in aceasta categorie, am coborat la "parse_query
"filtru Acest filtru ne permite să schimbăm mesajele returnate WP_Query
. În cazul nostru, vom seta "autor
"variabila de interogare. Aceasta duce la returnarea numai a posturilor create de autorul specificat.
/ ** * Restricționează accesul Bibliotecii Media * * @param $ wp_query * / funcția publică restrict_media_library ($ wp_query) if (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/upload.php' (curent_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('autor', $ current_user-> ID); altfel dacă ($ _ SERVER ['REQUEST_URI'], '/wp-admin/media-upload.php')) dacă (actual_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('autor', $ current_user-> ID);
dacă class_exists ('wpttuts_roles')) class wpttuts_roles / ** * Stabilește dacă toți utilizatorii vor avea permisiunile necesare * * @var boolean * / private $ all; / ** * Un matrice cu roluri care au permisiunile necesare * * @var array * / roluri private $; / ** * Un tablou cu numele de utilizator care au permisiunile necesare * * @var array * / privat $ users; / ** * Crează o nouă instanță a clasei de roluri * * @param boolean $ all * @param array $ roluri * @param array $ users * / function __construct ($ all = false, $ roles = array () = array ()) // Setați entitățile permise $ this-> set_entities ($ all, $ roles, $ users); // Setați permisiunea de acces utilizator $ this-> set_permissions (); // Biblioteca media Filtru $ this-> media_filter (); / ** * Setați entitățile de permisiune * * @param boolean $ all * @param array $ roluri * @param array $ users * / set privat set_entities ($ all, $ roles, $ users) $ this-> all = $ toate; $ this-> roles = $ roluri; $ this-> users = $ users; / ** * Setați permisiunile de acces pentru meniuri și pagini * / privat set_permissions () $ this-> set_all_permissions (); dacă (! $ acest-> toate) $ this-> set_roles_permissions (); $ This-> set_users_permissions (); / ** * Setați permisiunile pentru TOȚI utilizatori * / privat set_all_permissions () $ users = get_users (); foreach ($ utilizatori ca $ user) $ user = nou WP_User ($ user-> ID); dacă ($ acest-> toate) $ user-> add_cap ('wptuts_client'); altceva $ user-> remove_cap ('wptuts_client'); / ** * Setați permisiunile pentru Roles * / funcția privată set_roles_permissions () global $ wp_roles; $ roluri = $ wp_roles-> get_names (); foreach ($ roluri ca $ role_id => $ role_name) $ role = get_role ($ role_id); $-Simulare> remove_cap ( 'wptuts_client'); dacă (! empty ($ this-> roles)) foreach ($ this-> roluri ca $ role_id) $ role = get_role ($ role_id); $-Simulare> add_cap ( 'wptuts_client'); / ** * Setați permisiunile pentru anumiți utilizatori * / set privat set_users_permissions () $ users = get_users (); foreach ($ utilizatori ca $ user) $ user = nou WP_User ($ user-> ID); $ User-> remove_cap ( 'wptuts_client'); if (! empty ($ this-> users)) foreach ($ this-> utilizatori ca $ user_id) $ user = new WP_User ($ user_id); $ User-> add_cap ( 'wptuts_client'); / ** * Restricționați accesul la mass-media * / privat funcție media_filter () // Aplicați filtrul media pentru currenct AdPress Clients $ roles = auto :: filter_roles (array ('wptuts_client'), array ('upload_files') ; $ users = auto :: filter_users (array ('wptuts_client'), array ('upload_files')); $ this-> roles_add_cap ($ roluri, 'upload_files'); $ this-> roles_add_cap ($ roluri, 'remove_upload_files'); $ this-> users_add_cap ($ users, 'upload_files'); $ this-> users_add_cap ($ users, 'remove_upload_files'); // restricționează accesul bibliotecii media add_filter ('parse_query', array (& $ this, 'restrict_media_library')); // pentru curățare $ clean_roles = self :: filter_roles (array ('remove_upload_files'), array ('wptuts_client')); $ clean_users = auto :: 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'); / ** * Adăugarea unei capacități la o serie de roluri * * @param $ roles * @param $ cap * / funcția privată roles_add_cap ($ roluri, $ cap) foreach ($ roluri ca $ role) $ role = get_role (rol $); $-Simulare> add_cap ($ cap); / ** * Adăugarea unei capacități la o serie de utilizatori * * @param $ users * @param $ cap * / funcția privată users_add_cap ($ users, $ cap) foreach ($ utilizatori ca $ user) $ user = nou utilizator WP_ ($ user); $ User-> add_cap ($ cap); / ** * Eliminați o capacitate dintr-o serie de roluri * * @param $ roles * @param $ cap * / funcția privată roles_remove_cap ($ roluri, $ cap) foreach ($ roluri ca $ role) $ role = get_role ($ rol); $-Simulare> remove_cap (capac $); / ** * Îndepărtați o capacitate de la o serie de utilizatori * * @param $ users * @param $ cap * / private function users_remove_cap ($ users, $ cap) foreach ($ users as $ user) $ user = nou utilizator WP_ ($ user); $ User-> remove_cap ($ cap); / ** * Filtrează toate rolurile blogului pe baza capabilităților * * @ static * @param array $ include Array de capabilități pentru a include * @param array $ exclude Array de capabilități pentru a exclude * @return array * / funcția statică filter_roles ($ includ, $ exclude) $ filtered_roles = array (); global $ wp_roles; $ roluri = $ wp_roles-> get_names (); foreach ($ roluri ca $ role_id => $ role_name) $ role = get_role ($ role_id); ($ role, $ exclude)) $ filtered_roles [] = $ role_id; returnează $ filtered_roles; / ** * Returneaza true daca un rol are capabilitatile in arrayul dat * * @static * @param $ role * @param $ caps * @return bool * / functie statica role_has_caps ($ role, $ caps) foreach $ caps ca $ cap) if (! $ role-> has_cap ($ cap)) return false; return true; / ** * Filtrează toți utilizatorii blogului pe baza capabilităților * * @static * @param array $ include Array de capabilități pentru a include * @param array $ exclude Array de capabilități pentru a exclude * @return array * / funcția statică filter_users ( $ include, $ exclude) $ filtered_users = array (); $ users = get_users (); foreach ($ utilizatori ca $ user) $ user = nou WP_User ($ user-> ID); dacă self :: user_has_caps ($ user, $ include) &&! self :: user_has_caps ($ user, $ exclude)) $ filtered_users [] = $ user-> ID; returnează $ filtered_users; / ** * Returnează adevărat dacă un utilizator are capabilitățile în matricea trecută * * @static * @param $ user * @param $ caps * @return bool * / funcția statică user_has_caps ($ user, $ caps) foreach $ caps ca $ cap) if (! $ user-> has_cap ($ cap)) return false; return true; / ** * Restricționează accesul bibliotecii media * * @param $ wp_query * / funcția publică restrict_media_library ($ wp_query) if (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/upload.php' dacă (current_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('autor', $ current_user-> ID); altfel dacă ($ _ SERVER ['REQUEST_URI'], '/wp-admin/media-upload.php')) dacă (actual_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('autor', $ current_user-> ID);
În acest tutorial, am încercat să folosesc materialele pe care le-am învățat din cele două postări anterioare pentru a crea o soluție personalizată pentru roluri și capabilități. Soluția a fost încapsulată într-o singură clasă, care poate fi personalizată pentru propriile dvs. nevoi sau pluginuri. Puteți găsi codul pe Github.
Dacă aveți întrebări, sugestii sau îmbunătățiri, nu ezitați să o postați în comentarii.