get_post_galleries()WP 3.6.0

Retrieves galleries from the passed post's content.

1 time — 0.009364 sec (very slow) | 50000 times — 538.27 sec (extremely slow) | PHP 7.0.4, WP 4.4.2
Hooks from the function

Return

Array. A list of arrays, each containing gallery data and srcs parsed from the expanded shortcode.

Usage

get_post_galleries( $post, $html );
$post(int|WP_Post) (required)
Post ID or object.
$html(true|false)
Whether to return HTML or data in the array.
Default: true

Examples

0

#1 Get all the gallery posts 2179

This example shows how the function works. It is assumed that there are 2 galleries in the text of post 2179 - 2 shortcodes [gallery]:

$gal = get_post_galleries(2179, false);

/* $gal will be equal to
Array
(
	[0] => Array
		(
			[ids] => 6790,6789,6788
			[src] => 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
				)

		)

	[1] => Array
		(
			[ids] => 6762,6761,6760
			[src] => Array
				(
					[0] => http://wp-kama.ru/wp-content/uploads/2016/02/image008-80x80.jpg
					[1] => http://wp-kama.ru/wp-content/uploads/2016/02/image007-80x80.jpg
					[2] => http://wp-kama.ru/wp-content/uploads/2016/02/image006-80x80.jpg
				)

		)

)
*/

$gal = get_post_galleries(25, true);

/*$gal will be equal to
Array
(
	[0] => <div id='gallery-3' class='gallery galleryid-19 gallery-columns-3 gallery-size-thumbnail'><figure class='gallery-item'>
			<div class='gallery-icon landscape'>
				<a href='/article/sajt-na-konstruktore-wix/image12'><img width="80" height="80" src="/wp-content/uploads/2016/02/image12-80x80.png" class="attachment-thumbnail size-thumbnail" alt="image12" /></a>
			</div></figure><figure class='gallery-item'>
			<div class='gallery-icon landscape'>
				<a href='/article/sajt-na-konstruktore-wix/image11'><img width="80" height="80" src="/wp-content/uploads/2016/02/image11-80x80.png" class="attachment-thumbnail size-thumbnail" alt="image11" /></a>
			</div></figure><figure class='gallery-item'>
			<div class='gallery-icon landscape'>
				<a href='/article/sajt-na-konstruktore-wix/image10'><img width="80" height="80" src="/wp-content/uploads/2016/02/image10-80x80.png" class="attachment-thumbnail size-thumbnail" alt="image10" /></a>
			</div></figure>
		</div>

	[1] => <div id='gallery-4' class='gallery galleryid-19 gallery-columns-3 gallery-size-thumbnail'><figure class='gallery-item'>
			<div class='gallery-icon landscape'>
				<a href='/article/sajt-na-konstruktore-wix/image008'><img width="80" height="80" src="/wp-content/uploads/2016/02/image008-80x80.jpg" class="attachment-thumbnail size-thumbnail" alt="image008" /></a>
			</div></figure><figure class='gallery-item'>
			<div class='gallery-icon landscape'>
				<a href='/article/sajt-na-konstruktore-wix/image007'><img width="80" height="80" src="/wp-content/uploads/2016/02/image007-80x80.jpg" class="attachment-thumbnail size-thumbnail" alt="image007" /></a>
			</div></figure><figure class='gallery-item'>
			<div class='gallery-icon landscape'>
				<a href='/article/sajt-na-konstruktore-wix/image006'><img width="80" height="80" src="/wp-content/uploads/2016/02/image006-80x80.jpg" class="attachment-thumbnail size-thumbnail" alt="image006" /></a>
			</div></figure>
		</div>

)
*/

Changelog

Since 3.6.0 Introduced.

get_post_galleries() code WP 6.6.2

