みなさん、こんにちは。
WordPress から Discourse(コメント欄として使用するため)へ自動的に公開された古いトピックで、奇妙な動作に気づきました。
通常、この方法で投稿が公開されると、Discourse は正しく HTTP ヘッダーに X-Robots-Tag: noindex を追加し、WordPress のブログ投稿へ戻る canonical URL を設定します。
しかし、古いトピックではこれらのタグが失われていることがわかりました。noindex ヘッダーが消え、canonical タグも存在しなくなります。以下は、この問題が発生しているトピックの例です。
この問題を解決する方法をご存知の方はいらっしゃいますか?
現時点でどのくらいのトピックが影響を受けているか正確に把握する方法はないのですが、かなり多いようです。
カテゴリ(またはタグ?)の設定にチェックボックスを設け、有効にすると、そのカテゴリで公開されたすべてのトピックに自動的に noindex が追加されるような機能があれば素晴らしいのですが。例えば、以下のようなものです。
[ ] このカテゴリのトピックを検索結果から非表示にする。
angus
(Angus McLeod)
2
こんにちは、ティアゴさん、
私の理解が正しいか確認させてください。以下の通りでしょうか:
- サイト設定の「Embed set canonical URL」が有効になっており、以前から有効だった。
- 過去のある期間、WordPress Discourse プラグインを通じて、WordPress から Discourse へ複数のトピックが公開された。
- 最近まで、上記の「2」で説明されたように公開されたすべての Discourse トピックには、
<head> 内に link rel="canonical" が含まれており、その href は WordPress の URL に設定されていた。
- 最近のある時点で、以前は「3」に準拠していたトピックの一部が、
link rel="canonical" の href を Discourse の URL に変更したと考えられる。
これで合っていますか?
こんにちは、アングスさん!
はい、その通りです。
`埋め込みで正規 URL を設定` も有効になっています:
こちらを見ると、新しいトピックには noindex と正規タグが付いて公開されています。しかし、古いトピックにはこれらのタグが付いていないようです。
angus
(Angus McLeod)
4
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
angus
(Angus McLeod)
6
それが問題です。埋め込み機能の正規 URL が機能するためには、トピックに topic_embed レコードが必要です。なぜこれらのトピックに埋め込みレコードが存在しない可能性があるか、思い当たる理由はありますか?
正直、なぜそのトピックが topic_embed レコードを欠落させてしまったのか、原因がわかりません。
しかし、全体像を考えると、以前提案した設定を採用する方が理にかなっていると思いませんか?カテゴリ設定に直接チェックボックスを追加して、そのカテゴリ内のすべてのトピックに noindex を適用できるようにすれば、埋め込み機能に依存したり、そもそもそのレコードが存在するかどうかを気にする必要がなくなります。
angus
(Angus McLeod)
8
それはあなたのサイトにとっては理にかなっているかもしれませんが、トピック埋め込みの正規 URL の仕組みとは異なる機能となります。実装は可能ですが、カスタムプラグインとして作成する必要があります。
埋め込みの正規 URL は期待通りに機能していますが、ある時点で埋め込みレコードが削除されたか、サイト上で何らかの他の操作が行われたようです。Discourse はトピック埋め込みレコードをハード削除しないため、他に何か問題が発生したと考えられます。カスタム対応を行わない限り、これらのトピックを再公開して埋め込みレコードを再度作成する必要があります。
トピック埋め込みとは動作が異なりますが、カテゴリレベルのインデックス制御は、あらゆるモダンなCMSにとって基本的なSEO要件です。これに関連する他のメタトピックもいくつかあり、これをネイティブ機能化することで、複数のユースケースを同時に解決できます。
Rubyは私のスタックではないため、AIを使ってプラグインを作成してみるかもしれませんが、これは本当にネイティブ機能であるべきです。
欠落しているレコードについてですが、これを引き起こす可能性のあるデータベースコマンドや操作は実行していません。また、再公開は現実的ではありません。約5万件の投稿があり、どの投稿が影響を受けているかも把握できていません。これを修正するには、すべてを検索・削除・再公開するための複雑なAPIスクリプトが必要になります…
Slate
(Slate )
11
プラグインの作業、素晴らしいですね。まだ どの 既存のトピックがヘッダーを失ったかを探している方のために、外部から確認できます — Rails もデータベースも不要です:
curl -s https://EXAMPLE.COM/sitemap_1.xml \
| grep -o 'https://[^<]*/t/[^<]*' \
| while read -r u; do
curl -sI "$u" | grep -qi 'x-robots-tag: *noindex' || echo "$u"
done > missing-noindex.txt
sitemap.xml は通常、子サイトマップを指すインデックスなので、まずそれらを展開し、それぞれの子に対してこれを実行してください。サイトがレート制限を設けている場合は、sleep を追加してください。
後でこれを見つける方のために、分離して説明すべき点があります:ヘッダーとcanonicalは2つの独立したシグナルであり、それぞれ独立して失敗します — トピックは X-Robots-Tag を失いながら正しいcanonicalを保持している場合や、その逆の場合もあります。両方を確認してください:
curl -sI URL | grep -i x-robots
curl -s URL | grep -i 'rel="canonical"'