답변:
개발자 중심 솔루션을 찾고 있다면 hook_cron()
사용자 정의 모듈을 호출 하여 이전 노드를 정리할 수 있습니다.
function MYMODULE_cron() {
// Other conditions can be altered/added as neeed
$query = \Drupal::entityQuery('node')
->condition('created', strtotime('-2 week'), '<=');
$nids = $query->execute();
foreach ($nids as $nid) {
$node = node_load($nid);
$node->delete();
}
}
Shawn Conn의 답변을 바탕으로 초보자를위한 완벽한 솔루션은 다음과 같습니다.
방금 만든 폴더에 "delete_old_nodes.info.yml"이라는 파일을 만들고이 코드를 붙여 넣습니다.
name: Delete old nodes
description: Deletes nodes older than 30 days.
package: Custom
type: module
version: 1.0
core: 8.x
"delete_old_nodes.module"이라는 파일을 작성하고 다음 코드를 넣으십시오.
<?php
function delete_old_nodes_cron() {
$query = \Drupal::entityQuery('node')
->condition('created', strtotime('-2 week'), '<='); // Can change -2 week to -2 year or -3 day
$nids = $query->execute();
foreach ($nids as $nid) {
$node = node_load($nid);
$node->delete();
}
}
?>
캐시를 플러시 한 다음 모듈 페이지 (yoursite.com/admin/modules)로 이동하여 모듈을 활성화합니다 ( "이전 노드 삭제"를 검색하여 모듈 이름 별 확인란을 클릭하고 저장을 클릭).
끝난! cron을 실행할 때마다 -2 주간 게시 된 노드 / 페이지 또는 현재 페이지가 삭제됩니다.
참고 : cron 실행 시간을 예약하려면 yoursite.com/admin/config/system/cron으로 이동하십시오.
테스트 :
노드를 작성하고 일반적으로 오른쪽 사이드 바에서 공개 날짜를 -2 주 또는 현재 보유한 날짜로 변경하십시오. yoursite.com/admin/config/system/cron에서 cron을 수동으로 실행하면 노드를 찾을 수 없습니다.
내가 사용하는 것이 hook_cron()
너무 구현을하지만, 다음 코드를 사용.
function mymodule_cron() {
$storage_handler = \Drupal::entityTypeManager()
->getStorage('node');
$query = \Drupal::entityQuery('node')
->accessCheck(FALSE)
->condition('created', strtotime('-2 week'), '<=');
$result = $query->execute();
if (!empty($result)) {
$nids = array_keys($result);
$nodes = $storage_handler->loadMultiple($nids);
$storage_handler->delete($nodes);
}
}
노드를 삭제하는 데 사용한 코드는 사용 중단 메시지 entity_delete_multiple()
에서 사용하도록 제안한 코드입니다.
또한 accessCheck(FALSE)
엔티티 쿼리가 익명 사용자가 액세스 할 수있는 노드 만 리턴하는 것을 피하기 위해 호출을 사용했습니다 . Cron 태스크는 익명 사용자로 실행됩니다.
그렇다면 삭제할 노드가 너무 많을 가능성이 있다면 cron 태스크가 실행될 때마다 삭제되는 노드 수를 제한합니다.
function mymodule_cron() {
$storage_handler = \Drupal::entityTypeManager()
->getStorage('node');
$query = \Drupal::entityQuery('node')
->accessCheck(FALSE)
->condition('created', strtotime('-2 week'), '<=')
->range(0,30);
$result = $query->execute();
if (!empty($result)) {
$nids = array_keys($result);
$nodes = $storage_handler->loadMultiple($nids);
$storage_handler->delete($nodes);
}
}
article
, 감사
hook_cron()
구현은 이미 호출 한 것처럼 range()
이전 구현과 다르게 수행합니다.
range()
내가 이해 하는 것처럼 cron 작업이 실행될 때마다 삭제되는 노드 수를 제한합니다. 하지만 30 개 노드 유형의 사이트가 있다고 가정 page
& article
... 2 주 이상 전에 생성 날짜와 어떻게 유형의 노드를 삭제하는 article
유형의 노드를 삭제하지 않고 page
? ... 내 겸손한 PHP 기술을 실례하지만 위 코드에서 그러한 구현을 볼 수 없었습니다! 감사합니다
나는 그렇게하려고 노력할 것이다.
나는 기회가 생길 때 그것을 테스트하려고 노력할 것입니다. 왜냐하면 3에서와 같이보기를 활용하는 것이 얼마나 쉽고 가능한지 확실하지 않기 때문입니다. 그러나 그것은 내가 처음 시작할 곳입니다. 물론 이것은 정확히 2 주가되었을 때 노드를 삭제하지는 않지만 Cron이 시스템에서 실행될 때에 달려 있다는 경고가 있습니다. 그러나 3 시간 이내에 충분하다고 가정합니다.
(방금 이것이 D8에 대한 것임을 알았습니다. 프로세스는 여전히 건전하다고 생각합니다.)