web-dev-qa-db-ja.com

カスタムユーザーロールでは注目の画像を表示または変更できません

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&amp;type=image&amp;TB_iframe=1&amp;width=753&amp;height=294" title="Set featured image">Set featured image</a>
      </p>
    </div>
</div>

そして実際にメタボックスを隠すcss:

#postimagediv {
   display: hidden !important;
}

IFeatured Imageの下のScreen Optionsを有効にしていることに注意してください。

次のコードを使用して、上記のロールにupload_files特権を付与してみたことも指摘しておく必要があります。

function extend_event_admin_role() {
  $role = get_role('event_admin');

  $role->add_cap('upload_files');
}

もう1つ指摘すべきことは、Idoupload_filesパーミッションを追加すると、Featured ImageScreen Optionsの下に表示され、メディアをサポートする他のメタボックスもAdd Mediaボタンを持ちますupload_filesfalseに設定すると消えます。

enter image description here

enter image description here

注目のイメージ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;
5
Cyclonecode

私はついに問題を 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;
}
1
Cyclonecode

自分の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 のようなフィルタを使うことも可能かもしれません。

3
birgire

私が理解している限りでは、カスタム投稿タイプEvent + featured_image + Custom Roleが必要です。私が理解していないのは、機能をカスタマイズしない限り、capability_typeイベントとイベントではありません。

ここで私がしたことは、event_amdinにそのすべての機能を付けて編集者の役割を複製し、あなたがあなたの質問でpage-attributesを使っているときにcapability_typeをpageにすることです。

テスト:contributorとしてtestEvent 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' );
  1. 役割と機能
  2. 登録投稿タイプ
  3. フラッシュリライトルール
1
Webloper