Cum pot modifica capabilitatea necesară pentru a accesa opțiunile unui plugin?
Am următoarele 3 roluri diferite: Admin
, Editor
și SEO
. Am instalat WordPress SEO de Yoast și vreau să obțin următoarele:
- Nu vreau ca editorii să vadă opțiunile SEO, deoarece ei doar scriu articole și nu cunosc SEO. Există o persoană cu rolul
SEO
, care va face optimizările. - Nu vreau ca persoana SEO să vadă opțiunile altor plugin-uri. Vreau doar să aibă aceleași capabilități ca Editorii, dar cu funcțiile SEO activate.
Am încercat cu niște fragmente de cod de pe acest site și reușesc să ascund meta box-ul pentru Editori
, dar nu și micul 'rating box' de deasupra butonului Publică.
De asemenea, nu știu cum să rezolv al doilea punct, deoarece toate plugin-urile folosesc aceeași capabilitate manage_options
, așa că nu pot atribui această capabilitate rolului SEO
. Și nu știu cum să schimb capabilitatea necesară fără a modifica fișierele plugin-ului (ceea ce ar fi pierdut la actualizarea plugin-ului).
Mulțumesc anticipat.

Poate aceasta nu este cea mai bună metodă, deoarece oferă unui editor acces la Setări și Opțiuni, dar ceea ce face este să ofere unui editor specific (pe baza ID-ului utilizatorului) permisiunile de a edita opțiunile. Apoi testăm dacă încărcăm unul dintre șabloanele de opțiuni, dacă da ȘI ID-ul utilizatorului este același cu ID-ul căruia i-am acordat permisiuni, întrerupem procesul și afișăm un mesaj.
1) Deci, primul lucru, creează-ți utilizatorul SEO și atribuie-i rolul de Editor.
2) Apoi, trebuie să îi oferim acestui utilizator abilitatea de a manage_options
. Poți găsi acest lucru editând utilizatorul și uitându-te la URL, ar trebui să fie unul dintre ultimii parametri din URL.
/** Oferim permisiunile celui care se ocupă de SEO **/
function give_seo_yoastToast() {
$user = new WP_User( $seo_user_id );
$user->add_cap( 'manage_options');
}
add_action( 'admin_init', 'give_seo_yoastToast');
3) Acum trebuie să ne asigurăm că persoana care se ocupă de SEO nu poate accesa niciuna dintre opțiunile critice. Din câte știu eu, paginile de mai jos sunt singurele moduri prin care acest utilizator poate edita informații cruciale. Dacă vizualizează aceste pagini, oprim procesul și afișăm un mesaj, poți schimba mesajul după preferințe.
/** Elimină accesul la anumite pagini **/
add_action( 'load-options-general.php', 'prevent_seoguy_access' );
add_action( 'load-options-writing.php', 'prevent_seoguy_access' );
add_action( 'load-options-reading.php', 'prevent_seoguy_access' );
add_action( 'load-options-discussion.php', 'prevent_seoguy_access' );
add_action( 'load-options-media.php', 'prevent_seoguy_access' );
add_action( 'load-options-permalink.php', 'prevent_seoguy_access' );
add_action( 'load-options.php', 'prevent_seoguy_access' );
function prevent_seoguy_access(){
$currID = is_user_logged_in() ? get_current_user_id() : 0;
if($currID == $seo_user_id ){
wp_die("Aici a fost odată o gaură, acum a dispărut.");
exit();
}
}
4) În acest moment, el poate vizualiza paginile din meniu, dar când le accesează, vede mesajul de mai sus. Ca un pas în plus, să eliminăm efectiv această pagină din meniul nostru. Te rog să notezi că dacă elimini pagina din meniu fără funcția de mai sus, un utilizator isteț ar putea accesa oricare dintre paginile de opțiuni direct prin URL.
/** Elimină pagina de Setări din meniul pentru cel care se ocupă de SEO **/
function seo_guy_menu() {
if(!current_user_can('administrator')){
remove_menu_page('options-general.php');
}
}
add_action('admin_menu', 'seo_guy_menu');
5) Și gata!
Din păcate, așa cum ai menționat în întrebarea ta, Yoast nu pare să aibă o capabilitate de a oferi unui utilizator permisiuni specifice pentru toate lucrurile legate de SEO fără a-i oferi și permisiuni inutile, ceea ce este puțin frustrant. Ca o observație suplimentară, în loc să folosești un $seo_user_id
static, ai putea crea un Rol SEO, să-i acorzi acelui rol permisiuni de editor împreună cu cele de mai sus. Asta presupune un pic mai mult de muncă (nu prea mult), dar dacă ai un singur om care se ocupă de SEO pentru totdeauna, atunci metoda de mai sus este suficientă.

