Google XML SitemapsプラグインのPing送信のバグ?

Google XML Sitemapsプラグイン

Google XML Sitemaps (XML Sitemaps)プラグインはWordPress用のXMLサイトマップ出力プラグインの中でも最も広く使われているものです。このプラグインは基本的には安定して動作しますが、何年かに一度程度、脆弱性が見つかり大騒ぎになることがあります。2022年春にも騒ぎがあり、比較的すぐに修正版がリリースされました。

そのときにはメンテナが変更され、新しい機能が追加されました。Google AnalyticsのTIDの入力が必須になったことが、不信感と新しいバグを生んでしまいました。プラグインの作者は新しいバージョンを出し、問題点を修正したと主張しています。しかし、2022年8月7日時点の最新版 v4.1.5 でも完全には修正されていないと報告されています。XMLサイトマップ出力機能自体は正常に動作していますが、更新通知機能やその結果の表示に問題があるようです。WooCommerce based sitemapについてはv4.1.1で追加されたとされますが、詳細は不明であり、この記事では無視します。

v4.1.3では、GA-TIDを入力しないとプラグインの設定が保存されないという問題がありました。そのため、実質的にGA-TIDに何らかの文字列を入力することが必要でした。この問題は次のバージョンで修正されました。しかし、GA-TID周りで以下のような不具合が残っています。

Google XML Sitemapsプラグインの更新日時通知 1
WordPressの管理パネルにログインし、左列の「設定」から「XML-Sitemap」をクリックします。
中央列の「基本的な設定」の「Notify Google about updates of your site」という項目にチェックが入っていることを確認します。これが「投稿」「固定記事」を公開または更新したときにGoogleに更新を通知する機能のスイッチです。チェックボックスを変更した場合は、ページの一番下にある「更新を設定」をクリックします。
この状態では、新しい「投稿」と「固定記事」を公開したり、既存の「投稿」と「固定記事」を更新することができます。これにより、Google内部に更新が通知され、画面の上部にある「○○に開始されたpingの結果」の日時が公開または更新日時に変更され、検索エンジンに通知された旨が表示されるはずです。しかし、待てど暮せど「通知されました」というメッセージが表示されず、「検索エンジンは通知されていません。あなたのサイトマップを知らせるには投稿を書いてください」というままです。
この状態では、更新を通知する機能が正常に動作していない可能性があります。
「デバッグ機能」をクリックします。

Google XML Sitemapsプラグインの更新日時通知 2
「ズラズラ」と表示されます。サイトマップの量によって異なりますが、ページ全体の中程までスクロールする必要があります。

