Как получить только носители, которые уже были прикреплены к сообщению / странице?

Ситуация: у моего клиента есть эта простая галерея, построенная с WP_Query, показывающая последние медиа, добавленные на сайт:

$cola = new WP_Query( array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'posts_per_page' => 15, 'post_mime_type' => 'image/jpeg', 'orderby' => 'date' )); 

это работает отлично. За исключением теперь мы используем AdRotate и хотим показывать рекламу на веб-сайте, но мы не хотим, чтобы эти объявления были добавлены в запрос выше.

Простым решением для этого было бы только получение медиафайлов, прикрепленных к сообщению / странице, поскольку объявления никогда не привязаны ни к чему. Это можно было бы реализовать, используя post_parent: array(_of_all_post_ids) – за исключением того, что у нас уже есть около 4k сообщений, поэтому это определенно не очень хороший подход.

Любые идеи, как это сделать?

Примечание: мой клиент не технический специалист, поэтому я исключаю использование FTP для использования папки баннера, созданной AdRotate на wp-контенте. Для их запланированного использования медиа-галерея идеально подходит для рекламы.

Solutions Collecting From Web of "Как получить только носители, которые уже были прикреплены к сообщению / странице?"

Аналогичный подход к вашей идее post_parent заключается в добавлении фильтра в posts_where :

 function bbg_filter_out_non_attachments( $sql ) { global $wpdb; // Maybe do some conditional logic to decide whether to filter this query, then... return $sql . " AND $wpdb->posts.post_parent != 0 "; } add_filter( 'posts_where', 'bbg_filter_out_non_attachments' ); 

Другой способ – выполнить ручной запрос для идентификаторов сообщений без post_parent , а затем передать его post__not_in :

 $ad_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_parent = 0 AND post_type = 'attachment'" ) ); $query_args['post__not_in'] = $ad_ids; // etc 

Если вам не нравится идея смешивания непосредственно с SQL, вы также можете объединить что-то вместе, добавляя часть постмета к каждому элементу, загруженному через медиабиблиотеку (вместо нового сообщения), а затем meta_query параметр meta_query в вашем WP_Query . Обратите внимание, однако, что это не будет таким эффективным, как просто поиск post_parent (который уже есть данные и не требует подключения к таблице).