Плагин пытается повторно опубликовать в Discourse после каждого обновления

Здравствуйте,
Я обнаружил проблему на нашем сайте с плагином WP Discourse.
Суть в том, что после публикации статьи в блоге и успешного размещения её на форуме Discourse, если через неделю (или другое время) внести небольшие изменения в пост и обновить его, плагин WP Discourse пытается опубликовать его на форуме заново.
В результате я получаю письмо «Discourse Publishing Failure» с сообщением о том, что URL для встраивания уже занят.

Я также заметил это при обновлении очень старых постов в WordPress: они появляются в категории по умолчанию «Новости» на форуме Discourse, что сбивает читателей с толку.

Есть ли какие-то настройки, которые я упустил, чтобы избежать этого?
Большое спасибо!

Спасибо за отчет. Я скоро, надеюсь завтра, но не позднее начала следующей недели, более внимательно изучу этот сценарий.

Привет, @npm0912, не мог бы ты провести для меня тест?

Попробуй воспроизвести эту проблему, но перед внесением изменений (через неделю или за то нормальное время, которое обычно проходит) проверь статус поста в Discourse в панели инструментов WordPress справа на экране редактирования поста. Сообщите, что там отображается в момент, когда вы выполняете редактирование, а затем получите ли вы описанное вами поведение после редактирования.

Пожалуйста, также отправьте мне ссылку для скачивания логов WP Discourse.

Итак, когда я пытаюсь отредактировать пост, опубликованный примерно 10 дней назад, я вижу этот статус поста Discourse:

Попытался обновить пост, но та же ошибка повторилась. Я также получил такое же письмо об ошибке.
Последняя ошибка из логов:

[2024-05-13 18:02:53] publish.ERROR: create_post.post_error {"wp_title":"Nextcloud exhibiting at global events in May 2024","wp_author_id":"9","wp_post_id":209030,"response_message":"Embed url has already been taken","http_code":422} 

Разве на странице настроек не должна быть опция, отключающая повторную попытку публикации, если пост уже есть в Discourse?

Спасибо!

Хорошо, это означает, что ваш экземпляр WordPress не позволяет плагину WP Discourse корректно сохранять поля мета-данных публикации, скорее всего, из-за другого плагина или темы на вашем сайте. Можете ли вы предоставить файл журнала WP Discourse? Он содержит список плагинов, что может указать на виновника.

Обычно плагин сохраняет детали публикации после первой публикации. У вас этого не происходит. Именно это нам и нужно выяснить :slight_smile:

О, хорошо, это странно… Я думал, это баг. Я прикрепляю файл метаданных. Дайте знать, если этого достаточно.

wp-discourse-logs-metafile-2024-04-17-2024-05-13.txt (2.5 КБ)

Сообщите, пожалуйста, есть ли известный плагин, который может конфликтовать с плагином Discourse.

Огромное спасибо за то, что нашли время разобраться в этом!

У вас есть несколько плагинов, которые могут быть причиной проблемы. В качестве первого шага, пожалуйста, включите эту настройку в разделе «Опубликование» (Publishing) настроек плагина WP Discourse.

Это изменит способ сохранения плагинами пользовательских полей и может повлиять на поведение в вашем случае. Скорее всего, это не исправит проблему, но может дать нам больше понимания. После включения настройки попробуйте воспроизвести те же условия.

После этого мы перейдём к отключению отдельных плагинов, чтобы попытаться изолировать проблему. Есть ли у вас тестовый сайт (staging site), то есть сайт с вашими темами и плагинами, но без реальных данных?

Я также добавлю более подробное логирование в логику публикации внутри плагина, чтобы помочь прояснить этот класс проблем (то есть хранение метаданных в WordPress после публикации на Discourse). Однако это займёт некоторое время, и в это время мы можем провести тесты, подобные описанным выше.

Здравствуйте и ещё раз спасибо за ваше время!

Я включил эту настройку, но проблема всё ещё сохраняется.
На самом деле мы используем тестовый сайт, и самое интересное, что, несмотря на то, что плагины, темы и файлы полностью идентичны, он ведёт себя иначе: после публикации тестовой записи она корректно отображается в Discourse, и если я возвращаюсь к той же записи, то в боковой панели настроек Discourse я больше не вижу ошибки «Embed url has already been taken». Вместо этого я вижу следующее:

Таким образом, различия в серверах следующие:
Тестовый сайт:
WordPress - 6.5.3
PHP - 8.1.27
MySQL - 10.6.16

Рабочий сайт:
WordPress - 6.5.3
PHP - 8.1.2-1ubuntu2.17
MySQL - 5.5.5

Привет, @npm0912, это показывает, что проблема связана с вашей средой.

  1. Не могли бы вы предоставить полный файл «meta» из просмотрщика логов WP Discourse для обоих экземпляров?
  2. В чём различия между Discourse, который вы используете на тестовом сервере (staging), и тем, который используется на рабочем сервере (production)?
  3. Используете ли вы какие-либо решения для кэширования, CDN или балансировки нагрузки в рабочей версии WordPress, которых нет на тестовом сервере?

Привет, @angus,

  1. Конечно, вот логи:
    Staging:
    Staging wp-discourse-logs-metafile-2023-04-13-2024-05-28.txt (2.4 KB)
    Live-сайт:
    LIVE wp-discourse-logs-metafile-2024-05-13-2024-05-28.txt (2.4 KB)

  2. Экземпляр Discourse тот же, единственное отличие в том, что со staging я публикую в другой категории форума.

  3. На обоих экземплярах я использую WP Rocket и Redis-кэширование, поэтому, думаю, это не должно влиять.

Спасибо!

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

Помимо этого, рекомендую внимательно проверить настройки WP Rocket (например, действительно ли они совпадают на обоих сайтах). Хотя плагин хорошо справляется со своими задачами, WP Rocket часто становится причиной проблем с плагинами WordPress.

Обратите внимание, что в настоящее время WordPress требует версию MySQL 8.0 или выше. Вам необходимо обновить вашу производственную базу данных.

Сопоставление: Could not update the meta value of discourse_post_id in database - #2 by angus

На самом деле WP Discourse ошибся с информацией о базе данных. Правильная версия базы данных — 10.6.16-MariaDB-0ubuntu0.22.04.1.

Версия, указанная в этом файле, является результатом работы основной функции WordPress:

$wpdb->db_version()

Смотрите здесь в коде, а также далее по ссылке:

Именно эту версию WordPress считает своей текущей. Похоже, это и есть ваша проблема.

Вы правы. Я ещё раз проверил функцию db_version() внутри темы и действительно получил в результате 5.5.5. Но на странице «Состояние сайта» в админ-панели я вижу версию 10.6.16-MariaDB — такую же, которую мне назвали системные администраторы. То есть именно эту версию должно видеть и WordPress, верно?

Извините, но здесь может быть множество причин, и без проверки вашего сервера невозможно сказать об этом с уверенностью.

Учитывая описанные вами проблемы, я рекомендую тщательно изучить эту возможность.