参考: /wp-content/plugins/google-sitemap-generator/sitemap-core.php の一部
public function init_options() {

        $this->options                       = array();
        $this->options['sm_b_ping']          = true; // Auto ping Google .
        $this->options['sm_b_stats']         = false; // Send anonymous stats .
        $this->options['sm_b_autozip']       = true; // Try to gzip the output .
        $this->options['sm_b_memory']        = ''; // Set Memory Limit (e.g. 16M) .
        $this->options['sm_b_time']          = -1; // Set time limit in seconds, 0 for unlimited, -1 for disabled .
        $this->options['sm_b_style_default'] = true; // Use default style .
        $this->options['sm_b_style']         = ''; // Include a stylesheet in the XML .
        $this->options['sm_b_baseurl']       = ''; // The base URL of the sitemap .
        $this->options['sm_b_robots']        = true; // Add sitemap location to WordPress' virtual robots.txt file .
        $this->options['sm_b_html']          = true; // Include a link to a html version of the sitemap in the XML sitemap .
        $this->options['sm_b_exclude']       = array(); // List of post / page IDs to exclude .
        $this->options['sm_b_exclude_cats']  = array(); // List of post / page IDs to exclude .

        $this->options['sm_in_home']        = true; // Include homepage .
        $this->options['sm_in_posts']       = true; // Include posts .
        $this->options['sm_in_posts_sub']   = false; // Include post pages (<!--nextpage--> tag) .
        $this->options['sm_in_pages']       = true; // Include static pages .
        $this->options['sm_in_cats']        = false; // Include categories .
        $this->options['sm_product_tags']   = true; // Hide product tags in sitemap .
        $this->options['sm_in_product_cat'] = true; // Include product categories .
        $this->options['sm_in_arch']        = false; // Include archives .
        $this->options['sm_in_auth']        = false; // Include author pages .
        $this->options['sm_in_tags']        = false; // Include tag pages .
        $this->options['sm_in_tax']         = array(); // Include additional taxonomies .
        $this->options['sm_in_customtypes'] = array(); // Include custom post types .
        $this->options['sm_in_lastmod']     = true; // Include the last modification date .
        $this->options['sm_b_sitemap_name'] = 'sitemap'; // Name of custom sitemap.
        $this->options['sm_cf_home']        = 'daily'; // Change frequency of the homepage .
        $this->options['sm_cf_posts']       = 'monthly'; // Change frequency of posts .
        $this->options['sm_cf_pages']       = 'weekly'; // Change frequency of static pages .
        $this->options['sm_cf_cats']        = 'weekly'; // Change frequency of categories .
        $this->options['sm_cf_product_cat'] = 'weekly'; // Change frequency of categories .
        $this->options['sm_cf_auth']        = 'weekly'; // Change frequency of author pages .
        $this->options['sm_cf_arch_curr']   = 'daily'; // Change frequency of the current archive (this month) .
        $this->options['sm_cf_arch_old']    = 'yearly'; // Change frequency of older archives .
        $this->options['sm_cf_tags']        = 'weekly'; // Change frequency of tags .

        $this->options['sm_pr_home']        = 1.0; // Priority of the homepage .
        $this->options['sm_pr_posts']       = 0.6; // Priority of posts (if auto prio is disabled) .
        $this->options['sm_pr_posts_min']   = 0.2; // Minimum Priority of posts, even if autocalc is enabled .
        $this->options['sm_pr_pages']       = 0.6; // Priority of static pages .
        $this->options['sm_pr_cats']        = 0.3; // Priority of categories .
        $this->options['sm_pr_product_cat'] = 0.3; // Priority of categories .
        $this->options['sm_pr_arch']        = 0.3; // Priority of archives .
        $this->options['sm_pr_auth']        = 0.3; // Priority of author pages .
        $this->options['sm_pr_tags']        = 0.3; // Priority of tags .

        $this->options['sm_i_donated']           = false; // Did you donate? Thank you! :) .
        $this->options['sm_i_hide_donated']      = false; // And hide the thank you.. .
        $this->options['sm_i_install_date']      = time(); // The installation date .
        $this->options['sm_i_hide_survey']       = false; // Hide the survey note .
        $this->options['sm_i_hide_note']         = false; // Hide the note which appears after 30 days .
        $this->options['sm_i_hide_works']        = false; // Hide the 'works?' message which appears after 15 days .
        $this->options['sm_i_hide_donors']       = false; // Hide the list of donations .
        $this->options['sm_i_hash']              = substr( sha1( sha1( get_bloginfo( 'url' ) ) ), 0, 20 ); // Partial hash for GA stats, NOT identifiable! .
        $this->options['sm_i_tid']               = '';
        $this->options['sm_i_lastping']          = 0; // When was the last ping .
        $this->options['sm_i_supportfeed']       = true; // shows the support feed .
        $this->options['sm_i_supportfeed_cache'] = 0; // Last refresh of support feed .
        $this->options['sm_links_page']          = 10; // Link per page support with default value 10. .
    }

Google XML Sitemapsプラグインの更新日時通知 3
「Sitemap Config」の「sm_b_ping」は、更新日時を検索エンジンに通知する機能です。もし「1」が設定されている場合は、オンになっています。また、「sm_i_tid」はGoogle AnalyticsのTIDの値で、本来はGoogleへの更新通知には関係ありませんが、この記事では関係があるため、覚えておく必要があります。さらに、下部にある「sm_i_lastping」は、最新のping送信日時であり、最も直近に検索エンジンにXMLサイトマップの更新日時を通知した日時を示します。画像のように、TIDが空で、ping送信日時も空欄となっています。

Google XML Sitemapsプラグインの更新日時通知 4
再度XML Sitemapsプラグインの設定画面に移動します。
通常は関係のないはずの「基本設定」内の「Add Google Analytics TID」というテキストボックスに、所持しているGoogle AnalyticsのTIDを入力します。2022年春までの場合は、多くの場合「UA-XXXXXXXXX-1」というIDが使われており、Analytics 4プロパティに変更された場合は"G-英数字"が使用されます。ただし、XML Sitemapsで通常のサイトマップの出力機能を使用し、更新日時を通知する(Ping送信)だけであれば、この情報は不要です。ここでは、簡単な数字を入力すれば十分です。たとえば、「1」と入力してください。入力したら、ページの最下部にある「更新を設定」をクリックします。

Google XML Sitemapsプラグインの更新日時通知 5
ページの上部に「設定を更新しました」というメッセージが表示されていることを確認してください。
その下にある「○○○に開始されたpingの結果」に表示されるのは、最後に投稿または固定ページを公開/更新した日時です。したがって、これは設定変更前と同じであるはずです。さらにその下には、「Googleは変更について正しく通知されました」と表示されます。先ほどはこの日時にはPing送信が「通知されていません」と表示されていましたが、今度は真逆の「通知されました」と表示されています。どちらが正しいのでしょうか?とても混乱しますね。

