WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

get_post_gallery_images() WP 3.6.0

Возвращает все URL картинок первой галереи из указанного текста записи (поста), если галерея в тексте есть.

Есть похожая функция get_post_galleries_images(), которая получает все галереи, а не только первую.

Получает URL картинок миниатюр, а не полных размеров.

Не работает с блочным редактором (Гутенберг). Работает только для шоткода [gallery].

Работает на основе: get_post_gallery()
✈ 1 раз = 0.0064108с = очень медленно | 50000 раз = 81.22с = очень медленно | PHP 7.3.12, WP 5.3.2

Хуков нет.

Возвращает

Массив. Список URL картинок галереи, в порядке, как они указаны в шоткоде [gallery].

Использование

get_post_gallery_images( $post );
$post(число/WP_Post)
ID/объект записи в ссылки картинок галерей которой нужно получить.
По умолчанию: текущий пост

Примеры

#1 Получим список всех SRC картинок из первой галереи поста 2179

$gal = get_post_gallery_images(2179);

/* $gal будет содержать
Array
(
	[0] => http://wp-kama.ru/wp-content/uploads/2016/02/image12-80x80.png
	[1] => http://wp-kama.ru/wp-content/uploads/2016/02/image11-80x80.png
	[2] => http://wp-kama.ru/wp-content/uploads/2016/02/image10-80x80.png
)
*/

#2 Получим список всех SRC картинок из первой галереи поста в редакторе Гутенберг

В блочном редакторе (Гутенберг) галерея имеет другой вид - не шорткод, поэтому функция get_post_gallery_images() вернет пустой массив.

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

Временное решение:

/**
 * Возвращает все URL картинок первой галереи из указанного текста записи.
 * Вернёт результат, если галлерея есть и вставлена как блок (Гутенберг).
 *
 * @param int|WP_Post $post
 *
 * @return array
 */
function get_post_block_gallery_images( $post = 0 ) {
	$post = get_post( $post );

	// Запись не нашлась - возвращаем пустой массив
	if ( ! is_a( $post, 'WP_Post' ) ) {
		return [];
	}

	// Блок "Галерея" не нашелся - возвращаем пустой массив
	if ( ! has_block( 'gallery', $post->post_content ) ) {
		return [];
	}

	// Ищем все блоки в контенте
	$post_blocks = parse_blocks( $post->post_content );

	// Перебираем все блоки в поисках нужного
	foreach ( $post_blocks as $block ) {
		// Ищем блок "Галерея" с переданными ID изображений
		if ( $block['blockName'] === 'core/gallery' && ! empty( $block['attrs']['ids'] ) ) {
			return array_map( function ( $image_id ) {
				// Получаем ссылку на оригинал изображения
				return wp_get_attachment_image_url( $image_id, 'full' );
			}, $block['attrs']['ids'] );
		}
	}

	// Если блок "Галерея" не нашелся - возвращаем пустой массив
	return [];
}

Заметки

  • Смотрите: get_post_gallery()

Список изменений

С версии 3.6.0 Введена.

Код get post gallery images: wp-includes/media.php WP 5.5

<?php
function get_post_gallery_images( $post = 0 ) {
	$gallery = get_post_gallery( $post, false );
	return empty( $gallery['src'] ) ? array() : $gallery['src'];
}

Cвязанные функции

Из метки: gallery (галереи)

8 комментов
  • Андрей

    На странице есть шорткод

    <?php echo do_shortcode('[fancyLic]') ;?>

    В functions.php

    function shortcode_fancyLic() {
    	ob_start();
    	get_template_part( 'templates/shortcodes/fancyLic' );
    	return ob_get_clean();
    }
    add_shortcode( 'fancyLic', 'shortcode_fancyLic' );

    В файле fancyLic.php

    <?php 
    
    $post = get_post( 123 );
    
    $gal = get_post_gallery_images($post);
    
    print_r($gal)
    
    ?>

    В итоге получаю пустой массив и ничего выводится.. почему? sad

    WordPress 5.3.2

    Ответить5 мес назад #
    • Kama7770

      Галереи в посте нет значит unknw

      Ответить5 мес назад #
      • Андрей

        Спасибо за ответ smile
        Но галерея есть....

        Ответить5 мес назад #
        • @ campusboy3554 www.youtube.com/c/wpplus

          Эта галерея создана в Гутенберге? Если да, то смотри какой код генерируется (пример с моего тестового сайта, галерея из 2 картинок):

          <!-- wp:gallery {"ids":[520,519]} -->
          <figure class="wp-block-gallery columns-2 is-cropped">
          	<ul class="blocks-gallery-grid">
          		<li class="blocks-gallery-item">
          			<figure>
          				<img src="http://wp-test.ru/wp-content/uploads/2019/11/111111111-1024x640.jpg" alt="" data-id="520" data-full-url="http://wp-test.ru/wp-content/uploads/2019/11/111111111-e1574592222190.jpg" data-link="http://wp-test.ru/111111111/" class="wp-image-520"/>
          			</figure>
          		</li>
          		<li class="blocks-gallery-item">
          			<figure>
          				<img src="http://wp-test.ru/wp-content/uploads/2019/11/senner-tuning-audi-r8-02-1024x547.jpg" alt="" data-id="519" data-full-url="http://wp-test.ru/wp-content/uploads/2019/11/senner-tuning-audi-r8-02-scaled.jpg" data-link="http://wp-test.ru/senner-tuning-audi-r8/" class="wp-image-519"/>
          				<figcaption class="blocks-gallery-item__caption">Senner Tuning Audi R8</figcaption>
          			</figure>
          		</li>
          	</ul>
          </figure>
          <!-- /wp:gallery -->

          То есть шорткода "Галерея" в привычном его понимании и тот, который ищет функция get_post_gallery_images() - его в контенте и нет.

          1
          Ответить5 мес назад #
          • Андрей

            Спасибо! Да код аналогичный у меня. А как отсюда id или src достать?

            Ответить5 мес назад #
            • @ campusboy3554 www.youtube.com/c/wpplus

              Если бы я знал ответ на этот вопрос, то дал бы его сразу))

              Нашёл тикет в ядре по этому вопросу, в будущих версиях в эту функцию добавят поддержку галерей Гутенберга, но когда - большой вопрос.

              1
              Ответить5 мес назад #
            • @ campusboy3554 www.youtube.com/c/wpplus

              Дописал здесь пример #2, посмотри.

              1
              Ответить5 мес назад #