Benutzerdefinierte Rollenberechtigungen für Post-Typen lassen mich nicht lesen

9

Ich kann es nicht erhalten, damit meine Benutzerrolle für einen Lieferanten den Sendungsposttyp lesen kann. Es wird in ihrem Menü angezeigt, aber wenn Sie darauf klicken , wird diese Seitenfehlermeldung nicht angezeigt.

Es funktioniert, wenn ich add_cap('read_posts')aber nicht möchte, dass sie die regulären Posts nur den Sendungsposttyp anzeigen.

Ich habe eine Lieferantenbenutzerrolle mit den folgenden Funktionen.

WP_Role Object
(
    [name] => supplier
    [capabilities] => Array
        (
            [read] => 1
            [edit_shipment] => 1
            [read_shipment] => 1
            [edit_others_shipments] => 1
            [publish_shipments] => 1
            [read_private_shipments] => 1
            [edit_shipments] => 1
            [create_shipment] => 1
            [read_shipments] => 1
        )

)

Und ich habe den Post-Typ für Sendungen wie folgt eingerichtet

function shipment_post_type() {
  $labels = array(
    'name'                  => _x( 'Shipments', 'Post Type General Name', 'sage' ),
    'singular_name'         => _x( 'Shipment', 'Post Type Singular Name', 'sage' ),
    'menu_name'             => __( 'Shipments', 'sage' ),
    'name_admin_bar'        => __( 'Shipments', 'sage' ),
    'archives'              => __( 'Shipment Archives', 'sage' ),
    'parent_item_colon'     => __( 'Parent shipment:', 'sage' ),
    'all_items'             => __( 'All shipments', 'sage' ),
    'add_new_item'          => __( 'Add New shipment', 'sage' ),
    'new_item'              => __( 'New shipment', 'sage' ),
    'edit_item'             => __( 'Edit shipment', 'sage' ),
    'update_item'           => __( 'Update shipment', 'sage' ),
    'view_item'             => __( 'View shipment', 'sage' ),
    'search_items'          => __( 'Search shipments', 'sage' ),
    'not_found'             => __( 'Not found', 'sage' ),
    'not_found_in_trash'    => __( 'Not found in Trash', 'sage' ),
    'featured_image'        => __( 'Featured Image', 'sage' ),
    'set_featured_image'    => __( 'Set shipment image', 'sage' ),
    'remove_featured_image' => __( 'Remove shipment image', 'sage' ),
    'use_featured_image'    => __( 'Use as shipment image', 'sage' ),
    'insert_into_item'      => __( 'Insert into shipment', 'sage' ),
    'uploaded_to_this_item' => __( 'Uploaded to this shipment', 'sage' ),
    'items_list'            => __( 'shipments list', 'sage' ),
    'items_list_navigation' => __( 'Constests list navigation', 'sage' ),
    'filter_items_list'     => __( 'Filter shipments list', 'sage' ),
  );
  $args = array(
    'label'                 => __( 'shipments', 'sage' ),
    'description'           => __( 'Manage all shipments, sweepstakes and giveaways.', 'sage' ),
    'labels'                => $labels,
    'supports'              => array( 'revisions' ),
    'taxonomies'            => array( '' ),
    'hierarchical'          => false,
    'public'                => true,
    'show_ui'               => true,
    'show_in_menu'          => true,
    'menu_position'         => 5,
    'menu_icon'             => 'dashicons-archive',
    'show_in_admin_bar'     => true,
    'show_in_nav_menus'     => false,
    'can_export'            => true,
    'has_archive'           => false,
    'exclude_from_search'   => true,
    'publicly_queryable'    => true,
    'map_meta_cap' => true,
    'capabilities' => array(
      'edit_post'          => 'edit_shipment',
      'read_post'          => 'read_shipment',
      'read_posts'         => 'read_shipments',
      'delete_post'        => 'delete_shipment',
      'delete_posts'       => 'delete_shipments',
      'edit_posts'         => 'edit_shipments',
      'edit_others_posts'  => 'edit_others_shipments',
      'publish_posts'      => 'publish_shipments',
      'read_private_posts' => 'read_private_shipments',
      'create_posts'       => 'create_shipments',
    ),
  );
  register_post_type( 'shipment', $args );

}
add_action( 'init', 'shipment_post_type', 0 );
Nicholas Koskowski
quelle
Überprüfen Sie diese Lösung: wordpress.stackexchange.com/a/108375/38771
PS
Ich habe das mehrmals gelesen ... habe Anweisungen befolgt, alles was ich tun konnte. Erhalten Sie immer noch den Zugriff, auf den Sie erst zugreifen dürfen, wenn ich die Berechtigung create_shipments erteile.
Nicholas Koskowski
3
Können Sie Ihren Code freigeben, mit dem Sie die Rolle add_role()und die Obergrenzen hinzufügen add_cap()?
Mat
1
Versuchen Sie, den Lieferanten diesen Beitragstyp am vorderen oder hinteren Ende lesen zu lassen?
Myles
Und ist dieser Code in einem Plugin oder einem Thema? Plugin ist besser, aber so oder so, mit mehr Informationen über Ihr Setup Ich bin sicher, ich kann eine noch umfassendere Lösung für Sie bereitstellen
Myles

Antworten:

4

Ihr benutzerdefinierter Beitragstyp scheint ordnungsgemäß eingerichtet zu sein. Es funktioniert bei meiner Testinstallation. Versuchen Sie dies anstelle des derzeit verwendeten Codes add_role und add_cap. (Nur zu Testzwecken. Verwenden Sie es aus den unten aufgeführten Gründen nicht im Produktionscode.) Es funktioniert für mich:

