WordPress как на ладони
WordCamp Saint Petersburg 2018 wordpress jino

Как запретить удаление и редактирование медиафайлов в вордпресс?

У меня стоит плагин User Role Editor в котором я для пользователей с правами "Автор" разрешил загрузку медиафайлов.

Допустим автор пишет пост, вставляет туда медиафайл. После этого отправляет пост админу на утверждение. После того как админ опубликует данный пост, то пользователь с правами "Автор" не может этот пост редактировать или удалять (в моём случае).

Однако, если он зайдет в медиа, то у него открыты права на редактирование и удаление медиа, которые привязаны к этому уже опубликованному посту. В плагинах ролей такой функции на ограничение нет. Т.е. я хочу обезопасить себя от авторов, которые, после получения оплаты за статью могут напакостить и удалить фото, которые они загружали к публикации. Надеюсь смысл моей задумки понятен.

Как в functions.php ограничить права "Автора" (или всех кроме админа) на редактирование и удаление медиа, которые привязаны к уже опубликованному посту?

Спасибо.

2
2 месяца назад
  • 0

    https://stackoverflow.com/questions/25894288/wordpress-remove-attachment-fields - здесь есть пример как удалять поля, в вашем случае надо удалить поле Delete Permanуntly для всех картинок, кроме тех, которые не прикреплены к постам.

    Вам надо сформировать массив с id картинок которые можно редактировать и удалять и затем внутри темплейта надо делать проверку отображать поле или нет.

    Я так вижу решение вашей проблемы.

    alex84df 2 месяца назад

    Нет, вариант с неприкрепленными фото не годится. Все фото в данном случае прикрепляются автоматически при загрузке внутри оформления публикации.

    kolshix 2 месяца назад

    идея хорошая почистить

    /wp-includes/media-template.php

    от "Delete Permanуntly"
    но остается поправить права в множественном удалении медиа, мне чисто 99% повезло - так ответы никогда не находил - единственное нужно оформить достойно , на JS - чтоб странички не обновлялись в лишний раз (JS b тонкости программирования я не знаю), но код ниже выручает частично

    Комментировать
  • 1
    kolshix230 cайт: paxtoy.com

    понравился вопрос
    1 - ищите по английский - наши практически ничего не предлагаю кроме плагинов, и практически не нахожу новой инфы, кроме текущего сайта
    2 - ищу в гугл по "remove capability to delete attachments wordpress"

    вот подвижки
    есть код - только что протестил - его нужно дополнить и поправить - а так же добавить идею автора выше (а также почитать про роли)

    A) Запрещаем удалять

    в итоге создать пару условий,
    1 - вообще есть ли доступ к редактированию медиа
    2 - медиа является прикрепленным (если не прикреплено то походу можно удалить)
    3 - медиа загружено пользователем его создавшим
    4 - пост к которому прикреплено медиа опубликован или нет
    5 - ....

    думаю это минимальный перечень

    add_action('delete_attachment', 'DontDeleteMedia', 11, 1);
    function DontDeleteMedia($postID)
    {
    
    	if (!current_user_can('manage_options')) { // роли 
    		exit('You cannot delete media.');
    	}
    }

    Б) Отключаем кнопку "Удалить навсегда"
    1 - лезим в "ашсайт.ком/wp-includes/media-template.php"
    2 - находим "Delete Permanуntly"
    3 - обрамляем условием: выставляем роли пользователей и фильтры (опубликовано или нет, привязано к посту и тд.) для отображения кнопки

    это первые подвижки - код работает - на удивление - когда дойду до этапа заказа статей на сайте, обязательно внедрю

    код конечно слабый, но когда нет времени и денег на хороший, то приходится пользоваться тем что есть.

    это заметка - работоспособность не известна
    // This action will fire when user delete attachment (countdown):
    add_action('delete_attachment', 'decrease_limit_uploads_for_user');
    function decrease_limit_uploads_for_user( $id ) {
       $user = wp_get_current_user();
       // add the role you want to limit in the array
       $limit_roles = array('contributor');
       $filtered = apply_filters( 'limit_uploads_for_roles', $limit_roles, $user );
       if ( array_intersect( $limit_roles, $user->roles ) ) {
    	 $post = get_post( $id);
    	 if ( $post->post_author != $user->ID ) return;
    	 $count = get_user_meta( $user->ID, 'upload_count', true ) ? : 0;
    	 if ( $count ) update_user_meta( $user->ID, 'upload_count', $count - 1 );
       }
    }
    alex84df 2 месяца назад

    Пункт "Б" будет менее рационален ввиду дальнейших обновлений движка сайта. Из написанного Вами пункта "А" нужно взять лишь условие №4, поскольку все остальные успешно проверяются и выполняются плагином "User Role Editor".

    Код, который Вы написали только лишь проверяет роли, но вот как его допилить на проверку "пост к которому прикреплено медиа опубликован или нет" - если опубликован, то запретить редактирование и удаление привязанных к нему фото.

    Я, к сожалению, не силен в этом. Есть базовые знания и понимание того, как это должно примерно работать, но в данном случае их не хватает. Да и в сети нет никакой информации..

    kolshix 2 месяца назад

    Попробуйте так - может получится

    /* Права доступа на удаление файлов вложеныyх в посты со статусом "Опубликовано" 
     * KOLSHIX
     */ 
    add_action('delete_attachment', 'DontDeleteMedia', 11, 1);
    function DontDeleteMedia($postID){
    	$post_image = get_post( $postID );                  // инфа про изображение // получаем отсюда страницу вложения
    	$post_post  = get_post( $post_image->post_parent ); // Инфа о странице вложения // получаем отсюда статус публикации
    	if (!current_user_can('manage_options') && $post_post->post_status == 'publish' && +($post_image->post_parent) !== 0 ) { // роли 
    		exit('Дальнейшие действия с файлом по разрешению администратора');
    	}
    }

    единственное плохо то что через медиа можно открепить файл и потом удалить

    alex84df 2 месяца назад

    Попробовал. К сожалению, не работает.

    kolshix 2 месяца назад

    дело в том что у меня работает, скорее всего плагин перехватывает какието действия

    alex84df 2 месяца назад

    Пробовал с отключенным плагином. Не работает.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация