Cum pot modifica capabilitatea necesară pentru a accesa opțiunile unui plugin?

28 iul. 2014, 14:02:43
Vizualizări: 19.4K
Voturi: 5

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.

3
Comentarii

folosește manage_options pentru SEO, apoi setează reguli pentru rolul de SEO din fișierul functions.php al temei tale pentru a interzice accesul la alte pagini de administrare ale pluginurilor. Poți redirecționa acele pagini către pagina 404.

тнє Sufi тнє Sufi
28 iul. 2014 15:45:12

Ar putea fi o soluție @тнєSufi. Am cercetat despre ascunderea opțiunilor din meniu cu remove_menu_page și am obținut câteva rezultate. Știu că nu previne accesul, dar de data aceasta este doar un aspect vizual.

Elías Gómez Elías Gómez
29 iul. 2014 16:58:24

da, nu previne. dar poți redirecționa acele pagini către pagina 404, astfel încât oricine cu rol de SEO care încearcă să acceseze acele pagini prin URL direct va vedea o pagină 404.

тнє Sufi тнє Sufi
29 iul. 2014 21:19:13
Toate răspunsurile la întrebare 3
2

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ă.

28 iul. 2014 18:10:48
Comentarii

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ă.

Elías Gómez Elías Gómez
29 iul. 2014 17:04:38

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.

Pim Schaaf Pim Schaaf
4 dec. 2015 15:57:24
3

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.

13 sept. 2016 17:35:07
Comentarii

ce face partea @return mixed|void ??

Mau Mau
14 aug. 2017 05:12:34

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).

Matt Sims Matt Sims
14 aug. 2017 11:53:02

Acesta ar trebui să fie răspunsul ales.

Matthew Clark Matthew Clark
14 sept. 2017 16:53:07
0

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. :)

9 apr. 2016 01:57:15