정기적 혹은 조건적으로 컨텐츠를 정리(삭제)해 줄 수 있는 모듈
정기적 혹은 조건적으로 컨텐츠를 정리(삭제)해 줄 수 있는 모듈
위 제목에 100% 적합한 모듈은 아니지만 어느 정도 목적 달성이 가능한 모듈이다.
SQL Cron 모듈 - http://drupal.org/project/sqlcron
만일 CCCC라는 컨텐츠 타입을 2달간만 보관하고 그 이전에 것은 저절로 삭제하게
하고 싶다면, 아래의 SQL 문장(MySQL 전용)을 하나씩 테스트 해 보면 된다.
1. 현재로부터 2달전 날짜 구하기
SELECT SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH )
2. 현재로부터 2달전 날짜의 타임스탬프 구하기 (드루팔의 node.created가 timestamp 값을 int 형태로 보유)
SELECT UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )
3. 현재로부터 2달이 지난 컨텐츠 타입 CCCC의 데이타를 구하기
SELECT n.* FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
AND n.created < UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )
* 추가) 리비젼을 가지고 있는 컨텐츠 타입이라면, node_revisions를 먼저 정리해야 한다.
SELECT n.nid as nid FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
AND n.created < UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )
);
DELETE FROM node_revisions WHERE nid IN (
SELECT n.nid as nid FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
AND n.created < UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )
);
4. 현재로부터 2달이 지난 컨텐츠 타입 CCCC의 데이타를 삭제하기
AND node.created < UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )
위 4번의 SQL을 SQL Cron 모듈에 장착하고 정기적으로 실행하면,
원하는 목적 - 정기적으로 컨텐츠를 삭제 - 을 이룰 수 있다.
------------------------------------------
이와 달리 시간이 아닌 갯수로 컨텐츠 타입 CCCC를 통제하고 싶다면,
아래와 같은 (별로 예쁘지는 않다) SQL이 어떨까 싶다.
1. 컨텐츠 타입 CCCC의 최신 데이터 100개 이외의 데이터를 구하기.
SELECT * FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
ORDER BY n.created DESC LIMIT 100, 99999
* 이때 99999 부분은 적절히 조절이 필요하다. (더 좋은 방법은 없을까?)
SET @lastnid=(SELECT n.nid FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
ORDER BY n.created DESC LIMIT 101,1);
SELECT @lastnid;
2. 컨텐츠 타입 CCCC의 최신 데이터 100개 이외의 데이터를 확인/삭제.
SELECT * FROM node WHERE node.type='CCCC' AND node.nid<@lastnid;
DELETE FROM node WHERE node.type='CCCC' AND node.nid<@lastnid;
[주의점]
* DELETE 에서는 LIMIT xxx 는 가능해도 LIMIT xxx, yyy 가 안된다.
* MySQL 5.0? 에서는 Sub쿼리에 LIMIT 를 사용하면 안된다.
* Stored Procedure를 사용하면 더 편하겠다.
[참고]
* http://api.drupal.org/api/function/node_delete/6 를 참고하라.


댓글
7 comments posted주의) SQL Cron 모듈에 추가한 SQL문이 복수행인 경우에는, 2009년 3월 기준으로 하나씩 태스크를 나눠서 등록하는 것이 좋다. 위에 오는 것이 먼저 실행되는 것 같다.
주의) SQL로 DB조작에 자신이 없는 경우에는 사용하지 않는 것이 좋겠다! node 와 node_revisions 테이블은 드루팔 API에 의해서 제어하는 것을 권장하는데, 본 방법은 두 테이블 간의 데이터 정합성을 파괴, 데이터 목록 표시 화면이 이상해 질 수도 있다.
Rules 모듈 http://drupal.org/project/rules 의 Scheduled rules로도 비슷한 일을 할 수 있을 것 같습니다. 지적해주신대로 실수로 DB를 잘못 건드릴 수도 있으니까요. 아직 간단한 룰만 써봤는데, 조만간 '지정한 content type의 node를 한 달 후에 자동 삭제하고 Admin에게 notification email을 보내는' 룰을 테스트해볼겁니다 ㅎㅎ
액션 모듈과 다른 모양입니다. 더 강력한 것인가 보죠?
http://palpal.org/node/99
확실히 이런 종류의 모듈들은 여러모로 쓰임새가 많은 것 같아요.
드루지기도 관심가지고 살펴보렵니다. 댓글 감사합니다~
네 Rules는 Actions 그리고 Token하고 묶여서 작동하는 것 같구요, Triggered rule이나 Scheduled rule을 쓸 수 있어서 조금 더 유연한 것 같아요.
지금 http://drupal.org/node/517674 이 글 보고 세팅하는 중입니다^^
이 Rules를 기반으로 작동하는 Node expire module도 있더라구요. 이건 노드 작성할 때 작성자가 expire를 정할 수도 있구요, Admin이 content-type마다 정할수도 있더라구요. 그런데 저는 딱 한 가지만 하면 되는거라 Rules로 해보려구요.
역시 비슷한 모듈들이라 참고삼아 적어봅니다 :)
http://drupal.org/project/scheduler
http://drupal.org/project/auto_expire
유용한 정보 감사합니다!
마침 어떤 프로젝트에서 예약 메일 발송 기능이 있는데 적용하는 걸 검토해봐야겠습니다.
좋은 모듈 소개해 주신 bs0048님께 감사드립니다.
노드의 한 날짜필드를 확인해서 Remind (환기성)메일을 보내는걸 만들어야 하는데,
아래 기사가 요구조건에 거의 맞아들어가더군요. 고맙습니다!
Tutorial 3: Publish content based on a CCK date field
http://drupal.org/node/520012
어떤 목적 OOOO으로 Rules을 이용하려면,
우선 해당 목적 OOOO에 알맞은 모듈이 Rules 모듈과
연동이 돼 있는지 살펴보는 것이 좋을 듯 합니다.
http://groups.drupal.org/rules/rules-modules