Event
というカスタム投稿タイプを作成し、functions.php
ファイルでおすすめ画像のサポートを有効にしましたが、それでも私のカスタムユーザーロールはイベントの編集ページに注目画像メタボックスを表示できません。ユーザーが管理者としてログインすると、Featured Image
メタボックスがエラーなしで表示されます。
これがCPTを登録するための私のコードです:
add_action('init', 'event_post_init');
function event_post_init() {
// array of all capabilities for our CPT
$capabilities = array(
'publish_posts' => 'publish_events',
'edit_posts' => 'edit_events',
'edit_others_posts' => 'edit_others_events',
'delete_posts' => 'delete_events',
'delete_published_posts' => 'delete_published_events',
'delete_others_posts' => 'delete_others_events',
'read_private_posts' => 'read_private_events',
'edit_post' => 'edit_event',
'delete_post' => 'delete_event',
'read_post' => 'read_event',
);
// register the CPT
register_post_type( 'event',
array(
'labels' => array(
'name' => __('Event')
),
'public' => true,
'has_archive' => true,
'show_ui' => true,
'menu_position' => 8,
'capability_type' => array('event', 'events'),
'capabilities' => $capabilities,
'supports' => array('title', 'thumbnail', 'page-attributes'),
'map_meta_cap' => true,
'hierarchical' => true,
)
);
}
そして、これが私のカスタムユーザロールの設定方法です。
function create_event_admin_role(){
add_role('event_admin', 'Event Administrator', array(
'publish_events' => false,
'edit_events' => true,
'edit_others_events' => false,
'delete_events' => false,
'delete_others_events' => false,
'read_private_events' => true,
'edit_published_events' => true,
'read' => true,
'assign_terms' => true,
'edit_terms' => true,
'manage_terms' => true,
'read_private_pages' => true
)
);
}
奇妙なことに、私が編集ページのマークアップを見れば#postimagediv
要素を見ることができますが、それは何らかの理由でそれが隠されていることです。これがページ内のマークアップです。
<div class="postbox hide-if-js" id="postimagediv" style="">
<div title="Click to toggle" class="handlediv"><br></div>
<h3 class="hndle ui-sortable-handle"><span>Featured Image</span></h3>
<div class="inside">
<p class="hide-if-no-js">
<a class="thickbox" id="set-post-thumbnail" href="http://example.com/wp-admin/media-upload.php?post_id=662&type=image&TB_iframe=1&width=753&height=294" title="Set featured image">Set featured image</a>
</p>
</div>
</div>
そして実際にメタボックスを隠すcss:
#postimagediv {
display: hidden !important;
}
IがFeatured Image
の下のScreen Options
を有効にしていることに注意してください。
次のコードを使用して、上記のロールにupload_files
特権を付与してみたことも指摘しておく必要があります。
function extend_event_admin_role() {
$role = get_role('event_admin');
$role->add_cap('upload_files');
}
もう1つ指摘すべきことは、Idoupload_files
パーミッションを追加すると、Featured Image
はScreen Options
の下に表示され、メディアをサポートする他のメタボックスもAdd Media
ボタンを持ちますupload_files
をfalse
に設定すると消えます。
注目のイメージmetaboxを追加するwp-admin/edit-form-advanced.php
のコードを変更すると、それが本当にadd_metabox()
を呼び出していることがわかります。
if ( $thumbnail_support && current_user_can( 'upload_files' ) ):
add_meta_box('postimagediv', __('Featured Image'), 'post_thumbnail_meta_box', null, 'side', 'low');
print 'Support for Featured Image';
exit;
endif;
私はついに問題を Revisionary
と呼ばれる活性化されたプラグインまで追跡しました。 postimagediv
要素を隠す役割を担う関数は、act_hide_admin_divs
にあるrevisionary/admin/admin_rvy.php
です。その機能がすることは、改訂をサポートしないコンテンツでメタボックスを隠すことです。
私の特定の役割のための注目の画像を表示するために、私はrvy_hidden_meta_boxes
フィルタを使いました:
add_filter('rvy_hidden_meta_boxes', 'revisor_show_featured_image_box');
function revisor_show_featured_image_box($unrevisable_css_ids) {
$key = array_search('postimagediv', $unrevisable_css_ids, true);
unset($unrevisable_css_ids[$key]);
return $unrevisable_css_ids;
}
自分のevent_admin
ロールにのみ割り当てられているユーザーは、 特集画像 メタボックスを表示するのに必要なupload_files
機能を持っていません。
これは、コアからの関連コードです。
if ( $thumbnail_support && current_user_can( 'upload_files' ) ) // <-- Notice this check
add_meta_box(
'postimagediv',
esc_html( $post_type_object->labels->featured_image ),
'post_thumbnail_meta_box',
null,
'side',
'low'
);
後でオプションを追加しようとした場合は、次の点に注意してください。
'upload_files' => true
あなたのadd_role()
設定に対しては、wp_user_roles
オプションにキャッシュされているので更新されないかもしれません。
そのため、データベースを更新して調整する必要があります。
remove_role()
を使用してから再度add_role()
を使用してください。\WP_Role
クラスの add_cap()
メソッドを使用してください。動的にこれを調整するために user_has_cap
のようなフィルタを使うことも可能かもしれません。
私が理解している限りでは、カスタム投稿タイプEvent
+ featured_image
+ Custom Role
が必要です。私が理解していないのは、機能をカスタマイズしない限り、capability_typeイベントとイベントではありません。
ここで私がしたことは、event_amdin
にそのすべての機能を付けて編集者の役割を複製し、あなたがあなたの質問でpage-attributesを使っているときにcapability_typeをpageにすることです。
テスト:contributorとしてtest、Event Administratorとしてcycloneという2人のユーザーを作成しました。私はこの答えを更新するようにあなたの必要性についてのより多くの情報を提供してください。ありがとうございます。
編集1 :コードを更新し、編集1の開始/終了セクションをcloneUserRole
関数にチェックインします。
ハッピーコーディング!
function cloneUserRole()
{
global $wp_roles;
if (!isset($wp_roles))
$wp_roles = new WP_Roles();
$editor = $wp_roles->get_role('editor');
// Adding a new role with all editor caps.
$wp_roles->add_role('event_admin', 'Event Administrator', $editor->capabilities);
// edit 1 start : updated to add cap to new user role
$event_admin = $wp_roles->get_role('event_admin');
$event_admin->add_cap( 'read_event' );
$event_admin->add_cap( 'delete_event' );
$event_admin->add_cap( 'edit_event' );
$event_admin->add_cap( 'read_private_events' );
$event_admin->add_cap( 'delete_others_events' ); // don't add
$event_admin->add_cap( 'delete_published_events' );
$event_admin->add_cap( 'delete_events' ); // don't add
$event_admin->add_cap( 'edit_others_events' ); // don't add
$event_admin->add_cap( 'edit_events' );
$event_admin->add_cap( 'publish_events' ); // don't add
// edit 1 ends :
//echo '<pre>', print_r( $wp_roles, 1), '</pre>';
//die;
}
add_action('init', 'cloneUserRole');
function stack_event_init() {
$labels = array(
'name' => _x( 'Events', 'post type general name', 'stack' ),
'singular_name' => _x( 'Event', 'post type singular name', 'stack' ),
'menu_name' => _x( 'Events', 'admin menu', 'stack' ),
'name_admin_bar' => _x( 'Event', 'add new on admin bar', 'stack' ),
'add_new' => _x( 'Add New', 'event', 'stack' ),
'add_new_item' => __( 'Add New Event', 'stack' ),
'new_item' => __( 'New Event', 'stack' ),
'edit_item' => __( 'Edit Event', 'stack' ),
'view_item' => __( 'View Event', 'stack' ),
'all_items' => __( 'All Events', 'stack' ),
'search_items' => __( 'Search Events', 'stack' ),
'parent_item_colon' => __( 'Parent Events:', 'stack' ),
'not_found' => __( 'No events found.', 'stack' ),
'not_found_in_trash' => __( 'No events found in Trash.', 'stack' )
);
$args = array(
'labels' => $labels,
'description' => __( 'Description.', 'stack' ),
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'show_in_menu' => true,
'show_in_admin_bar' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'event' ),
'capability_type' => 'page',
'has_archive' => true,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'thumbnail', 'page-attributes' )
);
register_post_type( 'event', $args );
}
add_action('init', 'stack_event_init');
function my_rewrite_flush() {
stack_event_init();
flush_rewrite_rules();
}
add_action( 'after_switch_theme', 'my_rewrite_flush' );