webentwicklung-frage-antwort-db.com.de

Menü "Benutzerdefinierter Beitragstyp" für Benutzer ohne Administratorrechte entfernen.

Ich habe den ganzen Tag nachgeforscht und habe nicht viele Ergebnisse erzielt.

Ich möchte einschränken, wer meine benutzerdefinierten Beitragstypen nach Benutzerebene (oder auf andere Weise) sehen kann. Wenn die angemeldete Person kein Administrator ist, sind die hinzugefügten benutzerdefinierten Beitragstypen für sie nicht sichtbar.

Hier ist ein Teil eines benutzerdefinierten Beitragstyps, den ich habe:

add_action('init', 'portfolio_register');

function portfolio_register() {

    $labels = array(
        'name' => _x('Case Studies', 'post type general name'),
        'singular_name' => _x('Case Study Item', 'post type singular name'),
        'add_new' => _x('Add New', 'portfolio item'),
        'add_new_item' => __('Add New Case Study Item'),
        'edit_item' => __('Edit Case Study Item'),
        'new_item' => __('New Case Study Item'),
        'view_item' => __('View Case Study Item'),
        'search_items' => __('Search Case Studies'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        '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 );
}

Und hier sind die möglichen Lösungen, die ich gefunden habe und die für das Entfernen des Menüs "Benutzerdefinierter Beitragstyp" nicht funktionieren:

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

    if($current_user->user_login != 'admin')
    {
        $restricted = array(__('Posts'),
                            __('Media'),
                            __('Links'),
                            __('Pages'),
                            __('Comments'),
                            __('Appearance'),
                            __('Plugins'),
                            __('Users'),
                            __('Tools'),
                            __('Settings')
        );
        end ($menu);
        while (prev($menu)){
            $value = explode(' ',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
        }// end while

    }// end if
}
add_action('admin_menu', 'remove_menus');

Das obige funktioniert, um die Standardmenüelemente zu entfernen, aber ich konnte es nicht bekommen, um ein benutzerdefiniertes Beitragstyp-Menü zu entfernen. Außerdem ist es benutzername-spezifisch, was in Ordnung ist, wenn ich mehr als einen Benutzer hinzufügen könnte.

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

Das oben genannte hat überhaupt nicht funktioniert.

Vielen Dank.

2
jetDL

Codex - Art des Registrierungspostens

Siehe die Argumente capability_type und capabilities für register_post_type. Sie können dem Argument capabilities ein Array von Funktionen übergeben, die den erforderlichen Begrenzungen zugeordnet werden sollen. Hier ist ein Beispiel für das Array args mit benutzerdefinierten Funktionen.

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

Sie würden natürlich ADD_CAP_HERE durch eine Funktion ersetzen. Wenn Sie diesen Beitragstyp auf Administratoren beschränken möchten, verwenden Sie einfach eine Funktion, die nur Administratoren haben, z. B. manage_options.

Rollentabelle und ihre Obergrenzen (als Kurzreferenz).
http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

14
t31os

Ok, nachdem ich noch ein bisschen gegoogelt hatte, fand ich endlich eine Antwort und kombinierte sie mit einem der obigen Skripte, um das zu schaffen, wonach ich suche. Nachfolgend ist aufgeführt, was ich für den Fall getan habe, dass jemand anderes das Gleiche tun möchte:

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

Der obige Code erhält die aktuelle Benutzerstufe und wenn sie die Berechtigung zum Aktualisieren/Bearbeiten von Plugins haben, haben sie Zugriff auf die beigefügten Funktionen.

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' );

Mit dem obigen Befehl können Sie die benutzerdefinierten Beitragstypen aus dem Admin-Menüsystem entfernen. Sie fügen einfach so viele $key hinzu, wie Sie benötigen. Anstatt dass ich ins Detail gehe, was das oben Genannte bedeutet, können Sie aus dem Original hier lesen.

4
jetDL

ich weiß nicht, was mit dem Code falsch ist, aber wann immer ich Menüelemente auf Benutzer beschränken muss, verwende ich: Admin Menu Editor ein Plugin, das genau das für Sie tut.

0
Bainternet