How to create a Custom Provider for XML Sitemaps in WordPress 5.5

20 Jun 2020 20:27 | Geplaatst door Marcel |

WordPress 5.5 will be released in August 2020 and the feature plugin for XML Sitemaps has been merged this June. You can read about the original proposal on the development blog make/core.

This feature generates a `sitemap.xml` in the document root to make it more easy for search engines to index your website.
It will list all pages, posts, tags, categories and users. It also includes support for Custom Post Types and Custom Taxonomies. You can also extend it to index custom datatypes. That could be from a custom plugin that uses its own database table and its own functions to display that.

This blogpost is about creating a custom provider for your own data.
Please understand that for custom post types or taxonomies you don’t have to do anything.

First you create a custom provider, that will generate pagination and the url_list.

/**
 * Get set of sitemap link data.
 *
 * @since 5.5.0 (use your plugin version)
 */
if ( class_exists( 'WP_Sitemaps_Provider' ) ) {

class WP_Sitemaps_My_Plugin extends WP_Sitemaps_Provider {

	/**
	 * WP_Sitemaps_My_Plugin constructor.
	 *
	 * @since 5.5.0 (use your plugin version)
	 */
	public function __construct() {
		// Use ofcourse your own names here.
		$this->name        = 'plugin_prefix';
		$this->object_type = 'plugin_prefix';
	}


	/**
	 * Gets a URL list for a sitemap.
	 *
	 * @since 5.5.0 (use your plugin version)
	 *
	 * @param int    $page_num       Page of results.
	 * @param string $object_subtype Optional. Default empty.
	 *
	 * @return array $url_list Array of URLs for a sitemap. 
	 */
	public function get_url_list( $page_num, $object_subtype = '' ) {
		// use a function from your plugin to fetch this data
		$pages = plugin_prefix_get_url_list();

		$url_list = array();
		foreach ( $pages as $page ) {

			// No need to add 'lastmod', it is only a hint to search engines.
			$sitemap_entry = array(
				'loc'     => $page,
			);

			$url_list[] = $sitemap_entry;
		}

		return $url_list;

	}


	/**
	 * Gets the max number of pages available for the object type.
	 *
	 * @since 5.5.0 (use your plugin version)
	 *
	 * @see WP_Sitemaps_Provider::max_num_pages
	 *
	 * @param string $object_subtype Optional. Default empty.
	 *
	 * @return int Total page count.
	 */
	public function get_max_num_pages( $object_subtype = '' ) {
		// again, use a function from your own plugin to fetch this data.
		$pages = plugin_prefix_get_my_pagination();

		return count( $pages );

	}
}
}

This is all for the Custom Provider that you need. I do hope you understand that you need to code your own pagination and your list of urls :)

Now to integrate it with the Sitemaps in WordPress 5.5 you can use 2 ways.
First option is to use a filter and add the instance of your Provider class.

function plugin_prefix_wp_sitemaps_register_providers( $providers ) {

	if ( class_exists( 'WP_Sitemaps_Provider' ) ) {
		$provider = new WP_Sitemaps_My_Plugin();
		$providers['plugin_prefix'] = $provider;
	}

	return $providers;

}
add_filter( 'wp_sitemaps_register_providers' , 'plugin_prefix_wp_sitemaps_register_providers' );

The other option is to call a procedural function call in an action hook.

function plugin_prefix_wp_sitemaps_register_providers() {

	if ( function_exists('wp_register_sitemap') && class_exists( 'WP_Sitemaps_Provider' ) ) {
		$provider = new WP_Sitemaps_My_Plugin();
		wp_register_sitemap( 'plugin_prefix', $provider );
	}

}
add_action( 'init', 'plugin_prefix_wp_sitemaps_register_providers' );

Both these hooks to register your custom provider should end up the same.