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();
|