function prefix_set_up_supplier_role(){
remove_role( 'supplier' );
add_role( 'supplier', 'Supplier', array(
        'read'                      => true,
        'edit_shipment'             => true,
        'read_shipment'             => true,
        'read_shipments'            => true,
        'delete_shipment'           => true,
        'delete_shipments'          => true,
        'edit_shipments'            => true,
        'edit_others_shipments'     => true,
        'publish_shipments'         => true,
        'read_private_shipments'    => true,
        'create_shipments'          => true,
    )
);
}
add_action( 'init', 'prefix_set_up_supplier_role' );

Es ist sehr wichtig, sich daran zu erinnern, dass durch das Hinzufügen von Benutzerrollen und -funktionen tatsächlich Daten in der Datenbank gespeichert werden. Wenn Sie also zuvor eine Version Ihres Codes hatten, die nicht ganz funktioniert hat, und dann etwas hinzugefügt haben, das sie zum Funktionieren bringt, ist sie möglicherweise nicht wirksam geworden, wenn Ihre Datenbank noch alte Daten enthält. add_role () gibt null zurück, wenn die Rolle bereits in der Datenbank vorhanden ist. Für Produktionscode sollten Sie tatsächlich die Plugin-Aktivierungs- und Deaktivierungs-Hooks für dieses Zeug verwenden, anstatt es jedes Mal wie folgt auszuführen:

register_activation_hook( __FILE__, 'prefix_activate' );
function prefix_activate(){
    add_role( 'supplier', 'Supplier', array(
        'read'                      => true,
        'edit_shipment'             => true,
        'read_shipment'             => true,
        'read_shipments'            => true,
        'delete_shipment'           => true,
        'delete_shipments'          => true,
        'edit_shipments'            => true,
        'edit_others_shipments'     => true,
        'publish_shipments'         => true,
        'read_private_shipments'    => true,
        'create_shipments'          => true,
    )
);
}

register_deactivation_hook( __FILE__, 'prefix_deactivate' );
function prefix_deactivate(){
    remove_role( 'supplier' );
}
Myles
quelle
2
add_role()und remove_role()sollte nicht in jeder Anfrage ausgeführt werden. Beachten Sie, dass Sie eine Rolle nach dem Hinzufügen zur Datenbank nicht erneut hinzufügen müssen. Normalerweise fügen Sie Rollen hinzu register_activation_hookund entfernen Rollen auf register_deactivation_hook/ register_unistall_hook; Ansonsten sollten Sie remove_role()/ add_role()nur ausführen, wenn es wirklich benötigt wird.
Cybmeta
Ich weiß, und das habe ich auch in meiner Antwort erwähnt. Es kann jedoch immer noch eine schnelle Möglichkeit sein, Probleme in der Entwicklung zu diagnostizieren, sodass Sie nicht jedes Mal, wenn Sie den Code ändern, auf Deaktivieren und Aktivieren klicken müssen. Wenn es funktioniert, verschieben Sie es in die Aktivierungs- und Deaktivierungs-Hooks
Myles
1
@cybmeta Das ist wahr. Ich habe meine Antwort bearbeitet, um zu reflektieren, wie Best Practices befolgt werden können.
Myles
0

In Ihrem Rollenobjekt haben Sie die Funktion 'create_shipment', in der eigentlich 'create_shipments' stehen sollte. Es scheint, als ob in Ihrem Code ein 's' fehlt, wo immer Sie diese Funktion hinzufügen.

Myles
quelle
0

Sie könnten versuchen:

add_action( 'init', 'add_my_caps');
function add_my_caps() {
    global $wp_roles;

    if ( isset($wp_roles) ) {
        $wp_roles->add_cap( 'editor', 'edit_shipment' );
        $wp_roles->add_cap( 'editor', 'read_shipment' );
        $wp_roles->add_cap( 'editor', 'delete_shipment' );
        $wp_roles->add_cap( 'editor', 'publish_shipments' );
        $wp_roles->add_cap( 'editor', 'edit_shipments' );
        $wp_roles->add_cap( 'editor', 'edit_others_shipments' );
        $wp_roles->add_cap( 'editor', 'delete_shipments' );
        $wp_roles->add_cap( 'editor', 'delete_others_shipments' );
        $wp_roles->add_cap( 'editor', 'read_private_shipments' );
        ....
T.Todua
quelle
0

Probieren Sie es aus. 'dms_document' ist der benutzerdefinierte Beitragstyp.

function jgd_add_role_caps() {
    // Add the roles you'd like to administer the custom post types
    $roles = array(
        'deity_user',
        'admin_user'
    );

    // Loop through each role and assign capabilities
    foreach($roles as $the_role) { 
        $role = get_role($the_role);

        $role->add_cap('read');
        $role->add_cap('read_dms_document');
        $role->add_cap('read_private_dms_documents');
        $role->add_cap('edit_dms_document');
        $role->add_cap('edit_dms_documents');
        $role->add_cap('edit_others_dms_documents');
        $role->add_cap('edit_published_dms_documents');
        $role->add_cap('publish_dms_documents');
        $role->add_cap('delete_others_dms_documents');
        $role->add_cap('delete_private_dms_documents');
        $role->add_cap('delete_dms_documents');
        $role->add_cap('delete_post_dms_documents');
        $role->add_cap('delete_published_dms_documents');
        $role->add_cap('delete_draft_dms_documents');
        $role->add_cap('delete_others_posts_dms_documents');
        $role->add_cap('delete_others_posts_dms_document');
        $role->add_cap('delete_posts_dms_documents');
        $role->add_cap('delete_posts_dms_document');
    }
}
add_action('admin_init','jgd_add_role_caps', 999);
James George Dunn
quelle