Elimină meniul de tipuri personalizate de postări pentru utilizatorii non-administratori.

19 ian. 2011, 23:06:13
Vizualizări: 18.7K
Voturi: 2

Am căutat toată ziua și nu am găsit multe rezultate.

Vreau să restricționez cine poate vedea tipurile mele personalizate de postări în funcție de nivelul utilizatorului (sau altă metodă). Astfel, dacă persoana logată nu este 'administrator', tipurile personalizate de postări adăugate nu vor fi vizibile pentru aceasta.

Iată o parte dintr-un tip personalizat de postare pe care îl am:

add_action('init', 'portfolio_register');

function portfolio_register() {

    $labels = array(
        'name' => _x('Studii de caz', 'nume general tip postare'),
        'singular_name' => _x('Element studiu de caz', 'nume singular tip postare'),
        'add_new' => _x('Adaugă nou', 'element portofoliu'),
        'add_new_item' => __('Adaugă nou element studiu de caz'),
        'edit_item' => __('Editează element studiu de caz'),
        'new_item' => __('Element nou studiu de caz'),
        'view_item' => __('Vezi element studiu de caz'),
        'search_items' => __('Caută studii de caz'),
        'not_found' =>  __('Nimic găsit'),
        'not_found_in_trash' => __('Nimic găsit în coșul de gunoi'),
        'parent_item_colon' => ''
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        /*'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',*/
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail')
      ); 

    register_post_type( 'portfolio' , $args );
}

Și iată soluțiile potențiale pe care le-am găsit și care nu funcționează pentru eliminarea meniului de tipuri personalizate de postări:

function remove_menus()
{
    global $menu;
    global $current_user;
    get_currentuserinfo();

    if($current_user->user_login != 'admin')
    {
        $restricted = array(__('Postări'),
                            __('Media'),
                            __('Link-uri'),
                            __('Pagini'),
                            __('Comentarii'),
                            __('Aspect'),
                            __('Plugin-uri'),
                            __('Utilizatori'),
                            __('Unelte'),
                            __('Setări')
        );
        end ($menu);
        while (prev($menu)){
            $value = explode(' ',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
        }// sfârșit while

    }// sfârșit if
}
add_action('admin_menu', 'remove_menus');

Codul de mai sus funcționează pentru eliminarea elementelor de meniu implicite, dar nu am reușit să-l fac să elimine un meniu de tip personalizat de postare. În plus, este specific numelui de utilizator, ceea ce ar fi ok dacă aș putea adăuga mai mulți utilizatori.

global $user_login;
get_currentuserinfo();
   if (!current_user_can('update_plugins')) {
      .......
   }

Codul de mai sus nu a funcționat deloc.

Mulțumesc.

0
Toate răspunsurile la întrebare 3
2
14

Codex - Înregistrarea Tipului de Postare

Consultați argumentele capability_type și capabilities pentru register_post_type. Puteți transmite argumentului capabilities un array de capabilități pentru a le mapa la capacitățile necesare, iată un exemplu al array-ului de argumente cu capabilități personalizate.

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => true,
    'capabilities' => array(
        'publish_posts' => 'ADAUGĂ_CAP_AICI',
        'edit_posts' => 'ADAUGĂ_CAP_AICI',
        'edit_others_posts' => 'ADAUGĂ_CAP_AICI',
        'delete_posts' => 'ADAUGĂ_CAP_AICI',
        'delete_others_posts' => 'ADAUGĂ_CAP_AICI',
        'read_private_posts' => 'ADAUGĂ_CAP_AICI',
        'edit_post' => 'ADAUGĂ_CAP_AICI',
        'delete_post' => 'ADAUGĂ_CAP_AICI',
        'read_post' => 'ADAUGĂ_CAP_AICI',
    ),
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail')
); 

Desigur, veți înlocui ADAUGĂ_CAP_AICI cu o capabilitate. Dacă doriți să limitați acest tip de postare doar la administratori, pur și simplu folosiți o capabilitate pe care numai administratorii o au, cum ar fi manage_options.

Tabelul rolurilor și capabilităților lor (pentru referință rapidă).
http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

20 ian. 2011 15:27:19
Comentarii

Poți să explici, te rog, ADD_CAP_HERE? Trebuie să ascund meniul tipului meu de postare personalizată de la editori; Codul tău nu a ajutat la ascunderea elementului de meniu :(

numediaweb numediaweb
21 iul. 2014 00:07:57

@numediaweb -- Din http://codex.wordpress.org/Roles_and_Capabilities, vei vedea o listă de capabilități pentru 'Editor' și mai sus, cum ar fi 'edit_dashboard' (care va funcționa bine pentru tine)

Douglas.Sesar Douglas.Sesar
8 dec. 2014 16:44:39
1

Ok, după ce am mai căutat pe Google, am găsit în sfârșit un răspuns și l-am combinat cu unul dintre scripturile de mai sus pentru a crea ceea ce voiam să fac. Mai jos este ceea ce am făcut, doar în cazul în care altcineva caută să facă același lucru:

global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
    .....
}

Codul de mai sus va obține nivelul utilizatorului curent și dacă acesta are permisiuni pentru a actualiza/edita plugin-uri, atunci va avea acces la funcțiile incluse.

add_filter( 'custom_menu_order', 'toggle_custom_menu_order' );

function remove_those_menu_items( $menu_order ){
    global $menu;

    foreach ( $menu as $mkey => $m ) {
        $key = array_search( 'edit.php?post_type=portfolio', $m );
        $keyB = array_search( 'edit.php?post_type=bio', $m );
        $keyC = array_search( 'edit.php?post_type=philo', $m );

        if ( $key || $keyB || $keyC )
            unset( $menu[$mkey] );
    }

    return $menu_order;
}
add_filter( 'menu_order', 'remove_those_menu_items' );

Codul de mai sus este ceea ce vă permite efectiv să eliminați tipurile personalizate de postări din meniul de administrare. Puteți adăuga oricâte variabile $key aveți nevoie. În loc să intru în detalii despre ce înseamnă codul de mai sus, puteți citi mai multe în articolul original aici.

20 ian. 2011 12:57:36
Comentarii

Fii atent la asta când folosești plugin-ul Woocommerce, deoarece suprascrie opțiunea de filtrare a meniului! Am rezolvat problema adăugând add_filter( 'custom_menu_order' , '__return_true', 999);

numediaweb numediaweb
21 iul. 2014 00:41:40
2

Nu știu ce este în neregulă cu codul, dar ori de câte ori trebuie să limitez elementele de meniu pentru utilizatori, folosesc: Editorul de Meniu Admin un plugin care face exact asta pentru tine.

20 ian. 2011 01:10:53
Comentarii

Mulțumesc pentru răspuns, dar asta nu face exact ceea ce am nevoie. Te lasă să muți elementele din meniu și toate cele, dar nu permite ascunderea elementelor de meniu pentru utilizatorii non-administratori. În plus, aș prefera să nu folosesc un plugin pentru asta. Mulțumesc.

jetDL jetDL
20 ian. 2011 12:33:14

@Bainternet De obicei folosesc și eu Admin Menu Editor, dar uneori pur și simplu nu recunoaște limitările de capabilități pe care le-am setat.

User User
5 ian. 2012 18:39:48