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.
274 lines
6.3 KiB
PHTML
274 lines
6.3 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* The Sitemap module - HTML Sitemap feature.
|
||
|
*
|
||
|
* @since 1.0.104
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\Sitemap
|
||
|
* @author Rank Math <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMath\Sitemap\Html;
|
||
|
|
||
|
use RankMath\Helper;
|
||
|
use RankMath\Sitemap\Providers\Taxonomy;
|
||
|
use RankMath\Traits\Hooker;
|
||
|
use RankMath\Sitemap\Cache;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Sitemap class.
|
||
|
*/
|
||
|
class Sitemap extends Taxonomy {
|
||
|
|
||
|
use Hooker;
|
||
|
|
||
|
/**
|
||
|
* Generators.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private $generators;
|
||
|
|
||
|
/**
|
||
|
* Cache.
|
||
|
*
|
||
|
* @var object
|
||
|
*/
|
||
|
private $cache;
|
||
|
|
||
|
/**
|
||
|
* Constructor.
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
if ( ! Helper::get_settings( 'sitemap.html_sitemap' ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$this->cache = new Cache();
|
||
|
$this->generators = [
|
||
|
'posts' => new Posts(),
|
||
|
'terms' => new Terms(),
|
||
|
'authors' => new Authors(),
|
||
|
];
|
||
|
|
||
|
$display_mode = Helper::get_settings( 'sitemap.html_sitemap_display' );
|
||
|
if ( 'page' === $display_mode ) {
|
||
|
$this->action( 'the_content', 'show_on_page' );
|
||
|
} elseif ( 'shortcode' === $display_mode ) {
|
||
|
add_shortcode( 'rank_math_html_sitemap', [ $this, 'shortcode' ] );
|
||
|
|
||
|
// Compatibility code for the [aioseo_html_sitemap] shortcode.
|
||
|
add_shortcode( 'aioseo_html_sitemap', [ $this, 'shortcode' ] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the HTML sitemap cache.
|
||
|
*
|
||
|
* @param string $name Name of the cache.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
private function get_cache( $name ) {
|
||
|
if ( true !== \RankMath\Sitemap\Sitemap::is_cache_enabled() ) {
|
||
|
return false;
|
||
|
}
|
||
|
return $this->cache->get_sitemap( $name, 1, true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the HTML sitemap cache.
|
||
|
*
|
||
|
* @param string $name Name of the cache.
|
||
|
* @param string $content Content of the cache.
|
||
|
*/
|
||
|
private function set_cache( $name, $content ) {
|
||
|
$this->cache->store_sitemap( $name, 1, $content, true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get generator.
|
||
|
*
|
||
|
* @param string $generator Generator name.
|
||
|
*
|
||
|
* @return object
|
||
|
*/
|
||
|
private function get_generator( $generator ) {
|
||
|
if ( ! isset( $this->generators[ $generator ] ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return $this->generators[ $generator ];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the HTML sitemap output.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function get_output() {
|
||
|
$post_types = self::get_post_types();
|
||
|
$taxonomies = self::get_taxonomies();
|
||
|
|
||
|
/**
|
||
|
* Filter the setting of excluding empty terms from the XML sitemap.
|
||
|
*
|
||
|
* @param boolean $exclude Defaults to true.
|
||
|
* @param array $taxonomies Array of names for the taxonomies being processed.
|
||
|
*/
|
||
|
|
||
|
$show_dates = Helper::get_settings( 'sitemap.html_sitemap_show_dates' );
|
||
|
$output = [];
|
||
|
|
||
|
$output[] = '<div class="rank-math-html-sitemap">';
|
||
|
foreach ( $post_types as $post_type ) {
|
||
|
$cached = $this->get_cache( $post_type );
|
||
|
if ( ! empty( $cached ) ) {
|
||
|
$output[] = $cached;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$sitemap = $this->get_generator( 'posts' )->generate_sitemap( $post_type, $show_dates );
|
||
|
$this->set_cache( $post_type, $sitemap );
|
||
|
$output[] = $sitemap;
|
||
|
}
|
||
|
|
||
|
if ( ! empty( $taxonomies ) ) {
|
||
|
foreach ( $taxonomies as $taxonomy => $object ) {
|
||
|
|
||
|
$cached = $this->get_cache( $taxonomy );
|
||
|
if ( ! empty( $cached ) ) {
|
||
|
$output[] = $cached;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$hide_empty = ! Helper::get_settings( 'sitemap.tax_' . $taxonomy . '_include_empty' );
|
||
|
$sitemap = $this->get_generator( 'terms' )->generate_sitemap(
|
||
|
$taxonomy,
|
||
|
$show_dates,
|
||
|
[
|
||
|
'hide_empty' => $hide_empty,
|
||
|
'exclude' => wp_parse_id_list( Helper::get_settings( 'sitemap.exclude_terms' ) ),
|
||
|
]
|
||
|
);
|
||
|
$this->set_cache( $taxonomy, $sitemap );
|
||
|
$output[] = $sitemap;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( $this->should_show_author_sitemap() ) {
|
||
|
$cached = $this->get_cache( 'author' );
|
||
|
if ( ! empty( $cached ) ) {
|
||
|
$output[] = $cached;
|
||
|
} else {
|
||
|
$sitemap = $this->get_generator( 'authors' )->generate_sitemap();
|
||
|
$this->set_cache( 'author', $sitemap );
|
||
|
$output[] = $sitemap;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$output[] = '</div>';
|
||
|
|
||
|
return implode( '', $output );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get post types to be included in the HTML sitemap.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_post_types() {
|
||
|
$post_types = [];
|
||
|
foreach ( Helper::get_accessible_post_types() as $post_type ) {
|
||
|
if ( ! Helper::get_settings( "sitemap.pt_{$post_type}_html_sitemap" ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$post_types[] = $post_type;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filter: 'rank_math/sitemap/html_sitemap_post_types' - Allow changing the post types to be included in the HTML sitemap.
|
||
|
*
|
||
|
* @var array $post_types The post types to be included in the HTML sitemap.
|
||
|
*/
|
||
|
return apply_filters( 'rank_math/sitemap/html_sitemap_post_types', $post_types );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if author sitemap should be shown or not.
|
||
|
*/
|
||
|
private function should_show_author_sitemap() {
|
||
|
$show = Helper::get_settings( 'sitemap.authors_html_sitemap' );
|
||
|
if ( ! $show ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$disable_author_archives = Helper::get_settings( 'titles.disable_author_archives' );
|
||
|
if ( $disable_author_archives ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$robots = Helper::get_settings( 'titles.author_robots' );
|
||
|
if ( is_array( $robots ) && in_array( 'noindex', $robots, true ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get taxonomies to be included in the HTML sitemap.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_taxonomies() {
|
||
|
$taxonomies = [];
|
||
|
foreach ( Helper::get_accessible_taxonomies() as $taxonomy ) {
|
||
|
if ( ! Helper::get_settings( "sitemap.tax_{$taxonomy->name}_html_sitemap" ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$taxonomies[ $taxonomy->name ] = $taxonomy;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filter: 'rank_math/sitemap/html_sitemap_taxonomies' - Allow changing the taxonomies to be included in the HTML sitemap.
|
||
|
*
|
||
|
* @var array $taxonomies The taxonomies to be included in the HTML sitemap.
|
||
|
*/
|
||
|
return apply_filters( 'rank_math/sitemap/html_sitemap_taxonomies', $taxonomies );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Show sitemap on a page (after content).
|
||
|
*
|
||
|
* @param mixed $content The page content.
|
||
|
*/
|
||
|
public function show_on_page( $content ) {
|
||
|
if ( ! is_page() ) {
|
||
|
return $content;
|
||
|
}
|
||
|
|
||
|
if ( ! is_main_query() || ! in_the_loop() ) {
|
||
|
return $content;
|
||
|
}
|
||
|
|
||
|
$post_id = get_the_ID();
|
||
|
if ( (int) Helper::get_settings( 'sitemap.html_sitemap_page' ) !== $post_id ) {
|
||
|
return $content;
|
||
|
}
|
||
|
|
||
|
return $content . $this->get_output();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Shortcode callback.
|
||
|
*/
|
||
|
public function shortcode() {
|
||
|
return $this->get_output();
|
||
|
}
|
||
|
}
|