andrew
  • 0
Учитель

Почему моя пользовательская роль WP требует edit_posts для редактирования изображений?

  • 0

Это может быть очевидно кому-то, кроме меня. Кажется, я где-то читал, что «изображение» — это действительно форма «поста».

  • У меня есть настраиваемый тип сообщения под названием «листинг».
  • У меня есть пользовательская роль 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
  ); 
Share
  1. Вот возможности, которые я назначаю своей пользовательской роли WordPress на случай, если кто-нибудь что-то заметит delete_listing delete_listings delete_published_listings edit_listing edit_listings edit_published_listings publish_listing publish_listings read read_listing upload_files . И мне, похоже, также нужно следующее для редактирования и удаления изображений. Думал, что они будут переназначены на edit_listings и delete_listings. edit_posts delete_posts

    • 0
  2. Если бы мне пришлось угадывать: потому что изображения — это Attachments, а Attachments — это Post-Type. Таким образом, для редактирования изображения, которое является вложением или сообщением, требуется edit_post возможность.

    РЕДАКТИРОВАТЬ

    Разве у вас нет capability перевернутых ключей/значений массива сопоставления?

    например у вас есть 'edit_posts' => 'edit_listings' . Разве это не должно быть вместо этого 'edit_listings' => 'edit_posts' ?

    • 0
  3. Я знаю, что этому вопросу уже год, но я только что обнаружил, что на самом деле есть способ добиться этого, поэтому опубликуйте его здесь на случай, если он будет полезен другим людям:

    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;
    
    }
    

    Это основано главным образом на этой статье Кодекса.

    Я все еще обдумываю фильтры возможностей, и сейчас 2:04, так что мой код вполне можно улучшить…

    • 0

Оставить ответ

You must login to add an answer.