관여하는 사이트에서 글 등록을 대기시켰다가 일정 시점에 공개 상태로 했으면 좋겠다는 요청이 예전부터 있었는데, 이제 슬슬 작업을 해보고 있습니다.
잠정적으로 이름은 예약발행 모듈이고 영어 이름은 prepub입니다.
보통은 cron이라는 프로그램을 통해서 글 등록을 스케줄링하는 것으로 알고 있는데요.
저는 서버 지식도 거의 없고 웹호스팅 이용자 신세여서 나중에라도 또 써먹으려면 다른 방법을 찾아야겠더라구요.
그러다 https://xetown.com/questions/125182#comment_125284 여기에서 아이디어를 얻게 됐습니다.
이 아이디어로 비교적 간단하게 모듈을 만들고 있지요.
확장변수를 이용해서 발행일시를 넣어주고, 현재일시 이전에는 목록에서 제외하고 그 이후에는 목록에 포함시키는 방식입니다.
1. 먼저 트리거를 이용해 게시판의 '추가 설정' 페이지에 예약발행 기능을 사용할 것인지에 관한 옵션을 만들었구요.
2. 체크가 되어 값이 저장되면, 확장변수(prepub_datetime)가 자동으로 생성됩니다. 체크를 해제하고 저장하면 확장변수는 삭제되구요.
3. 글쓰기에서 확장변수 필드에 발행일시에 해당하는 YmdHi 형식(년월일시분)의 숫자를 입력해주면 예약발행이 됩니다.
- 이때 등록된 글의 status는 PUBLIC이 아니라 EMBARGO로 저장됩니다. 엠바고가 궁금하면 여기를 참조. https://xetown.com/questions/1570845
- 곁가지로 확장변수 입력 방식은 나중에 datetime-local로 바꿔볼 생각입니다. 스킨단에 끼어드는 방식을 고민해봐야겠어요. 물론 코어에서 datetime-local 형식도 지원해주면 좋겠지만요.
4. 이번에는 문서 목록을 만드는 함수 getDocumentList에 트리거로 끼어들어서, 확장변수 prepub_datetime의 값이 현재일시 date('YmdHi')보다 크면, 해당 글은 게시판 목록에는 나타나지 않도록 했습니다. (아래 그림은 해당글이 목록에서 제외된 결과)
5. 위와 같이 게시판 목록에는 나타나지 않지만, 반대로 관리자 페이지의 ./index.php?module=admin&act=dispPrepubAdminList 의 예약발행 목록에 나타나게 됩니다. EMBARGO 상태의 문서만 목록으로 나오게 했거든요.
6. 그리고 getDocumentList에 트리거를 넣을 때, 확장변수값이 현재일시를 지나게 되면 문서 상태값을 EMBARGO에서 PUBLIC으로 바꾸게 했습니다. 즉, 사이트 이용자들 중 누군가 글 목록을 실행하게 된다면 예약글이 공개글로 자동으로 바뀌게 되는 거죠. . (아래 그림은 시간이 지나 해당글이 목록에 포함된 결과)
7. 이후의 과제
- 중간에 잠깐 언급했듯 발행일시 입력 형식을 예쁘게 꾸며볼 생각입니다. 여러개의 숫자를 바로 입력하는 방식은 오류 가능성이 높으니까요.
- 지금은 예약글이 공개될 때 문서상태를 PUBLIC으로 고정시켰는데, 발행 문서가 비밀글일 경우도 대비를 해야 할 것 같습니다. 확장변수를 하나 더 생성해서 비밀글 속성을 넣어줄지, 어떤 식으로 PUBLIC과 SECRET을 판별할지 고민이 좀 되네요ㅎㅎ
화이팅~