Beschränken Sie den benutzerdefinierten Beitragstyp auf die Administratorrolle der Site

16

Wie kann ich verhindern, dass dieser benutzerdefinierte Beitragstyp für Benutzer ohne Administratorrechte im Dashboard angezeigt wird?

/* Add Websites Custom Post Type */
add_action( 'init', 'create_website_type' );
function create_website_type() {

    register_post_type( 'website',
        array(
            'labels' => array(
                'name' => __( 'Websites' ),
                'singular_name' => __( 'Website' ),
                'add_new' => __( 'Add New Website' ),
                'add_new_item' => __( 'Add New Website' ),
                'edit' => __( 'Edit Website' ),             
                'edit_item' => __( 'Edit Website' ),                
                'new_item' => __( 'Add New Website' ),              
                'view' => __( 'View Website' ),         
                'view_item' => __( 'View Website' ),                    
                'search_items' => __( 'Search Websites' ),  
                'not_found' => __( 'No Websites Found' ),
                'not_found_in_trash' => __( 'No Websites found in Trash' ),                                         
            ),
            'description' => __('Websites to be shown in Resources section.'),
            'public' => true,
            'show_ui' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'menu_position' => 20,
            'supports' => array('title', 'editor'),
            'can_export' => true        
        )
    ); 
    remove_post_type_support('website','editor'); 
}
urok93
quelle

Antworten:

12

register_post_type()akzeptiert einen Parameter capabilitiesin seinen Argumenten. Siehe get_post_type_capabilities()mögliche Werte. Aus den Kommentaren:

Standardmäßig werden sieben Schlüssel als Teil des Capabilities-Arrays akzeptiert:

  • edit_post, read_postUnd delete_postsind Meta - Fähigkeiten, die dann in der Regel abgebildet werden auf den Kontext primitive Fähigkeiten entsprechenden abhängig, die die Post wird bearbeitet / gelesen / gelöscht und der Benutzer oder die Rolle Wesen geprüft würden. Daher würden diese Funktionen Benutzern oder Rollen im Allgemeinen nicht direkt gewährt.

  • edit_posts - Steuert, ob Objekte dieses Beitragstyps bearbeitet werden können.

  • edit_others_posts- Steuert, ob Objekte dieses Typs, deren Eigentümer andere Benutzer sind, bearbeitet werden können. Wenn der Beitragstyp keinen Autor unterstützt, verhält sich dies wie folgt edit_posts.
  • publish_posts - Steuert das Veröffentlichen von Objekten dieses Beitragstyps.
  • read_private_posts - Steuert, ob private Objekte gelesen werden können.

Diese vier primitiven Fähigkeiten werden an verschiedenen Stellen im Kern überprüft. Es gibt auch sieben andere Grundfunktionen, auf die im Kern nicht direkt verwiesen wird, außer in map_meta_cap(), bei denen die drei oben genannten Metafunktionen in eine oder mehrere Grundfunktionen übersetzt werden, die dann je nach Kontext mit dem Benutzer oder der Rolle abgeglichen werden müssen.

  • read - Steuert, ob Objekte dieses Beitragstyps gelesen werden können.
  • delete_posts - Steuert, ob Objekte dieses Beitragstyps gelöscht werden können.
  • delete_private_posts - Steuert, ob private Objekte gelöscht werden können.
  • delete_published_posts - Steuert, ob veröffentlichte Objekte gelöscht werden können.
  • delete_others_posts- Steuert, ob Objekte, die anderen Benutzern gehören, gelöscht werden können. Wenn der Beitragstyp keinen Autor unterstützt, verhält sich dies wie folgt delete_posts.
  • edit_private_posts - Steuert, ob private Objekte bearbeitet werden können.
  • edit_published_posts - Steuert, ob veröffentlichte Objekte bearbeitet werden können.

Diese zusätzlichen Funktionen werden nur in verwendet map_meta_cap(). Daher werden sie standardmäßig nur zugewiesen, wenn der Post-Typ mit dem 'map_meta_cap'Argument " true(Standard ist false)" registriert ist .

Fügen Sie in Ihren Registrierungsargumenten Folgendes hinzu:

'capabilities' => array(
    'edit_post'          => 'update_core',
    'read_post'          => 'update_core',
    'delete_post'        => 'update_core',
    'edit_posts'         => 'update_core',
    'edit_others_posts'  => 'update_core',
    'delete_posts'       => 'update_core',
    'publish_posts'      => 'update_core',
    'read_private_posts' => 'update_core'
),
fuxia
quelle
Wie würden Sie dasselbe tun, aber Administratoren und Redakteuren den Zugriff auf das Cpt gestatten?
Urok93
@drtanz Geben Sie eine benutzerdefinierte Funktion und einen Filter an user_has_cap. In dieser Antwort finden Sie ein Beispiel.
Fuxia
Könnte ich es genauso machen, wie Sie es vorgeschlagen haben, aber die Funktion "manage_links" (gemeinsam von Administratoren und Redakteuren genutzt) anstelle von "update_core" verwenden?
Urok93
@drtanz Ja, aber ich würde eine benutzerdefinierte Funktion verwenden. Der Link-Manager wird schließlich entfernt, und Sie wissen nicht, was dann mit den zugewiesenen Funktionen geschieht.
Fuxia
2
Anmerkung zu update_core; Diese Funktion steht nur Administratoren von Installationen an einem Standort zur Verfügung. In Multisite verfügt nur der Superadministrator über diese Funktionen.
Numediaweb