WordPress標準のサイトマップ生成で追加できる項目は「lastmod」「changefreq」「priority」のみ

作成日:

WordPressに標準搭載されるようになったサイトマップXMLファイルを生成するファンクション。標準では「loc(URL)」だけなので、別途テーマ内に「lastmod」「priority」を追加するなどカスマイズをしてきました。
ここで一つ問題が。WordPressを多言語化した際に、複数の言語投稿がそのままサイトマップにリストアップされるのは果たして良いことなのかと調べていたら、Googleの多言語サイト指針の中に、代表URLに対して子要素として各翻訳投稿URLを追加して送ることが可能であるとありました。

favicon
ページのローカライズ版について Google に知らせる - Search Console ヘルプ https://support.google.com/webmasters/answer/189077?hl=ja

サイトマップを使用して、各 URL について言語や地域ごとのすべてのバージョンを Google に知らせることができます。それには、URL ごとに <loc> 要素を追加し、そのページの言語や地域別のバージョンごとに、子エントリ <xhtml:link> をそれぞれ(その URL についても)作成してリストにします。したがって、ページに 3 つのバージョンがある場合、サイトマップには 3 つのエントリを追加し、それぞれに 3 つの同じ子エントリを指定します。

Googleの参考例

HTML
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>http://www.example.com/english/page.html</loc>
    <xhtml:link 
               rel="alternate"
               hreflang="de"
               href="http://www.example.com/deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="de-ch"
               href="http://www.example.com/schweiz-deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="en"
               href="http://www.example.com/english/page.html"/>
  </url>
  <url>
    <loc>http://www.example.com/deutsch/page.html</loc>
    <xhtml:link 
               rel="alternate"
               hreflang="de"
               href="http://www.example.com/deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="de-ch"
               href="http://www.example.com/schweiz-deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="en"
               href="http://www.example.com/english/page.html"/>
  </url>
  <url>
    <loc>http://www.example.com/schweiz-deutsch/page.html</loc>
    <xhtml:link 
               rel="alternate"
               hreflang="de"
               href="http://www.example.com/deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="de-ch"
               href="http://www.example.com/schweiz-deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="en"
               href="http://www.example.com/english/page.html"/>
  </url>
</urlset>

そこで代表URLの子要素に各翻訳投稿URL追加するように試行錯誤していたましたが、うまくいかない。そもそもXMLとして「xhtml:link」が追加されません。

これは
いよいよおかしいぞ。

そこでWordPress本体のサイトマップに関するファイルを探っていたところ、このような関数がありました。

PHP class-wp-sitemaps-render.php
/**
 * Gets XML for a sitemap.
 *
 * @since 5.5.0
 *
 * @param array $url_list Array of URLs for a sitemap.
 * @return string|false A well-formed XML string for a sitemap index. False on error.
 */
public function get_sitemap_xml( $url_list ) {
	$urlset = new SimpleXMLElement(
		sprintf(
			'%1$s%2$s%3$s',
			'<?xml version="1.0" encoding="UTF-8" ?>',
			$this->stylesheet,
			'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" />'
		)
	);

	foreach ( $url_list as $url_item ) {
		$url = $urlset->addChild( 'url' );

		// Add each element as a child node to the <url> entry.
		foreach ( $url_item as $name => $value ) {
			if ( 'loc' === $name ) {
				$url->addChild( $name, esc_url( $value ) );
			} elseif ( in_array( $name, array( 'lastmod', 'changefreq', 'priority' ), true ) ) {
				$url->addChild( $name, esc_xml( $value ) );
			} else {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: %s: List of element names. */
						__( 'Fields other than %s are not currently supported for sitemaps.' ),
						implode( ',', array( 'loc', 'lastmod', 'changefreq', 'priority' ) )
					),
					'5.5.0'
				);
			}
		}
	}

	return $urlset->asXML();
}

そう。
WordPressではサイトマップXMLを生成する際には 追加出来る項目は「lastmod」「changefreq」「priority」のみ で、その他は除外されていることがわかりました。

さて、そうなると子要素として追加するのを諦めて代替手段を探すか、もしくは関数自体を大幅に書き換えるか(出来るのか?)。

物草 灸太郎
物草 灸太郎

WordPressでホームページを制作しつつ、休日は畑を耕したりDIYを楽しんでいます。

Loading...

コメントをどうぞ

  • メールアドレスが公開されることはありません。
  • コメント欄にURLは入力できません。
  • このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。