3

I have a site where I created a page that takes the gallery images from a post and puts them into a slider.

I used the following code:

// gets the gallery info
$gallery = get_post_gallery( $post->ID, false );
// makes an array of image ids
$ids = explode ( ",", $gallery['ids'] );

Then I inserted the images using wp_get_attachment_image().

Unfortunately, with WP 5.0 and Gutenberg, get_post_gallery no longer works with newly added content. It seems that get_post_gallery used a shortcode that no longer works with Gutenberg.

I am still getting up to speed on Gutenberg and the block system. Until I understand that all better, I was wondering if anyone has any advice on how to get the image ids from a gallery in Gutenberg?

1

The get_post_gallery() is a wrapper for get_post_galleries() that has an open ticket #43826 for gallery blocks support. This is currently set to the 5.1 milestone, but it might change.

You can even look at the proposed patches, that uses e.g. parse_blocks( $post->post_content ) and has_block( 'gallery', $post->post_content ) , to get an idea what's needed to fully support this.

In the meanwhile you could look into the render_block filter to modify the rendered output of gallery blocks to your needs.

Here's an example that targets the core/gallery block and uses the block attribute containing the gallery image IDs:

/**
 * Modify the output of the rendered core/gallery block.
 */
add_filter( 'render_block', function( $block_content, $block ) {
    if ( 'core/gallery' !== $block['blockName'] || ! isset( $block['attrs']['ids'] ) ) {
           return $block_content;
    }
    $li = '';
    foreach( (array) $block['attrs']['ids'] as $id ) {
        $li .= sprintf( '<li>%s</li>', wp_get_attachment_image( $id, 'large' ) );
    }
    return sprintf( '<ul>%s</ul>', $li ); 
}, 10, 2 );
0

Using birgire's suggestions, I came up with the following solution that is working well with both the old pre-WP 4.x data and the newer posts that have been added under 5.0.

// if there is a gallery block do this
if (has_block('gallery', $post->post_content)) {
    $post_blocks = parse_blocks($post->post_content);
    $ids = $post_blocks[0][attrs][ids];
} 
// if there is not a gallery block do this
else {
    // gets the gallery info
    $gallery = get_post_gallery( $post->ID, false );
    // makes an array of image ids
    $ids = explode ( ",", $gallery['ids'] );
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.