Возможно ли массово создать ветки для множества записей WordPress? Может быть, через SQL?

У меня есть сайт на WordPress с примерно 1000 старыми постами. Я хотел бы массово создать потоки комментариев в Discourse для всех них. Похоже, что можно редактировать и сохранять каждый пост, и это создаст новый поток комментариев, если настройки в плагине Discourse для WordPress настроены правильно.

Но… я бы не хотел открывать и сохранять 1000 постов.

Я могу легко получить нужные идентификаторы и заголовки wp_post из таблицы wp_post. Может быть, кто-то знает, как составить SQL-запрос для Discourse, который создаст новые потоки с необходимыми данными из wp_posts?

Вы используете плагин WP-discourse? Если да, то, полагаю, вам лучше автоматизировать это в WordPress.

(Я не знаю, как конкретно выполнить то, о чём вы спрашиваете.)

Да, я использую плагин, и он настроен на автоматизацию, но для того, чтобы пост «автоматически» создал ветку комментариев в Discourse, нужно обновить запись в WordPress, например, открыть её для редактирования и сохранить.

В любом случае, нет, я считаю, что гораздо проще извлечь нужные мне данные из базы данных MySQL WordPress и заполнить ими базу данных Discourse с помощью SQL. Я просто совсем не знаком со структурой базы данных Discourse и надеюсь найти того, кто в ней разбирается.

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

Проблема в том, что если вы будете настраивать это на стороне Discourse, ваш сайт WordPress не будет иметь необходимой информации для отображения правильных ссылок, количества комментариев и так далее. У меня тоже нет решения, как это сделать с какой-либо из сторон, но я думаю, вам стоит сосредоточить усилия на WordPress.

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

Как уже упоминалось, на данный момент самый простой способ сделать это — использовать плагин WP Discourse. Прямое обновление баз данных каждого экземпляра создаёт две потенциальные проблемы:

  1. Это требует от вас понимания всех данных и метаданных, хранящихся в каждом экземпляре.
  2. Данные и метаданные взаимосвязаны: например, после успешной публикации поста из WordPress в Discourse идентификатор поста в Discourse сохраняется в поле метаданных поста в WordPress.

Если бы вы уже были знакомы с обоими пунктами 1 и 2, то прямое обновление баз данных могло бы быть хорошим вариантом. Однако, учитывая, что вы не знакомы с ними, это плохая идея, если только вы не готовы потратить время на изучение этого исключительно для данной цели. В таком случае вы могли бы нанять кого-то для выполнения этой работы, но я рекомендую просто воспользоваться функциональностью плагина WP Discourse.

Использование плагина WP Discourse имеет дополнительное преимущество: для публикации через WP Discourse уже настроено ведение журналов, что означает, что вы получите подробную информацию, специфичную для каждого поста, если какая-либо публикация не удастся.

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

Что касается самого скрипта, вы будете использовать метод WPDiscourse\DiscoursePublish publish_post_after_save для каждого поста, то есть в цикле (с соответствующей пакетной обработкой и паузами).

Спасибо всем!

Я не осознавал, что изменения в базе данных требуются с обеих сторон. Интересно. Я очень хорошо знаком с БД WordPress. Слишком хорошо, пожалуй. Часто я обращаюсь к базе данных в первую очередь, хотя, возможно, стоило бы использовать другие подходы.

Да, я такой одержимый базами данных болван. Я люблю проектирование и создание БД. Но… я совсем не знаком с БД Discourse (пока). Так что…

Ах да… правильное логирование — это замечательно.

Да, отлично. Я приму это как правильный ответ, поскольку это именно то, что мне было нужно.

Однако…

В итоге я сделал следующее, используя инструмент WP CLI:

$wp post update 396 398 402 {ещё несколько здесь} --tags_input=discourse

До этого я получил список идентификаторов строк из таблицы wp_posts, у которых post_status = ‘publish’ и post_type = post.

Я передал этот список команде wp post, и она выполнялась примерно за 500 мс на строку на сервере с 4 ядрами. Если я указывал более 20 или около того строк, Discourse… ???.. но после этого ссылки больше не создавались. Поэтому я подавал по 20 за раз с задержкой в 30 секунд и занимался другими проектами.

Так что этот ответ — настоящий хакинг, но для меня (ещё не зная ответа от @angus) это был самый прямой путь.