맞춤 게시물 유형 역할 권한으로 읽을 수 없습니다.


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 권한을 부여 할 때까지는 여전히 액세스 할 수 없습니다.
Nicholas Koskowski

3
당신은 당신이 가진 역할을 추가하는 코드를 공유 할 수 add_role()와 모자 add_cap()?
Mat

1
공급 업체가이 포스트 유형을 프론트 엔드 또는 백엔드에서 읽도록하려고합니까?
Myles

그리고이 코드는 플러그인이나 테마입니까? 플러그인이 더 낫지 만 어느 쪽이든 설정에 대한 자세한 정보를 통해보다 포괄적 인 솔루션을 제공 할 수 있습니다.
Myles

답변:


4

맞춤 게시물 유형이 올바르게 설정되어있는 것 같습니다. 테스트 설치에서 작동합니다. 현재 사용중인 add_role 및 add_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_shipments'라고 말하는 'create_shipment'기능이 있습니다. 해당 기능을 추가 할 때마다 코드에 's'가 누락 된 것 같습니다.


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.