Özel yazı türü rol izinleri okumama izin vermiyor


9

Bir tedarikçinin kullanıcı rolümün gönderiler posta türünü okuyabilmesi için alamıyorum. Menülerinde görünür, ancak üzerine tıkladığınızda bu sayfa hata mesajını görüntülemenize izin verilmez .

Ben add_cap('read_posts')ama ben normal gönderiler sadece gönderi gönderi türü görüntülemek istemiyorum eğer çalışır .

Aşağıdaki yeteneklere sahip bir tedarikçi kullanıcı rolüm var.

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
        )

)

Ve aşağıdakilerle gönderiler için posta türünü ayarladım

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

Bu çözümü kontrol edin: wordpress.stackexchange.com/a/108375/38771
PS

Bunu defalarca okudum ... yapabileceğim her şeyi talimatları takip ettim. Hala create_shipments izin verene kadar erişim izniniz olsun.
Nicholas Koskowski

3
Kodunuzu rolü add_role()ve büyük harfleri eklediğiniz yerde paylaşabilir misiniz add_cap()?
Mat

1
Tedarikçinin bu yazı türünü ön uçta veya arka uçta okumasına izin vermeye mi çalışıyorsunuz?
Myles

Ve bu kod bir eklenti veya tema içinde mi? Eklenti daha iyi, ama her iki şekilde de, kurulumunuz hakkında daha fazla bilgi ile Eminim sizin için daha kapsamlı bir çözüm sunabilirim
Myles

Yanıtlar:


4

Özel gönderi türünüz düzgün ayarlanmış gibi görünüyor. Test kurulumumda çalışıyor. Şu anda kullandığınız add_role ve add_cap kodu yerine bunu deneyin. (Yalnızca test amaçlıdır. Aşağıda belirtilen nedenlerle üretim kodunda kullanmayın.) Benim için çalışıyor:

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

Kullanıcı rolleri ve yetenekleri eklemenin verileri veritabanına kaydettiğini hatırlamak çok önemlidir. Bu nedenle, kodunuzun bir sürümü daha önce işe yaramadıysa, çalışmasını sağlayacak bir şey eklediyseniz, veritabanınızda hala eski veriler varsa etkili olmayabilir. add_role (), rol veritabanında zaten varsa null değerini döndürür. Üretim kodu için, aslında bu tür şeyler için eklenti etkinleştirme ve devre dışı bırakma kancalarını her seferinde çalıştırmak yerine kullanmalısınız:

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

2
add_role()ve remove_role()her istekte yerine getirilmemelidir. Veritabanına bir rol eklendiğinde, onu bir daha eklemeyeceğinizi unutmayın. Genellikle / register_activation_hooküzerine roller ekler ve register_deactivation_hook/ üzerindeki rolleri kaldırırsınız register_unistall_hook. bunun dışında size yürütmek gerekir remove_role()/ add_role()gerçekten sadece gerektiği takdirde.
cybmeta

Biliyorum ve cevabımda da bundan bahsettim. Ancak, geliştirme sırasında sorunları teşhis etmenin hızlı bir yolu olabilir, böylece devre dışı bırak'ı tıklamanız ve kodda her değişiklik yaptığınızda etkinleştirmeniz gerekmez. Ardından, çalışırken, etkinleştirme ve devre dışı bırakma kancalarına taşıyın
Myles

1
@cybmeta Bu doğru. Cevabımı en iyi uygulamaların nasıl izlenebileceğini yansıtacak şekilde düzenledim.
Myles

0

Rol nesnenizde, aslında 'create_shipments' demesi gereken 'create_shipment' yeteneğine sahipsiniz. Bu özelliği eklediğiniz her yerde kodunuzda bir 's' eksik olabilir.


0

Deneyebilirsiniz:

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

0

Bunu deneyin. 'dms_document' özel gönderi türüdür.

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.