구식 게시글이 약 1,000개 있는 WordPress 사이트가 있습니다. 이 모든 글에 대해 Discourse 댓글 스레드를 일괄 생성하고 싶습니다. Discourse WP 플러그인의 설정이 올바르게 되어 있다면, 각 게시글을 편집하고 저장하면 새 댓글 스레드가 생성되는 것 같습니다.
하지만… 1,000개나 되는 게시글을 하나씩 열어 저장하고 싶지는 않습니다.
wp_posts 테이블에서 필요한 wp_post ID와 제목을 쉽게 가져올 수 있습니다. wp_posts의 필요한 데이터를 사용하여 새 스레드를 생성할 수 있는 Discourse용 SQL 문장을 만드는 방법을 아시는 분이 있을까요?
문제는 Discourse 측에서 처리할 경우, WordPress 사이트에 올바른 링크, 댓글 수 등을 표시하는 데 필요한 정보가 부족하다는 점입니다. 어느 쪽에서 처리해야 하는지에 대한 해결책은 저도 갖고 있지 않지만, WordPress 쪽에 노력을 집중하시는 것이 더 나을 것 같습니다.
Wordpress 커맨드 라인 도구가 게시글을 반복적으로 처리하여 Discourse 플러그인이 원하는 대로 주제를 생성하도록 트리거하는 방식으로 저장할 수 있다면, 저는 분명 그렇게 할 것입니다. 효율적이지는 않을 수 있지만, 일회성 작업이라면 “더 나은” 해결책을 찾는 데 드는 시간보다 오버헤드가 더 적을 것입니다.
다른 분들이 언급했듯이, 현재 가장 쉬운 방법은 WP Discourse 플러그인을 사용하는 것입니다. 각 인스턴스의 데이터베이스를 직접 업데이트하면 두 가지 잠재적인 문제가 발생합니다:
각 인스턴스에 저장되는 모든 데이터와 메타데이터를 이해해야 합니다.
데이터와 메타데이터는 상호 의존적입니다. 예를 들어, Wordpress에서 Discourse로 게시물이 성공적으로 게시되면 Discourse의 게시물 ID가 Wordpress의 게시물 메타 필드에 저장됩니다.
만약 1번과 2번 모두에 이미 익숙하다면, 데이터베이스를 직접 업데이트하는 것이 좋은 선택일 수 있습니다. 하지만 그렇지 않다면, 이 목적만을 위해 학습 시간을 들이고 싶지 않다면 좋은 아이디어가 아닙니다. 이 관점에서 보면, 대신 누군가를 고용하여 이 작업을 수행하도록 할 수 있지만, WP Discourse 플러그인의 기능을 사용하는 것을 권장합니다.
WP Discourse 플러그인을 사용하면 WP Discourse 게시에 대한 로깅이 이미 설정되어 있어, 게시 중 실패가 발생하면 게시물별로 상세한 정보를 얻을 수 있다는 추가적인 이점이 있습니다.
WP Discourse 플러그인은 한 번에 하나의 주제만 POST하기 때문에, 이는 Discourse로 1,000개 이상의 POST 요청을 의미할 것입니다. 하지만 이것이 일회성 마이그레이션이므로, 스크립트에서 배치로 나누고 휴지(즉, sleep)를 삽입하여 처리할 수 있습니다. 처음 몇 개의 배치 후 수동으로 확인하여 예상대로 작동하는지 확인하는 것을 권장합니다.
스크립트 자체에 대해서는, 각 게시물에 대해 WPDiscourse\DiscoursePublish 메서드인 publish_post_after_save를 사용해야 하며, 즉 루프(적절한 배치 및 sleep 포함) 내에서 이를 실행해야 합니다.
$wp post update 396 398 402 {여기서 더 많은 ID} --tags_input=discourse
이전에 post_status = 'publish’이고 post_type = post인 wp_posts 테이블의 행 ID 목록을 가져왔습니다.
그 목록을 wp post 명령에 전달했고, 4코어 서버를 사용했을 때 행당 약 500ms가 걸렸습니다. 20개 이상의 행을 지정하면 Discourse가… ???.. 하지만 그 후에는 더 이상 링크가 생성되지 않았습니다. 그래서 30초 간격을 두고 20개씩 입력하고 다른 프로젝트 작업을 병행했습니다.
따라서, 그 답은 진정한 해킹(hack)이지만, 저에게는 (아직 @angus의 답변을 받지 못한 상태였으므로) 가장 직접적인 경로였습니다.