web-dev-qa-db-ja.com

私の習慣はなぜですか WP ロールを編集するにはedit_postsが必要ですか?

これは私以外の誰かには明白かもしれません。 「画像」は確かに「投稿」の一形態であることをどこかで読んだことを覚えていると思います。

  • "listing"というカスタム投稿タイプがあります
  • 私は "_クライアント"のカスタムWPロールを持っています

「クライアント」としてログインし、メディアポップアップを起動して画像を参照し、「表示」をクリックして開き、「画像の編集」をクリックすると、-1が表示されます。すなわち他には「-1」以外は表示されません。

カスタムロールに "edit_posts"の機能を割り当てることでこの問題を解決できます。どうしてこれなの?私がこれをするとすぐに、私は別の問題に悩まされています、「クライアント」ユーザーロールは今私がしたくない投稿、コメントとツールへのアクセスを持っています。

おそらく、自分のカスタム投稿タイプを機能で正しく設定していないのでしょうか。 「クライアント」に画像の編集を許可し、投稿へのアクセスを許可しないようにするにはどうすればよいですか。

      $args = array(
    'label' => 'Listing',
    'description' => '',
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'show_in_nav_menus' => true,
    'map_meta_cap' => true,
    'capability_type' => 'listing',
    'capabilities' => array(
                    'edit_post' => 'edit_listing',
                    'read_post' => 'read_listing',
                    'delete_post' => 'delete_listing',
                    'edit_posts' => 'edit_listings',
                    'edit_others_posts' => 'edit_others_listings',
                    'publish_posts' => 'publish_listings',
                    'read_private_posts' => 'read_private_listings',
                    'delete_posts' => 'delete_listings',
                    'delete_private_posts' => 'delete_private_listings',
                    'delete_published_posts' => 'delete_published_listings',
                    'delete_others_posts' => 'delete_others_listings',
                    'edit_private_posts' => 'edit_private_listings',
                    'edit_published_posts' => 'edit_published_listings',
                ),
    'menu_position' => 5, 
    'hierarchical' => false,
    'has_archive' => false, 
    'rewrite' => array('slug' => 'listing'), 
    'query_var' => true,
    'supports' => array('title'),
    'labels' => $labels
  ); 
7
Andrew

images Attachments 、および Attachments Post-Type であるためです。したがって、添付ファイルである投稿である画像を編集するには、edit_post機能が必要です。

_編集_

capabilityマッピング配列のキー/値を逆にしていませんか?

例えば'edit_posts' => 'edit_listings'があります。代わりに'edit_listings' => 'edit_posts'ではないでしょうか。

0
Chip Bennett

私はこの質問が1年前になったことを知っていますが、実際にこれを達成する方法があることを私は発見したところです。

add_filter( 'user_has_cap', 'my_user_has_cap', 10, 3 );

function my_user_has_cap( $user_caps, $req_cap, $args ) {

    $post = get_post( $args[2] );

    if ( 'attachment' != $post->post_type )
        return $user_caps;

    if ( 'delete_post' == $args[0] ) {

        if ( $user_caps['delete_others_posts'] )
            return $user_caps;

        if ( !isset( $user_caps['delete_others_listings'] ) or !$user_caps['delete_others_listings'] )
            return $user_caps;

        $user_caps[$req_cap[0]] = true;

    }

    if ( 'edit_post' == $args[0] ) {

        if ( $user_caps['edit_others_posts'] )
            return $user_caps;

        if ( !isset( $user_caps['edit_others_listings'] ) or !$user_caps['edit_others_listings'] )
            return $user_caps;

        $user_caps[$req_cap[0]] = true;

    }

    return $user_caps;

}

これは主に このCodexの記事 に基づいています。

私はまだ私のヘッドラウンド機能フィルタを得ていて、それは午前2時04分なので、私のコードはおそらく改善可能かもしれません...

6