parse_images_from_blocks( $post_id ); if ( ! empty( $block_images ) ) { foreach ( $block_images as $image ) { $images[] = (object) array( 'image:loc' => $image['src'], 'image:caption' => $image['alt'], 'image:title' => $image['title'], ); } } $entry['images'] = $images; } } return $entries; } /** * Add sitemap images for Rank Math and Yoast SEO. * * @param array $images - Sitemap Images for current Post. * @param int $post_id - Post ID. * @return array */ public function add_images_to_sitemap( $images, $post_id ) { $block_images = $this->parse_images_from_blocks( $post_id ); if ( ! empty( $block_images ) ) { $images = array_merge( $images, $block_images ); } return $images; } /** * Parse block images. * * @param int $post_id - Post ID. * @return array */ private function parse_images_from_blocks( $post_id ) { $block_images = array(); if ( $post_id > 0 ) { $post = get_post( $post_id ); $content_post = $post->post_content; $parse_blocks = parse_blocks( $content_post ); if ( ! empty( $parse_blocks ) && is_array( $parse_blocks ) ) { foreach ( $parse_blocks as $block ) { if ( 'visual-portfolio/block' === $block['blockName'] || 'visual-portfolio/saved' === $block['blockName'] || 'nk/visual-portfolio' === $block['blockName'] ) { $options = Visual_Portfolio_Get::get_options( $block['attrs'] ); switch ( $options['content_source'] ) { case 'post-based': if ( isset( $options['posts_source'] ) ) { $query_opts = Visual_Portfolio_Get::get_query_params( $options, false, $options['id'] ); $portfolio_query = new WP_Query( $query_opts ); if ( isset( $portfolio_query ) ) { while ( $portfolio_query->have_posts() ) { $portfolio_query->the_post(); $image_id = apply_filters( 'vpf_parse_sitemap_image_id_from_blocks', 'attachment' === get_post_type() ? get_the_ID() : get_post_thumbnail_id( get_the_ID() ), get_the_ID() ); $image_alt = get_post_meta( $image_id, '_wp_attachment_image_alt', true ); $block_images[] = array( 'src' => wp_get_attachment_image_url( $image_id, 'full' ), 'alt' => $image_alt, 'title' => get_the_title( $image_id ), ); } $portfolio_query->reset_postdata(); // Sometimes, when we use WPBakery Page Builder, without this reset output is wrong. wp_reset_postdata(); } } break; case 'images': if ( isset( $options['images'] ) ) { foreach ( $options['images'] as $image ) { $image_id = $image['id']; $image_alt = $image['description'] ?? get_post_meta( $image_id, '_wp_attachment_image_alt', true ) ?? ''; $image_title = $image['title'] ?? get_the_title( $image_id ); $image_url = $image['imgUrl'] ?? wp_get_attachment_image_url( $image_id, 'full' ); $block_images[] = array( 'src' => $image_url, 'alt' => $image_alt, 'title' => $image_title, ); } } break; } } } } } return apply_filters( 'vpf_parse_sitemap_images_from_blocks', $block_images, $post_id ); } } new Visual_Portfolio_Sitemap();