You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
3.5 KiB
PHP

<?php
/**
* WooCommerce product sitemaps adjustments.
*
* @since 1.0.32
* @package RankMath
* @subpackage RankMath\WooCommerce
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\WooCommerce;
use RankMath\Helper;
use RankMath\Helpers\Str;
use RankMath\Helpers\Attachment;
defined( 'ABSPATH' ) || exit;
/**
* WC Sitemap class.
*/
class Sitemap {
/**
* Register hooks.
*/
public function sitemap() {
$this->filter( 'rank_math/sitemap/exclude_post_type', 'sitemap_exclude_post_type', 10, 2 );
$this->filter( 'rank_math/sitemap/post_type_archive_link', 'sitemap_taxonomies', 10, 2 );
$this->filter( 'rank_math/sitemap/post_type_archive_link', 'sitemap_post_type_archive_link', 10, 2 );
$this->filter( 'rank_math/sitemap/urlimages', 'add_product_images_to_xml_sitemap', 10, 2 );
}
/**
* Make sure product variations and shop coupons are not included in the XML sitemap.
*
* @param bool $bool Whether or not to include this post type in the XML sitemap.
* @param string $post_type The post type of the post.
*
* @return bool
*/
public function sitemap_exclude_post_type( $bool, $post_type ) {
if ( in_array( $post_type, [ 'product_variation', 'shop_coupon' ], true ) ) {
return true;
}
return $bool;
}
/**
* Make sure product attribute taxonomies are not included in the XML sitemap.
*
* @param bool $bool Whether or not to include this post type in the XML sitemap.
* @param string $taxonomy The taxonomy to check against.
*
* @return bool
*/
public function sitemap_taxonomies( $bool, $taxonomy ) {
if ( in_array( $taxonomy, [ 'product_type', 'product_shipping_class', 'shop_order_status' ], true ) ) {
return true;
}
if ( Str::starts_with( 'pa_', $taxonomy ) ) {
return true;
}
return $bool;
}
/**
* Filters the archive link on the product sitemap.
*
* @param string $link The archive link.
* @param string $post_type The post type to check against.
*
* @return bool
*/
public function sitemap_post_type_archive_link( $link, $post_type ) {
if ( 'product' !== $post_type || ! function_exists( 'wc_get_page_id' ) ) {
return $link;
}
$shop_page_id = wc_get_page_id( 'shop' );
$home_page_id = (int) get_option( 'page_on_front' );
if ( 1 > $shop_page_id || 'publish' !== get_post_status( $shop_page_id ) || $home_page_id === $shop_page_id ) {
return false;
}
$robots = Helper::get_post_meta( 'robots', $shop_page_id );
if ( ! empty( $robots ) && is_array( $robots ) && in_array( 'noindex', $robots, true ) ) {
return false;
}
return $link;
}
/**
* Add the product gallery images to the XML sitemap.
*
* @param array $images The array of images for the post.
* @param int $post_id The ID of the post object.
*
* @return array
*/
public function add_product_images_to_xml_sitemap( $images, $post_id ) {
if ( metadata_exists( 'post', $post_id, '_product_image_gallery' ) ) {
$product_gallery = get_post_meta( $post_id, '_product_image_gallery', true );
$attachments = array_filter( explode( ',', $product_gallery ) );
foreach ( $attachments as $attachment_id ) {
$image_src = wp_get_attachment_image_src( $attachment_id, 'full' );
if ( empty( $image_src ) ) {
continue;
}
$image = [
'src' => $this->do_filter( 'sitemap/xml_img_src', $image_src[0], $post_id ),
'title' => get_the_title( $attachment_id ),
'alt' => Attachment::get_alt_tag( $attachment_id ),
];
$images[] = $image;
unset( $image, $image_src );
}
}
return $images;
}
}