Google XML Sitemapsプラグインの更新日時通知 6
再び、「デバッグ機能」をクリックしました。
すると、GoogleアナリティクスのTID欄に入力した値が「sm_i_tid」として表示された。(正常)
しかし、「sm_i_lastping」欄は依然として「空」のままでした。「通知されました」という表示が正しければ、この欄にはその日時の値が入っているはずであるが、なぜ入っていないのだろうか。

Google XML Sitemapsプラグインの更新日時通知 7
ここで、「投稿」または「固定記事」の1つを編集して保存しました。これで更新日時の表示が変わる筈です。
上の画像では、「○○○に開始されたpingの結果」の日時表示が更新日時に変わりました。(想定通りです)

Google XML Sitemapsプラグインの更新日時通知 8
今回は、数字が10桁並んだ「sm_i_lastping」という項目に値が入りました。このような数字は通常、UNIX時間を表しています。この数字を日時形式に変換すると、1つ前の画面に表示された日時とおよそ一致することがわかりました。
「sm_i_lastping」には値が表示されており、これはバグではなく正常に機能していると考えられます。つまり、TIDを入力する前にPing送信はできていなかったということになるでしょうか?

画像はありませんが、XML Sitemapsの設定画面に戻り、TIDを削除して「設定を更新」(保存)しました。
その後、「デバッグ機能」を表示すると、今度は「sm_i_tid」も「sm_i_lastping」も空になっていることが確認できました。これにより、TIDが空でない状態で「投稿」「固定記事」を更新すると、「sm_i_lastping」に値が表示されることがわかりました。ただし、この動作ではTIDの有無にかかわらず、実際にPing送信されたかどうかを判断することはできないかもしれません。

ここまで確認したところ、Ping送信をする場合、TIDを入力する必要があるかどうかは不明です。作者またはメンテナーはv4.1.3でTIDの値を必須からオプションに変更したと主張していますが、それが正しいかどうかはわかりません。Ping送信のデバッグログがないと確認できません。
ただし、Ping送信を行いたい場合は、TIDに何かしらの値を入れておけばよいことが判明しました。したがって、この記事のように「1」と入力しておけばよいと思われます。

GitHubのGoogle XML Sitemapsプラグインのソースの変更履歴を確認したところ、Ping送信でTIDの入力を必須としないための修正が2022年6月13日に行われています。プラグインの最新版であるv4.1.5は2022年8月にリリースされましたが、その修正は含まれていないようです。「残念」です。

XML SitemapsプラグインのPing送信は、記事を公開や更新した時にその記事のURLを伝えるIndexNowのようなものではなく、単に「(変化があったことを伝える意図で)サイトマップのURLをGoogleに通知」するだけのものです。この機能は必須ではありません。
GoogleはPing送信を受けて、送信されたURLのサイトマップを取得して、そこに書かれている各リンクURLのlastmodの日時を見ているかは不明ですが記事の登録または更新の直近のものを認識し、記事をクローラーが見に来ます。ウェブサイトのオーナーとしては、できるだけ早くサイトマップを読みに来てもらい、クローラーが来てコンテンツを取り込み、検索インデックスに登録されるようにしたいと思うのは共通の思いです。

XMLサイトマップをGoogle Search Consoleに登録後、サイトマップの読み込み頻度や、クローラーがコンテンツを取り込むまでの早さ、そしてクローラーが来た後に検索インデックスに登録されるまでの早さは、ウェブサイトによって優先度が異なるようです。ページ数が多くてコンテンツの追加や更新が頻繁で、閲覧数が多いサイトほど、クローラーも早く来て検索インデックスに登録されるのが早いです。一方、開設から半年に満たないウェブサイトや、Google Search Consoleに登録したばかりで、XMLサイトマップを登録してから間もないウェブサイトは、URLを送信しても何日もクローラーが来ず、なかなか検索インデックスに登録されないことがあります。

最後に、Google XML Sitemapsプラグインを使う場合は自分自身のサイトのドメインの後ろに「/sitemap.xml」を付けたURLをブラウザで表示すると、サイトマップの出力機能が正常に機能しているかを確認することができます。Google XML Sitemapsプラグインはカテゴリ関係でマイナーバグが報告されているようですが、メインのXMLサイトマップ表示部分にはバグらしい動作はないようです。
XMLサイトマップが正常に表示されるなら「Google XML Sitemapsプラグインが原因でインデックス登録されない」という結論にはなりえません。
XMLサイトマップの作成、XMLサイトマップのPing送信、クロール、検索エンジンへの登録は、それぞれ異なる話題であり、これらを混同すると解決できる問題も解決できなくなる可能性があります。特にネットで騒ぐことで他の人を混乱させることががあるため、ご注意ください。

関連記事: