156 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Supported Images in Sitemap (SEO).
 | |
|  *
 | |
|  * @package visual-portfolio/sitemap
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Visual_Portfolio_Sitemap class
 | |
|  */
 | |
| class Visual_Portfolio_Sitemap {
 | |
| 	/**
 | |
| 	 * Visual_Portfolio_Sitemap constructor.
 | |
| 	 */
 | |
| 	public function __construct() {
 | |
| 		add_filter( 'aioseo_sitemap_posts', array( $this, 'add_images_to_aioseo_sitemap' ), 10, 1 );
 | |
| 		add_filter( 'rank_math/sitemap/urlimages', array( $this, 'add_images_to_sitemap' ), 10, 2 );
 | |
| 		add_filter( 'wpseo_sitemap_urlimages', array( $this, 'add_images_to_sitemap' ), 10, 2 );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Add sitemap entries for All In One SEO.
 | |
| 	 *
 | |
| 	 * @param array $entries - Sitemap entries.
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function add_images_to_aioseo_sitemap( $entries ) {
 | |
| 		if ( is_array( $entries ) ) {
 | |
| 			foreach ( $entries as &$entry ) {
 | |
| 				$post_permalink = $entry['loc'];
 | |
| 				$post_id        = url_to_postid( $post_permalink );
 | |
| 				$images         = isset( $entry['images'] ) ? $entry['images'] : array();
 | |
| 
 | |
| 				if ( 0 === $post_id ) {
 | |
| 					$archive_page = Visual_Portfolio_Settings::get_option( 'portfolio_archive_page', 'vp_general' );
 | |
| 
 | |
| 					if ( get_permalink( $archive_page ) === $post_permalink ) {
 | |
| 						$post_id = $archive_page;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				$block_images = $this->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();
 |