WordPress 埋め込みで公開された古いトピックに x-robots: noindex および canonical タグが欠落している

みなさん、こんにちは。

WordPress から Discourse(コメント欄として使用するため)へ自動的に公開された古いトピックで、奇妙な動作に気づきました。

通常、この方法で投稿が公開されると、Discourse は正しく HTTP ヘッダーに X-Robots-Tag: noindex を追加し、WordPress のブログ投稿へ戻る canonical URL を設定します。

しかし、古いトピックではこれらのタグが失われていることがわかりました。noindex ヘッダーが消え、canonical タグも存在しなくなります。以下は、この問題が発生しているトピックの例です。

この問題を解決する方法をご存知の方はいらっしゃいますか?

現時点でどのくらいのトピックが影響を受けているか正確に把握する方法はないのですが、かなり多いようです。

カテゴリ(またはタグ?)の設定にチェックボックスを設け、有効にすると、そのカテゴリで公開されたすべてのトピックに自動的に noindex が追加されるような機能があれば素晴らしいのですが。例えば、以下のようなものです。

[ ] このカテゴリのトピックを検索結果から非表示にする

こんにちは、ティアゴさん、

私の理解が正しいか確認させてください。以下の通りでしょうか:

  1. サイト設定の「Embed set canonical URL」が有効になっており、以前から有効だった。
  2. 過去のある期間、WordPress Discourse プラグインを通じて、WordPress から Discourse へ複数のトピックが公開された。
  3. 最近まで、上記の「2」で説明されたように公開されたすべての Discourse トピックには、<head> 内に link rel="canonical" が含まれており、その href は WordPress の URL に設定されていた。
  4. 最近のある時点で、以前は「3」に準拠していたトピックの一部が、link rel="canonical"href を Discourse の URL に変更したと考えられる。

これで合っていますか?

こんにちは、アングスさん!

はい、その通りです。

`埋め込みで正規 URL を設定` も有効になっています:

こちらを見ると、新しいトピックには noindex と正規タグが付いて公開されています。しかし、古いトピックにはこれらのタグが付いていないようです。

Thiago さん、サーバーにアクセスできる場合、正規 URL が機能していないトピックの ID を取得し、以下のコマンドを Rails コンソールで実行して結果を共有してください。

./launcher enter app
rails c
TopicEmbed.with_deleted.find_by(topic_id: ここにトピック ID を追加)
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:73608)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:79015)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:74248)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:76598)
=> nil

それが問題です。埋め込み機能の正規 URL が機能するためには、トピックに topic_embed レコードが必要です。なぜこれらのトピックに埋め込みレコードが存在しない可能性があるか、思い当たる理由はありますか?

正直、なぜそのトピックが topic_embed レコードを欠落させてしまったのか、原因がわかりません。

しかし、全体像を考えると、以前提案した設定を採用する方が理にかなっていると思いませんか?カテゴリ設定に直接チェックボックスを追加して、そのカテゴリ内のすべてのトピックに noindex を適用できるようにすれば、埋め込み機能に依存したり、そもそもそのレコードが存在するかどうかを気にする必要がなくなります。

それはあなたのサイトにとっては理にかなっているかもしれませんが、トピック埋め込みの正規 URL の仕組みとは異なる機能となります。実装は可能ですが、カスタムプラグインとして作成する必要があります。

埋め込みの正規 URL は期待通りに機能していますが、ある時点で埋め込みレコードが削除されたか、サイト上で何らかの他の操作が行われたようです。Discourse はトピック埋め込みレコードをハード削除しないため、他に何か問題が発生したと考えられます。カスタム対応を行わない限り、これらのトピックを再公開して埋め込みレコードを再度作成する必要があります。

トピック埋め込みとは動作が異なりますが、カテゴリレベルのインデックス制御は、あらゆるモダンなCMSにとって基本的なSEO要件です。これに関連する他のメタトピックもいくつかあり、これをネイティブ機能化することで、複数のユースケースを同時に解決できます。

Rubyは私のスタックではないため、AIを使ってプラグインを作成してみるかもしれませんが、これは本当にネイティブ機能であるべきです。

欠落しているレコードについてですが、これを引き起こす可能性のあるデータベースコマンドや操作は実行していません。また、再公開は現実的ではありません。約5万件の投稿があり、どの投稿が影響を受けているかも把握できていません。これを修正するには、すべてを検索・削除・再公開するための複雑なAPIスクリプトが必要になります…