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

Google XML Sitemapsプラグイン

Google XML Sitemaps (XML Sitemaps / XML Sitemap Generator for WorePress)プラグインはWordPress用のSitemap出力プラグインとしては最もメジャーです。ときどき(何年かに1度程度)脆弱性が見つかって大騒ぎになりますが基本的には安定して動作します。2022年春にも脆弱性で一時的に非公開になり、比較的すぐに修正版がリリースされました。
そのときにメンテナが変わったのと追加機能とGoogle AnalyticsのTIDの入力を必須にしたことが不信感と新たなバグを生んでしまいました。作者(メンテナ)の人は新しいバージョンを出しては問題点は修正したと主張するのですが、この記事を書いている2022年8月7日時点の最新版 v4.1.5 でも完全には直っていません。ただし、WordPress用サイトマップ出力機能自体は正常のようです。問題なのは更新通知機能かその結果の表示部分になります。なお、v4.1.1で追加になったとされるWooCommerce based sitemapについてはどのようなものかも知りませんし機能を評価できないためこの記事では無視させていただきます。

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の値。このTIDはGoogleへの更新の通知には本来はまったく関係ないのだが、この記事では関係あるので憶えておいて欲しい。その下の「sm_i_lastping」が最も直前に検索エンジンに更新日時を通知した日時。要するに最新のping送信日時。
画像のようにTIDが空で、ping送信日時も空。

Google XML Sitemapsプラグインの更新日時通知 4
改めてXML Sitemapsプラグインの設定画面に戻ります。
本来は関係ない筈の設定項目である「基本的な設定」の「Add Google Analytics TID」のテキストボックスに、正しくは所有しているGoogle AnalyticsのTIDを入力します。2022年春までであれば多くは?UA-XXXXXXXXX-1というID、Analitics 4プロパティに変更済みなら "G-英数字"?
ただ、XML Sitemapsで普通にサイトマップの出力機能を使う+更新日時を通知する(Ping送信)だけであれば要らない筈の情報。ここはテキトーな数字を入力する。 「1」とかで十分じゃないかしら?
入力したら、ページの一番下にある「更新を設定」をクリックする。

Google XML Sitemapsプラグインの更新日時通知 5
ページの上部に「設定を更新しました。」が表示されることを確認。
その下、「○○○に開始されたpingの結果」に表示されるのは最後に投稿または固定記事を公開/更新した日時なのでこれは設定変更前と変わらない筈。
さらにその下、今度は「Googleは変更について正しく通知されました」に変わった。
先程はこの日時のPing送信が「通知されていません」だったのに、真逆の「通知されました」になった。どっち?通知されてたの?アタマ抱えるよね。

Google XML Sitemapsプラグインの更新日時通知 6
再び「デバッグ機能」をクリックした。
「sm_i_tid」は Google Analitics TID欄に入力した値が表示された。(正常)
「sm_i_lastping」は変わらず「空」のまま。「通知されました」が正しいならその日時の値が入っていてもおかしくはないのだが・・・

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

Google XML Sitemapsプラグインの更新日時通知 8
さらにもう一回「デバッグ機能」をクリックした。
今回は、「sm_i_lastping」に値が入った。数字が10桁並んだの。この手の数字は大抵UNIX時間。人間が読める日時形式に変換すると1つ前の画面に表示された日時と合う(秒の一致までは確認できないけど)。
「sm_i_lastping」はバグか何かで値が表示されないというわけではなく正常に機能している?そうするとTID入力前にはPing送信はできていなかった?

画像は無いけどXML Sitemapsの設定画面に戻ってTIDを空にして「設定を更新」(保存)。そして「デバッグ機能」を表示。
今度は「sm_i_tid」が空、「sm_i_lastping」も空。最初に戻ったといえる。
これで、「sm_i_lastping」はTIDが空ではない状態で「投稿」「固定記事」を更新したら値が表示されるということは判った。ただし、この挙動ではTIDあり/TIDなし共に「本当にPing送信されたの?」というのは判断できないかも。

ここまで確認した限りでは、Ping送信をするならTID必須なのかもしれないしそうではないのかもしれない。作者(メンテナ)の人はv4.1.3でTIDの値を必須からオプションに変更したと主張しているがそれは間違っている可能性もある。ping送信のデバッグログが無いと判らないよね。
ただ、ping送信をしたいならTIDに何か値を入れれば良いらしいことも判った?のでこの記事みたいに「1」でも入れておけば良さそう。

GitHubのGoogle XML Sitemapsプラグインのソースの変更履歴を確認したところ、Ping送信でTIDの入力を必須としないための修正が6月13日に行われている。プラグインの2022年8月時点で最新版のv4.1.5は6月14日リリースでギリギリ間に合ったかと思いきやその修正は入っていない。つまり「残念」。

なお、XML SitemapsプラグインのPing送信は、記事の公開,更新,でその記事のURLを伝えるIndexNowのようなものではなく、「(何か変化があったことを伝える意図で)サイトマップのURLをGoogleに通知」するだけのもの。この機能が必須かといえばそうではない。
Googleさんはping通知を受けて、サイトマップを見に来る、サイトマップの各リンクURLののlastmodの日時を見て記事の登録或いは更新の直近のものを認識する。クローラーが直近に登録/更新のあった記事を見に来る。という流れだと思うが、 ウェブサイトのオーナーとしては「1秒でも早くサイトマップを読みに来て、次に1秒でも早くサイトマップを元にクローラーが来てくれて、1秒でも早く検索インデックスに登録して欲しい。」これは共通の思いだと思う。サイトマップをSearch Console(サチコ)に登録するところまでは大きなサイトでも小さなサイトでも差はほぼ無いと思うが、その後のサイトマップの読み込み頻度やクローラーがコンテンツを取り込みに来るまでの早さ、クローラーが来た後に検索インデックスに登録されるまでの早さというのは残念ながらウェブサイトによって優先度が異なるよう。ページ数が多くてコンテンツの追加や更新が多くて有用なコンテンツが多くて閲覧数が多いサイトはクローラーもすぐに来るしインデックス登録も早い。反対に、開設間もないウェブサイトだとかサチコに登録したばかり/サイトマップを登録したばかりのウェブサイトはサチコでURLを送信しようがPing (やWebSub)で送信しようが全然クローラーが来ないとか検索インデックスに登録されないとかは発生する。

とはいえ、超弱小サイトの「がとらぼ」でもページ公開から数時間も経たずに検索インデックスに登録されるので、クローラーがなかなか来ないのは開設間もないウェブサイトとかサチコにサイトマップを登録してから暫く(数ヶ月)だけとかだとは思う。

最後に、サイトマップの出力機能が正常に機能しているかは http://自身のサイトのドメイン/sitemap.xml (これがXMLSitemapsプラグインの初期値) をブラウザで表示すればすぐに判る。このサイトマップ表示部分にはバグらしい動作は無い感じ。(カテゴリ関係でマイナーバグが報告されてはいるみたいだが??)
サイトマップの出力と、サイトマップ更新のPing送信と、検索インデックスに登録されること、はそれぞれ別の話。そこをゴッチャにすると解決するものも解決しなくなるし、そこを糞味噌で騒ぐとよく理解していない他の人を混乱させるのでご注意。

関連記事:

記事へのコメント

いただいたコメントは管理人が確認した後に記事の 下部(ここ)に公開されます。
コメントスパム対策: 2022年4月以降、コメント内にリンクURLを含めると自動破棄されます。(記録されません)