Quyền truy cập loại bài đăng tùy chỉnh sẽ không cho phép tôi đọc


9

Tôi không thể có được nó để vai trò người dùng của tôi cho một nhà cung cấp có thể đọc loại bài đăng lô hàng. Nó hiển thị trong menu của họ nhưng khi bạn nhấp vào nó, bạn sẽ không được phép xem thông báo lỗi trang này .

Nó hoạt động nếu tôi add_cap('read_posts')nhưng tôi không muốn họ xem các bài đăng thông thường chỉ là loại bài đăng lô hàng.

Tôi có một vai trò người dùng nhà cung cấp với các khả năng sau đây.

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
        )

)

Và tôi đã thiết lập loại bài đăng cho các lô hàng sau đây

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

Kiểm tra giải pháp này: wordpress.stackexchange.com/a/108375/38771
PS

Tôi đã đọc điều này nhiều lần ... theo hướng dẫn mọi thứ tôi có thể làm. Vẫn nhận được các bạn không được phép truy cập cho đến khi tôi cấp quyền tạo_shipments.
Nicholas Koskowski

3
Bạn có thể chia sẻ mã của bạn nơi bạn đang thêm vai trò add_role()và giới hạn add_cap()không?
Mat

1
Bạn đang cố gắng để nhà cung cấp đọc loại bài đăng này ở mặt trước hoặc mặt sau?
Myles

Và mã này trong một plugin hoặc một chủ đề? Plugin tốt hơn, nhưng dù bằng cách nào, với nhiều thông tin hơn về thiết lập của bạn Tôi chắc chắn tôi có thể cung cấp một giải pháp thậm chí toàn diện hơn cho bạn
Myles

Câu trả lời:


4

Loại bài đăng tùy chỉnh của bạn trông giống như nó được thiết lập đúng. Nó hoạt động trên cài đặt thử nghiệm của tôi. Hãy thử điều này thay vì bất kỳ mã add_role và add_cap nào bạn đang sử dụng. (Chỉ dành cho mục đích thử nghiệm. Đừng sử dụng nó trong mã sản xuất, vì những lý do được nêu dưới đây.) Nó hoạt động với tôi:

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

Điều rất quan trọng cần nhớ là việc thêm vai trò và khả năng của người dùng thực sự lưu dữ liệu vào cơ sở dữ liệu. Vì vậy, nếu bạn đã có một phiên bản mã trước đó không hoạt động, sau đó thêm một cái gì đó sẽ làm cho nó hoạt động, nó có thể không có hiệu lực nếu vẫn còn dữ liệu cũ trong cơ sở dữ liệu của bạn. add_role () trả về null nếu vai trò đã tồn tại trong cơ sở dữ liệu. Đối với mã sản xuất, bạn thực sự nên sử dụng các móc kích hoạt và hủy kích hoạt plugin cho công cụ này thay vì chạy nó mỗi lần, như thế này:

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()remove_role()không nên được thực hiện trong mọi yêu cầu. Lưu ý rằng một khi vai trò được thêm vào cơ sở dữ liệu, bạn không thêm nó nữa. Thông thường bạn thêm vai trò trên register_activation_hookvà loại bỏ vai trò trên register_deactivation_hook/ register_unistall_hook; ngoài ra, bạn nên thực hiện remove_role()/ add_role()chỉ khi nó thực sự cần thiết.
cybmeta

Tôi biết, và tôi đã đề cập đến điều đó trong câu trả lời của tôi. Nhưng nó vẫn có thể là một cách nhanh chóng để chẩn đoán các vấn đề trong quá trình phát triển để bạn không phải nhấp vào hủy kích hoạt và sau đó kích hoạt mỗi khi bạn thực hiện thay đổi mã. Sau đó, khi nó hoạt động, chuyển nó sang móc kích hoạt và hủy kích hoạt
Myles

1
@cybmeta Đó là sự thật. Tôi đã chỉnh sửa câu trả lời của mình để phản ánh cách thực hành tốt nhất có thể được theo dõi.
Myles

0

Trong đối tượng vai trò của bạn, bạn có khả năng 'created_shipment' trong đó thực sự nên nói 'created_shipments'. Có vẻ như có thể thiếu một 's' trong mã của bạn bất cứ khi nào bạn thêm khả năng đó.


0

Bạn có thể thử:

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

Thử thứ này đi. 'dms_document' là loại bài đăng tùy chỉnh.

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.