Mulțumesc pentru punctul 3. Nu am nevoie acum, dar ar putea fi util în viitor. Am reușit să ascund 'caseta de rating' cu o funcție condițională și CSS. Este doar o problemă vizuală, deci funcționează.

Rețineți că WP_User->add_cap va scrie în baza de date, deci creează doar o suprasarcină inutilă să ai acest cod legat de admin_init
în:
add_action( 'admin_init', 'give_seo_yoastToast');
În schimb, Codex recomandă să rulezi acest cod la activarea temei/pluginului. Adică:
add_action("after_switch_theme", "your_add_cap_function");
și
add_action('switch_theme', 'your_remove_cap_function');
Sau rulează-l o singură dată și dezactivează codul.

Cea mai bună metodă de a schimba capabilitatea necesară utilizatorilor pentru a vizualiza paginile de setări Yoast SEO este prin utilizarea filtrului wpseo_manage_options_capability
.
Iată un exemplu despre cum se utilizează acest filtru (plasat în fișierul functions.php
):
/**
* Returnează capabilitatea necesară utilizatorilor pentru a vizualiza paginile de setări Yoast SEO.
*
* @return mixed|void
*/
function my_custom_wpseo_manage_options_capability() {
$manage_options_cap = 'edit_others_posts';
return $manage_options_cap;
}
add_filter( 'wpseo_manage_options_capability', 'my_custom_wpseo_manage_options_capability' );
În exemplul de mai sus, este utilizată capabilitatea edit_others_posts
, astfel încât (într-o instalare WordPress implicită) atât Editorii cât și Administratorii să poată accesa setările Yoast SEO.
În cazul în care nu doriți ca Editorii "normali" să aibă acces, va trebui să creați un nou rol (de exemplu, 'SEO') care să aibă aceleași capabilități ca un Editor, plus o capabilitate personalizată adițională (de exemplu, manage_wpseo_options
) care poate fi utilizată în funcția de mai sus în locul edit_others_posts
.
Plugin-ul Members creat de Justin Tadlock vă permite să creați cu ușurință roluri și capabilități noi pentru acest scop.
Notă: Acest lucru poate să nu funcționeze pe Multisite din cauza acestei probleme.
Actualizare: În Yoast SEO v5.5+, filtrul wpseo_manage_options_capability
a fost redenumit în wpseo_manage_options
.

Eticheta @return este folosită pentru a documenta valoarea returnată de funcții sau metode atunci când se utilizează phpDocumentor. @return mixed|void
înseamnă pur și simplu că valoarea returnată de funcție poate fi de orice tip, sau void (adică nu returnează nicio valoare).

Tocmai am găsit o soluție foarte simplă. Dacă nu ai făcut-o deja - instalează un plugin de gestionare a capabilităților. Apoi, creează o nouă capabilitate din cadrul managerului de capabilități - numește-o "CUSTOM_CAPABILITY_NAME" sau cum dorești. Apoi atribuie-o unui anumit rol sau utilizator.
Important: copiază și salvează un backup pentru orice fișier intenționezi să modifici în caz că greșești, poți oricând să restaurezi originalul.
Apoi, pe serverul efectiv, trebuie să navighezi prin directoare până la wp-content/plugins/ și apoi să utilizezi grep pentru a găsi toate fișierele care conțin 'manage_options'.
Exemplu: grep 'manage_options' */*
Partea complicată este că va trebui să găsești funcția principală care adaugă meniul sau submeniul în panoul de control. Iată două exemple pentru acces specific la Yoast SEO.
$manage_options_cap = apply_filters( 'wpseo_manage_options_capability', 'CUSTOM_CAPABILITY_NAME' );
add_submenu_page( 'wpseo_dashboard', __( 'Setări WooCommerce SEO', 'yoast-woo-seo' ), __( 'WooCommerce SEO', 'yoast-woo-seo' ), 'CUSTOM_CAPABILITY_NAME', $this->short_name, array(
PS - nu schimba nimic care începe cu '$' - acestea sunt variabile. :)
