기능 및 사용자 정의 게시물 유형


30

특정 역할에 대한 액세스를 제한하려는 사용자 정의 게시물 유형이 있지만 이미 사용자 정의 게시물 유형을 사용하여 콘텐츠를 추가했으며 이제이를 제한해야합니다. capability_type은 '포스트'입니다.

'capability_type' => 'post'

그러나 백엔드에 콘텐츠가 표시되는 것은 좋지만 이제 기능을 추가하자마자 백엔드에서 콘텐츠가 사라지는가?

자체 정의를 구성하기 위해 복수 정의를 포함하도록 기능 유형을 사용자 정의하려고 시도했지만 기능 유형을 제거하거나 변경하자마자 사라졌습니다!

전체 코드 :

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),

    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,

    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    )
);

register_post_type( 'gallery', $args );
}

또한 완전히 새로운 사용자 정의 게시물 유형으로 이것을 테스트했으며 기능 유형에 관계없이 제거하고 내 사용자 정의 게시물을 추가하더라도 동일한 문제가 발생합니다.

'capability_type' => array('movie','movies');

답변:


40

Justin Tadlock 의 유용한 리소스를 지적한 Magicroundabout 과의 빠른 대화 후, add_cap을 역할에 사용하지 않으면 (예 : 다음 사용자 지정 게시물 유형) 사용자 지정 게시물 유형에 대한 기능이 실제로 존재하지 않는 것으로 나타났습니다.

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    ),
    // as pointed out by iEmanuele, adding map_meta_cap will map the meta correctly 
    'map_meta_cap' => true
);

register_post_type( 'gallery', $args );
}

'관리자'를 포함하여 실제로 백엔드에서 권한이 작동하려면 역할에 추가 기능을 추가해야합니다. 예를 들면 다음과 같습니다.

function add_theme_caps() {
    // gets the administrator role
    $admins = get_role( 'administrator' );

    $admins->add_cap( 'edit_gallery' ); 
    $admins->add_cap( 'edit_galleries' ); 
    $admins->add_cap( 'edit_other_galleries' ); 
    $admins->add_cap( 'publish_galleries' ); 
    $admins->add_cap( 'read_gallery' ); 
    $admins->add_cap( 'read_private_galleries' ); 
    $admins->add_cap( 'delete_gallery' ); 
}
add_action( 'admin_init', 'add_theme_caps');

나는 이것이 다른 사람들에게 유용하기를 바랍니다.


11
add_theme_caps()관리자 페이지가로드 될 때마다가 아니라 한 번만 호출되어야합니다. switch_theme테마 활성화 또는 register_activation_hook플러그인 활성화시 후크 로 사용하는 것이 좋습니다 .
d79

좋은! wp cli를 사용하여 한 번만 수행하면되는 작업이므로 완전히 사용자 지정 / 고유 한 사이트 인 경우 기능을 추가하고 싶습니다.
squarecandy

8

더하다:

map_meta_cap => true

$ args 배열에. 봐 여기에 대한 자세한 내용은. 그것이 도움이되기를 바랍니다!


1
이것은 내가 생각한 것이지만 완전히 그렇지는 않습니다.
erichmond

이것은 나를 위해 일했다
Shikyo

1

IMHO 자신의 기능을 매핑하지 마십시오. 그렇게하려면 map meta cap plugin을 사용해야합니다. http://codex.wordpress.org/Function_Reference/map_meta_cap

커스텀 캡을 코드로 수동으로 매핑하는 데 며칠이 걸렸습니다. 플러그인을 설치하고 캡을 매핑 한 후 작동하면 비활성화하십시오. 사용자 정의 역할을 생성하는 경우 멤버 플러그인이 필요합니다 .

내 역할에 이러한 기능이 있는지 확인하기 위해 테스트하는 방법 (때로는 맹세하지만 실제로는 그렇지 않음)은 다음을 사용하여 디버깅 페이지를 만듭니다.

    if( !function_exists( 'current_user_has_role' ) ){
        function current_user_has_role( $role ){
            $current_user = new WP_User( wp_get_current_user()->ID );
            $user_roles = $current_user->roles;
            $is_or_not = in_array( $role, $user_roles );
            return $is_or_not;
        }
    }

이것은 실제로 어떤 기능을 수행하는지 보여줍니다.


-1

맞춤 게시물 유형의 경우 후크 사용을 권장 하지 않습니다 .

add_action( 'registered_post_type', 'your_func', 10, 2 );

대신 다음을 사용하는 것이 좋습니다.

add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name ) 
{
   if ( $name == "your_custom_post_name" ) 
   ...
}

제안은 좋은 것이지만 질문에 대한 답은 아닙니다.
Aurovrata
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.