wp_back/wp-content/plugins/visual-portfolio/classes/class-sitemap.php
2024-05-20 15:37:46 +03:00

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