Intereting Posts
получить сообщение об авторе id out loop База данных для разработки Как я могу изменить имя моего поддомена в WordPress Multisite wp_nav_menu, класс walker, категории как классы li WordPress как поставщик OAuth 404 – 301 – Фиксирование старых ссылок Этот плагин загружается до файла.php, что впоследствии не позволяет мне использовать определенные функции? Как отрезать index.php от шаблона и импортировать из другого файла? Измените woocommerce весовой вес продукта на основе своей категории продукта или тегов? Как загрузить изображения WordPress на удаленный веб-сервер и отобразить эти изображения в галерее WordPress Как я могу отобразить общее количество избранных для какой-либо конкретной записи потока активности приятеля? Показать описание CPT на страницах archive.php для всех CPT Как использовать PHP-код на странице? Отображение списка пользователей ACF Автоматическое сжатие эскизов в зависимости от размера

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

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

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

  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() фильтры по умолчанию), вы можете избежать необходимости удалить свой собственный фильтр.