function get_post_galleries( $post, $html = true ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return array();
	}

	if ( ! has_shortcode( $post->post_content, 'gallery' ) && ! has_block( 'gallery', $post->post_content ) ) {
		return array();
	}

	$galleries = array();
	if ( preg_match_all( '/' . get_shortcode_regex() . '/s', $post->post_content, $matches, PREG_SET_ORDER ) ) {
		foreach ( $matches as $shortcode ) {
			if ( 'gallery' === $shortcode[2] ) {
				$srcs = array();

				$shortcode_attrs = shortcode_parse_atts( $shortcode[3] );

				// Specify the post ID of the gallery we're viewing if the shortcode doesn't reference another post already.
				if ( ! isset( $shortcode_attrs['id'] ) ) {
					$shortcode[3] .= ' id="' . (int) $post->ID . '"';
				}

				$gallery = do_shortcode_tag( $shortcode );
				if ( $html ) {
					$galleries[] = $gallery;
				} else {
					preg_match_all( '#src=([\'"])(.+?)\1#is', $gallery, $src, PREG_SET_ORDER );
					if ( ! empty( $src ) ) {
						foreach ( $src as $s ) {
							$srcs[] = $s[2];
						}
					}

					$galleries[] = array_merge(
						$shortcode_attrs,
						array(
							'src' => array_values( array_unique( $srcs ) ),
						)
					);
				}
			}
		}
	}

	if ( has_block( 'gallery', $post->post_content ) ) {
		$post_blocks = parse_blocks( $post->post_content );

		while ( $block = array_shift( $post_blocks ) ) {
			$has_inner_blocks = ! empty( $block['innerBlocks'] );

			// Skip blocks with no blockName and no innerHTML.
			if ( ! $block['blockName'] ) {
				continue;
			}

			// Skip non-Gallery blocks.
			if ( 'core/gallery' !== $block['blockName'] ) {
				// Move inner blocks into the root array before skipping.
				if ( $has_inner_blocks ) {
					array_push( $post_blocks, ...$block['innerBlocks'] );
				}
				continue;
			}

			// New Gallery block format as HTML.
			if ( $has_inner_blocks && $html ) {
				$block_html  = wp_list_pluck( $block['innerBlocks'], 'innerHTML' );
				$galleries[] = '<figure>' . implode( ' ', $block_html ) . '</figure>';
				continue;
			}

			$srcs = array();

			// New Gallery block format as an array.
			if ( $has_inner_blocks ) {
				$attrs = wp_list_pluck( $block['innerBlocks'], 'attrs' );
				$ids   = wp_list_pluck( $attrs, 'id' );

				foreach ( $ids as $id ) {
					$url = wp_get_attachment_url( $id );

					if ( is_string( $url ) && ! in_array( $url, $srcs, true ) ) {
						$srcs[] = $url;
					}
				}

				$galleries[] = array(
					'ids' => implode( ',', $ids ),
					'src' => $srcs,
				);

				continue;
			}

			// Old Gallery block format as HTML.
			if ( $html ) {
				$galleries[] = $block['innerHTML'];
				continue;
			}

			// Old Gallery block format as an array.
			$ids = ! empty( $block['attrs']['ids'] ) ? $block['attrs']['ids'] : array();

			// If present, use the image IDs from the JSON blob as canonical.
			if ( ! empty( $ids ) ) {
				foreach ( $ids as $id ) {
					$url = wp_get_attachment_url( $id );

					if ( is_string( $url ) && ! in_array( $url, $srcs, true ) ) {
						$srcs[] = $url;
					}
				}

				$galleries[] = array(
					'ids' => implode( ',', $ids ),
					'src' => $srcs,
				);

				continue;
			}

			// Otherwise, extract srcs from the innerHTML.
			preg_match_all( '#src=([\'"])(.+?)\1#is', $block['innerHTML'], $found_srcs, PREG_SET_ORDER );

			if ( ! empty( $found_srcs[0] ) ) {
				foreach ( $found_srcs as $src ) {
					if ( isset( $src[2] ) && ! in_array( $src[2], $srcs, true ) ) {
						$srcs[] = $src[2];
					}
				}
			}

			$galleries[] = array( 'src' => $srcs );
		}
	}

	/**
	 * Filters the list of all found galleries in the given post.
	 *
	 * @since 3.6.0
	 *
	 * @param array   $galleries Associative array of all found post galleries.
	 * @param WP_Post $post      Post object.
	 */
	return apply_filters( 'get_post_galleries', $galleries, $post );
}