Как получить изображения галереи?

У меня есть некоторые изображения, загруженные в сообщениях WordPress (например, post # 1 и post # 2). Теперь я создал новое сообщение (например, сообщение №3), и в этом посте я вставил галерею WordPress 3.5, я не загрузил изображение в сообщение № 3, вместо этого использовал изображения из сообщения # 1 и сообщение №2. Теперь в сообщении № 3 я хотел бы получить ссылки на изображения, но я не могу получить. Я использую следующий код:

$attachments = get_children( array('post_parent' => get_the_ID(), 'post_type' => 'attachment', 'post_mime_type' =>'image') ); foreach ( $attachments as $attachment_id => $attachment ) { echo wp_get_attachment_image( $attachment_id, 'medium' ); } 

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

Спасибо за любую помощь.

Solutions Collecting From Web of "Как получить изображения галереи?"

У меня была та же проблема: как я могу отображать все изображения из сообщения, содержащего галерею, где некоторые изображения не прикреплены к сообщению или прикреплены к различным сообщениям?

Новый медиа-интерфейс в WP3.5 позволяет добавлять любые изображения в медиа-библиотеку в галерею, независимо от того, являются ли они «прикреплены» или нет. Как вы обнаружили, функция get_children возвращает только изображения, прикрепленные к сообщению. Трюк, который я использовал, – это получить идентификаторы из самого ярлыка [gallery], а не из того, что они являются вложениями. Штрих-код включает в себя все идентификаторы изображений, независимо от того, прикреплены ли они к сообщению или нет. Например [галерея ids = "410,411,412,413,414,415"]. Очевидно, WordPress может проанализировать это, чтобы получить все изображения и отобразить их в формате галереи, используя функцию «gallery_shortcode», включенную в ядро ​​wordpress (в include / media.php). Чтобы получить идентификаторы всех изображений в коротком коде [gallery], я сделал новую функцию в файле functions.php:

 function grab_ids_from_gallery() { global $post; $attachment_ids = array(); $pattern = get_shortcode_regex(); $ids = array(); if (preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches ) ) { //finds the "gallery" shortcode and puts the image ids in an associative array at $matches[3] $count=count($matches[3]); //in case there is more than one gallery in the post. for ($i = 0; $i < $count; $i++){ $atts = shortcode_parse_atts( $matches[3][$i] ); if ( isset( $atts['ids'] ) ){ $attachment_ids = explode( ',', $atts['ids'] ); $ids = array_merge($ids, $attachment_ids); } } } return $ids; } add_action( 'wp', 'grab_ids_from_gallery' ); 

Теперь просто используйте функцию grab_ids_from_gallery (), чтобы вернуть все идентификаторы в виде массива в вашем шаблоне.

Я уверен, что есть более элегантный способ сделать это. Но это работает для меня. Основой для этого кода является:

http://core.trac.wordpress.org/ticket/22960

в котором обсуждается этот вопрос.

Должен признаться, что у меня не было времени играть с новыми медиа-галереями 3.5 и т. Д., Но отработка кода в одиночку без учета функциональности галереи WP's …

Код, который вы предоставили, использует get_children() с переменной запроса post_parent установленной в get_the_ID() (идентификатор объекта post, который в настоящее время обрабатывается в контуре содержимого). Таким образом, вызов get_children() может get_children() только прикрепленные файлы к текущему сообщению, а другие нет .

В терминологии вашего примера ваш код, когда он выполняется в контексте цикла при обработке сообщения №3 , не может получить вложения, прикрепленные к столбцам №1 и №2, потому что он специально запрашивает вложения, прикрепленные к сообщению # 3 .

К сожалению, WordPress не поддерживает передачу нескольких значений в post_parent query var, поэтому для извлечения вложений из других сообщений по вашему желанию вам нужно будет получить идентификаторы сообщений в сообщениях, содержащих вложение ( Post # 1 и сообщение №2 ) и выполнить вызов get_children() для каждого, заменив значение get_the_ID() « get_the_ID() » соответствующим ID.

Более эффективное (хотя и теоретически более сложное) решение может быть сделано с умным использованием объекта WP_Query , однако я считаю, что решение, которое вы ищете (или я предполагаю, что вы ищете – вы никогда не задавали вопрос;)) что-то вроде

 $attachmentParentIds = getAttachmentParentIds( get_the_ID() ); foreach( $attachmentParentIds as $attParentId ) { $attachments = get_children( array('post_parent' => $attParentId, 'post_type' => 'attachment', 'post_mime_type' =>'image') ); foreach ( $attachments as $attachment_id => $attachment ) { echo wp_get_attachment_image( $attachment_id, 'medium' ); } } 

который использует такую ​​функцию, как

 //Returns an array of post IDs containing attachments that should be displayed //on the post indicated by the passed post ID. function getAttachmentParentIds( $intPostId ) { $ids = array(); //Figure out which posts contain attachments that need to be displayed for $intPostID //... return $ids; //return an array of IDs } 

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

Реальным решением было бы создание новой «реальной» объекта «галерея» со своим собственным идентификатором.

Галерея представляет собой не более массива идентификаторов изображений, но было бы проще управлять:

  • Вы можете создать его непосредственно из Media Manager, так, как теперь создаете новые «галереи» в WP 3.5.x Вместо генерации короткого кода, подобного этому: [галерея ids = «xx, yy, zz»], он может просто создать новую «Галерею» со своим идентификатором и назовите ее следующим образом: [галерея galley_id = "123"]

  • Вы можете управлять своими объектами «настоящих галерей» под СМИ, в новом разделе «Галереи»

  • У вас есть набор функций для управления таким объектом. Таким образом, проблема OP будет решена просто путем передачи gallery_id для использования в шаблоне attachment.php (или в новом шаблоне gallery.php, который также может быть реализован) с использованием соответствующей функции.

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

  • Вы можете добавить несколько галерей в сообщение в cinch.

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

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

Я понимаю, что вы не увидите этого недостатка, если вы используете отображение Carousel от Jetpack, так как он не выведет вас из текущей страницы, и вам не нужно будет привязывать изображение к той конкретной галерее, которую вы создали ».

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