Только текущие изображения галереи с get_attached_media

Вопрос или проблема

На моей странице изображения галереи цикличны, и я хотел бы показать их заголовок в качестве подписи. Поскольку 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); действительно предоставляет все изображения, когда-либо прикрепленные к данному посту, что не подходит для вашей задачи. Вместо этого вы хотите получить только те изображения, которые указаны в шорткоде галереи.

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

Пошаговое решение

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

  2. Получение идентификаторов вложений – ваш подход к извлечению идентификаторов изображений из шорткода верен. Следует убедиться, что аргумент "ids" правильно обрабатывается (так как он может быть строкой, содержащей числа, разделенные запятыми).

  3. Получение вложений – запрос, который вы используете с помощью 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 изображений.

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

Оцените материал
Добавить комментарий

Капча загружается...