การอนุญาตบทบาทโพสต์ประเภทกำหนดเองจะไม่ให้ฉันอ่าน


9

ฉันไม่สามารถรับมันเพื่อให้บทบาทผู้ใช้ของฉันสำหรับซัพพลายเออร์สามารถอ่านประเภทโพสต์การจัดส่งได้ มันปรากฏขึ้นในเมนูของพวกเขา แต่เมื่อคุณคลิกที่มันคุณจะไม่ได้รับอนุญาตให้ดูข้อความผิดพลาดหน้านี้

ใช้งานได้ถ้าฉันadd_cap('read_posts')แต่ฉันไม่ต้องการให้พวกเขาดูโพสต์ปกติเพียงแค่ประเภทโพสต์การจัดส่ง

ฉันมีบทบาทผู้ใช้ของซัพพลายเออร์ที่มีความสามารถดังต่อไปนี้

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
        )

)

และฉันได้ติดตั้งโพสต์ประเภทสำหรับการจัดส่งด้วยต่อไปนี้

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

ตรวจสอบโซลูชันนี้: wordpress.stackexchange.com/a/108375/38771
PS

ฉันอ่านมาหลายครั้งแล้ว ... ทำตามคำแนะนำทุกอย่างที่ฉันทำได้ ยังคงได้รับคุณไม่ได้รับอนุญาตให้เข้าถึงจนกว่าฉันจะให้สิทธิ์ create_shipments
นิโคลัส Koskowski

3
คุณสามารถแชร์รหัสที่คุณเพิ่มบทบาทด้วยadd_role()และตัวพิมพ์ใหญ่ได้add_cap()หรือไม่
Mat

1
คุณพยายามให้ซัพพลายเออร์อ่านโพสต์ประเภทนี้ที่ส่วนหน้าหรือที่ส่วนหลังหรือไม่?
Myles

และรหัสนี้ในปลั๊กอินหรือชุดรูปแบบคืออะไร? ปลั๊กอินดีกว่า แต่อย่างใดด้วยข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าของคุณฉันมั่นใจว่าฉันจะสามารถมอบโซลูชันที่ครอบคลุมยิ่งขึ้นให้กับคุณ
Myles

คำตอบ:


4

ประเภทโพสต์ที่กำหนดเองของคุณดูเหมือนว่าตั้งค่าไว้อย่างถูกต้อง มันทำงานกับการทดสอบการติดตั้งของฉัน ลองใช้วิธีนี้แทนที่จะใช้ add_role และรหัสเสริม __cap ที่คุณใช้อยู่ในปัจจุบัน (สำหรับวัตถุประสงค์ในการทดสอบเท่านั้นอย่าใช้ในรหัสการผลิตด้วยเหตุผลที่อธิบายไว้ด้านล่าง) มันใช้งานได้สำหรับฉัน:

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

สิ่งสำคัญคือต้องจำไว้ว่าการเพิ่มบทบาทและความสามารถของผู้ใช้จริง ๆ แล้วบันทึกข้อมูลลงในฐานข้อมูล ดังนั้นหากคุณมีเวอร์ชันของโค้ดก่อนหน้านี้ว่าใช้งานไม่ได้ให้เพิ่มบางสิ่งที่จะทำให้ใช้งานได้อาจจะไม่มีผลหากมีข้อมูลเก่าในฐานข้อมูลของคุณ add_role () ส่งคืนค่า null ถ้าบทบาทมีอยู่แล้วในฐานข้อมูล สำหรับรหัสการผลิตคุณควรใช้การเปิดใช้งานปลั๊กอินและตะขอเลิกใช้สำหรับสิ่งนี้แทนการใช้งานทุกครั้งเช่นนี้

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()ไม่ควรดำเนินการในทุกคำขอ โปรดทราบว่าเมื่อเพิ่มบทบาทลงในฐานข้อมูลแล้วคุณไม่ต้องเพิ่มบทบาทอีก โดยปกติแล้วคุณจะเพิ่มบทบาทregister_activation_hookและลบบทบาทในregister_deactivation_hook/ register_unistall_hook; นอกเหนือจากนั้นคุณควรดำเนินการremove_role()/ add_role()เฉพาะเมื่อจำเป็นเท่านั้น
cybmeta

ฉันรู้และฉันก็พูดถึงเรื่องนี้ในคำตอบของฉันเช่นกัน แต่มันอาจเป็นวิธีที่รวดเร็วในการวินิจฉัยปัญหาในการพัฒนาเพื่อให้คุณไม่ต้องคลิกปิดใช้งานและเปิดใช้งานทุกครั้งที่คุณทำการเปลี่ยนแปลงรหัส จากนั้นเมื่อใช้งานได้ให้ย้ายไปยังการเปิดใช้งานและการยกเลิกตะขอ
Myles

1
@cybmeta นั่นเป็นเรื่องจริง ฉันแก้ไขคำตอบของฉันเพื่อสะท้อนว่าสามารถปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดได้อย่างไร
Myles

0

ในวัตถุบทบาทของคุณคุณมีความสามารถในการ 'create_shipment' ที่มันควรจะพูดว่า 'create_shipments' ดูเหมือนว่าอาจมีโค้ดของคุณหายไปทุกที่ที่คุณเพิ่มความสามารถนั้น


0

คุณอาจลอง:

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

ลองใช้ดู 'dms_document' เป็นประเภทโพสต์ที่กำหนดเอง

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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.