Старые темы, опубликованные через WordPress Embed, лишены тегов x-robots: noindex и canonical

Всем привет,

Я заметил странное поведение со старыми темами, которые автоматически публиковались из WordPress в Discourse (для использования в качестве раздела комментариев).

Обычно, когда пост публикуется таким образом, Discourse корректно добавляет заголовок X-Robots-Tag: noindex в HTTP-заголовки и устанавливает канонический URL (canonical), указывающий обратно на пост в блоге WordPress.

Однако я обнаружил, что старые темы теряют эти метки. Заголовок noindex исчезает, а канонический тег больше не присутствует. Вот несколько примеров тем, где это происходит:

Знает ли кто-нибудь способ исправить эту проблему?

Имейте в виду, что я не могу точно узнать, сколько тем уже затронуто, но похоже, что их довольно много.

Было бы здорово, если бы в настройках категории (или тега?) была возможность установить флажок, который при включении автоматически добавлял бы noindex ко всем темам, опубликованным в этой категории. Что-то вроде:

[ ] Скрывать темы этой категории из результатов поиска.

Привет, Тьяго,

Просто чтобы я правильно понял, ты имеешь в виду следующее:

  1. У тебя включена настройка сайта «Установить канонический URL для встраиваемого контента» (Embed set canonical URL), и она была включена всегда.
  2. Ты публикуешь множество тем из WordPress на Discourse через плагин WordPress Discourse Plugin в течение некоторого времени.
  3. До недавнего времени все темы Discourse, опубликованные согласно пункту 2, имели тег <link rel="canonical"> с атрибутом href, указывающим на URL WordPress, в секции <head>.
  4. В какой-то момент недавно, как ты полагаешь, некоторые из этих тем, которые ранее соответствовали пункту 3, теперь имеют тег <link rel="canonical"> с атрибутом href, указывающим на URL Discourse.

Правильно ли я понял?

Привет, Энгус!

Да, всё верно.

Также включена опция embed set canonical URL:

Вы можете увидеть здесь, что новые темы публикуются с тегами noindex и canonical. Однако я вижу, что старые темы не содержат этих тегов.

Тиагу, если у тебя есть доступ к серверу, пожалуйста, найди ID темы, у которой не работает канонический URL, выполни в консоли 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. Можете ли вы назвать какие-либо причины, по которым у этих тем может не быть записей embed?

Честно говоря, я не знаю, что могло стать причиной отсутствия записей topic_embed у этих тем.

Но если взглянуть на ситуацию в целом, не было бы логичнее воспользоваться конфигурацией, которую я предложил ранее? Если мы добавим флажок непосредственно в настройки категории для применения noindex ко всем темам внутри неё, нам не придётся полагаться на функцию встраивания или беспокоиться о том, существуют ли вообще такие записи.

Хотя для вашего сайта это может иметь смысл, это будет функцией, отличающейся от того, как работают канонические URL-адреса для встраиваемых тем. Вы можете реализовать это, но вам придётся сделать это в виде отдельного плагина.

Канонические URL-адреса для встраиваемых тем работают как положено, однако кажется, что в какой-то момент записи встраивания были удалены или на вашем сайте была выполнена какая-то другая операция. Discourse не удаляет записи встраивания тем окончательно, так что там должно было произойти что-то ещё. Если вы не проведёте какую-то кастомную работу, вам потребуется повторно опубликовать эти темы, чтобы снова создать записи встраивания.

Хотя это ведёт себя иначе, чем встраивание тем, контроль индексации на уровне категории является базовым требованием SEO для любой современной CMS. Существует несколько других тем в Meta по этому вопросу, и реализация этой функции на уровне ядра позволила бы сразу решить множество задач.

Я, возможно, попробую создать плагин с использованием ИИ, поскольку Ruby не входит в мой стек технологий, но это действительно должно быть встроенной функцией.

Что касается пропущенных записей: мы не выполняли никаких команд или операций с базой данных, которые могли бы стать причиной этого. Кроме того, повторная публикация не является жизнеспособным решением. У нас почти 50 000 постов, и мы даже не знаем, какие именно из них затронуты. Исправление этого потребовало бы сложных API-скриптов для поиска, удаления и повторной публикации всего содержимого…