Вопрос или проблема
На моей странице изображения галереи цикличны, и я хотел бы показать их заголовок в качестве подписи. Поскольку get_post_gallery_images
только извлекает URL миниатюры изображений галереи, я попытался использовать get_attached_media('image', $post);
вместо этого.
Следующий код дает мне URL и заголовок изображений галереи:
foreach($images as $image) {
$titleArr[] = $image->post_title;
$urlArr[] = wp_get_attachment_url($image->ID);
}
Однако get_attached_media('image', $post);
возвращает все изображения, когда-либо прикрепленные к этому посту, даже если они больше не используются в посте. Также, для постов, где изображения галереи прикреплены к другому посту, они не появляются.
Существует ли эквивалент get_attached_media('image', $post);
, который возвращает все URL изображений и заголовки изображений в данный момент в галерее. Предпочтительно в порядке галереи.
Я нашел ответ, используя шорткод, который помог: Как получить изображения вложений галереи страницы/поста в порядке, в котором они установлены в бекенде, используя WP_Query()?
Мой рабочий код теперь выглядит так:
// Извлекаем аргументы шорткода из $page или $post
$shortcode_args = shortcode_parse_atts(get_match('/\[gallery\s(.*)\]/isU', $post->post_content));
// получаем идентификаторы, указанные в вызове шорткода
$ids = $shortcode_args["ids"];
$attachments = get_posts(
array(
'include' => $ids,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => 'menu_order ID',
'orderby' => 'post__in', // требуется для упорядочивания результатов на основе порядка, указанного в параметре "include"
)
);
if ($attachments) {
foreach ( $attachments as $attachment ) {
$urlArr[] = wp_get_attachment_url($attachment->ID);
$titleArr[] = $attachment->post_title;
}
}
Ответ или решение
Вопрос, поставленный перед нами, касается извлечения изображений галереи, которые на данный момент актуальны для конкретного поста в WordPress, с учетом их заголовков и порядка отображения. Классическая функция get_attached_media('image', $post);
действительно предоставляет все изображения, когда-либо прикрепленные к данному посту, что не подходит для вашей задачи. Вместо этого вы хотите получить только те изображения, которые указаны в шорткоде галереи.
Решение, которое вы нашли, использует шорткоды и бесполезные результаты, так как вы можете точно выбрать те изображения, которые сейчас входят в галерею. Давайте разберемся в вашем коде и предложим несколько рекомендаций по его улучшению.
Пошаговое решение
-
Извлечение аргументов шорткода – вы правы, извлечение аргументов из содержимого поста – это первый шаг. Однако использование регулярных выражений может быть более подвержено ошибкам, если структура содержимого изменится. Используйте встроенные функции для работы со шорткодами, что обеспечит большую универсальность.
-
Получение идентификаторов вложений – ваш подход к извлечению идентификаторов изображений из шорткода верен. Следует убедиться, что аргумент "ids" правильно обрабатывается (так как он может быть строкой, содержащей числа, разделенные запятыми).
-
Получение вложений – запрос, который вы используете с помощью
get_posts
, корректен, и он обеспечивает выборку изображений именно по тем идентификаторам, которые вы получили из шорткода. В данном случае указываетеmenu_order ID
в параметреorder
, чтобы убедиться, что изображения соответствуют порядку, установленному в редакторе содержимого.
Улучшенный пример кода
// Получите содержимое текущего поста
$post_content = get_the_content($post->ID);
// Извлечь id изображений из шорткода
preg_match('/\[gallery\s.*ids="([^"]+)"/', $post_content, $matches);
$ids = isset($matches[1]) ? explode(',', $matches[1]) : [];
// Получаем вложения по id
$attachments = get_posts(array(
'include' => $ids,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => 'menu_order ID',
'orderby' => 'post__in'
));
// Массивы для хранения заголовков и URL
$urlArr = [];
$titleArr = [];
if ($attachments) {
foreach ($attachments as $attachment) {
$urlArr[] = wp_get_attachment_url($attachment->ID);
$titleArr[] = $attachment->post_title;
}
}
// Далее можно использовать массивы $urlArr и $titleArr по мере необходимости
Заключение
С помощью этого решения вы получаете доступ только к тем изображениям, которые на данный момент актуальны для галереи вашего поста, сохраняя их порядок согласно настройкам в редакторе. Это не только улучшает производительность, избегая загрузки ненужных данных, но и упрощает вашу дальнейшую работу с заголовками и URL изображений.
Если у вас возникнут дополнительные вопросы или необходимо внести изменения в вашу задачу, не стесняйтесь обращаться за помощью.