Intereting Posts
Как удалить имя таксономии родителей из заголовка, созданного wp_title ()? Форма входа в всплывающее окно Импорт твитов с определенными хэштегами в WordPress Как отредактировать тег <title> без использования устаревшей функции `wp_title ()? Показать наиболее просматриваемые сообщения за последние 30 дней работает неправильно Лучшая практика обновления файла header.php Проверьте, есть ли более одного сообщения Как удалить «Нажмите здесь, чтобы отменить ответ» Ссылка из формы комментария WordPress Уникальная пользовательская таксономия Как заполнить новостную рассылку Mailchimp с последними событиями из плагина WordPress EventOn? Добавление полезных тем в темы Показывает страницу архива по умолчанию вместо страницы пользовательского архива Удалить «обновленное» изображение после 5-дневного WordPress Как остановить загрузку нескольких копий jquery Как бороться с комментариями спама и отличать их от комментариев, не связанных со спамом?

сложное ограничение элементов в медиа-библиотеке

Мне нужно ограничить элементы в медиа-библиотеке для пользователей без особых возможностей. Существует множество примеров того, как ограничить их только те элементы, которые загрузил данный пользователь, но моя потребность более сложна.

Мне нужно ограничить элементы мультимедиа для пользователей без особых возможностей для тех вложений, которые НЕ:

  1. заголовочные изображения (т. е. установленные в Внешний вид> Заголовки)
  2. (например, выделенные изображения)

Ниже приводится решение, которое я придумал.

/* * restrict media items available to users without cap=mycap to those that are NOT: * * 1. theme headers (ie, set in Appearance > Headers) * 2. page thumbnails (ie, featured images) */ add_action ('pre_get_posts', 'restrict_media') ; function restrict_media ($query) { if (!is_admin () || $query->get ('post_type') != 'attachment' || current_user_can ('mycap')) { return ; } // get our theme's headers (ie, set in Appearance > Headers) $args = array ( 'post_type' => 'attachment', 'post_status' => array ('inherit', 'private'), 'posts_per_page' => -1, 'meta_query' => array ( 'relation' => 'AND', array ( 'key' => '_wp_attachment_context', 'value' => 'custom-header', ), array ( 'key' => '_wp_attachment_is_custom_header', 'value' => 'antelopevalley', ), ), ) ; // remove ourself from pre_get_posts to avoid infinite regression remove_action ('pre_get_posts', array ($this, 'restrict_media')) ; $headers = new WP_Query ($args) ; // get the IDs of the headers $header_ids = array_map (function ($p) { return ($p->ID) ; }, $headers->posts) ; // add ourself back to pre_get_posts for subsequent queries add_action ('pre_get_posts', array ($this, 'restrict_media')) ; // get posts with thumbnails $args = array ( 'post_type' => 'page', 'post_status' => array ('publish', 'pending', 'draft', 'private'), 'posts_per_page' => -1, 'meta_query' => array ( array ( 'key' => '_thumbnail_id', 'compare' => 'EXISTS', ), ), ) ; $with_thumbnail = new WP_Query ($args) ; // get the IDs of the thumbnails $thumbnail_ids = array_map (function ($p) { return (get_post_meta ($p->ID, '_thumbnail_id', true)) ; }, $with_thumbnail->posts) ; // exclude all theme headers and thumbnails $query->set ('post__not_in', array_merge ($header_ids, $thumbnail_ids)) ; return ; } 

Вышеупомянутое решение работает; однако, это кажется слишком сложным для меня!

Мне интересно, может ли кто-нибудь предложить более простое решение.

Примечание. Я пробовал фильтры post_ {где, join} раньше для других нужд и нашел их слишком сложными для поддержания, поэтому я даже не пытался найти решение этой проблемы, используя их, но я больше, чем открытые для тех, кто их использует

Solutions Collecting From Web of "сложное ограничение элементов в медиа-библиотеке"

Хороший код. Я думаю, вы могли бы упростить, сделав вместо этого прямые SQL-запросы:

 -- Featured Images SELECT `meta_value` FROM `wp_postmeta` WHERE `meta_key` = '_thumbnail_id'; --> $thumbnail_ids -- Header Images SELECT `post_id` FROM `wp_postmeta` WHERE `meta_key` = '_wp_attachment_context' and `meta_value` = 'custom-header'; --> $header_ids 

Кроме того, с помощью вашего метода, я думаю, что если вы вызовете WP_Query с suppress_filters => true (или вместо этого используйте get_posts() , он get_posts() фильтры по умолчанию), вы можете избежать необходимости удалить свой собственный фильтр.