X 주 후에 작성된 노드 삭제


14

예를 들어 2 주가 지난 후 노드를 어떻게 삭제합니까?

답변:


18

개발자 중심 솔루션을 찾고 있다면 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();
  }
}

drupal 8의 규칙으로 어떻게 할 수 있습니까?
RobinSon

1
이는 의도적으로 사이트 작성기 / 규칙 기반 접근 방식과 다른 접근 방식입니다. @UnsettlingTrend에게 그에 대한 답변을 업데이트하도록 요청하고 싶습니다. 아직 D8의 규칙을 시도하지 않았으므로 해당 모듈을 기반으로 솔루션에 말할 수 있습니다.
Shawn Conn

7
$ nodes = $ storage-> loadMultiple ($ nids)을 사용한 다음 $ storage-> deleteMultiple ($ nodes)를 사용하는 것이 약간 빠르지 만 수십 개의 노드를 삭제하지 않는 한 큰 문제는 아닙니다.
Berdir

@SiMoNe 아직 할 수 없습니다. 아직 규칙 스케줄러 모듈이 없으며 규칙 8은 프로덕션 준비가되지 않았습니다.
No Sssweat

1
수평 확장을 위해 대기열 기반 접근 방식을 작성합니다. 규칙이 필요하지 않습니다.
케빈

4

Shawn Conn의 답변을 바탕으로 초보자를위한 완벽한 솔루션은 다음과 같습니다.

  1. 루트 파일 디렉토리로 이동하여 "delete_old_nodes"폴더를 작성하십시오.
  2. 방금 만든 폴더에 "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
  3. "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();
      }
    }
    
    ?>
  4. 캐시를 플러시 한 다음 모듈 페이지 (yoursite.com/admin/modules)로 이동하여 모듈을 활성화합니다 ( "이전 노드 삭제"를 검색하여 모듈 이름 별 확인란을 클릭하고 저장을 클릭).

  5. 끝난! cron을 실행할 때마다 -2 주간 게시 된 노드 / 페이지 또는 현재 페이지가 삭제됩니다.

  6. 참고 : cron 실행 시간을 예약하려면 yoursite.com/admin/config/system/cron으로 이동하십시오.

테스트 :

노드를 작성하고 일반적으로 오른쪽 사이드 바에서 공개 날짜를 -2 주 또는 현재 보유한 날짜로 변경하십시오. yoursite.com/admin/config/system/cron에서 cron을 수동으로 실행하면 노드를 찾을 수 없습니다.


닫기?>가 필요하지 않습니다. 일부 서버 설정에서 오류가 발생합니다. QueueAPI를 사용하여보다 체계적인 설정을하는 것이 좋습니다. 삭제 할 수천 또는 수백 개의 노드가있는 경우 위의 cron op 내에서 시스템을 중단시키지 않습니다. sitepoint.com/…
Kevin

허. ?>가 없으면 코드가 작동하지 않습니다.
Chris Happy

2

내가 사용하는 것이 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);
  }
}

나는이 질문이 오래되었다는 것을 알고 있지만 @kiamlaluno 귀하의 답변이 시간을 절약했습니다! 대신,이 하나의 중복이 될 것입니다 새 질문을 게시의 더 많은 종류의 노드에 노드의 삭제를 제한하는 방법에 대해 자세히 설명해 수 article , 감사
엘리 Masaad에게

표시된 마지막 hook_cron()구현은 이미 호출 한 것처럼 range()이전 구현과 다르게 수행합니다.
kiamlaluno

range()내가 이해 하는 것처럼 cron 작업이 실행될 때마다 삭제되는 노드 수를 제한합니다. 하지만 30 개 노드 유형의 사이트가 있다고 가정 page& article... 2 주 이상 전에 생성 날짜와 어떻게 유형의 노드를 삭제하는 article유형의 노드를 삭제하지 않고 page? ... 내 겸손한 PHP 기술을 실례하지만 위 코드에서 그러한 구현을 볼 수 없었습니다! 감사합니다
Elie Masaad

0

나는 그렇게하려고 노력할 것이다.

  1. 2 주 이상 된 모든 노드에 대한보기 작성
  2. Cron 유지 보수에서 실행할 시스템 규칙 작성
  3. 규칙 구성에서 해당보기 결과를 반복하는 루프를 작성하십시오.
  4. 각 노드를 삭제

나는 기회가 생길 때 그것을 테스트하려고 노력할 것입니다. 왜냐하면 3에서와 같이보기를 활용하는 것이 얼마나 쉽고 가능한지 확실하지 않기 때문입니다. 그러나 그것은 내가 처음 시작할 곳입니다. 물론 이것은 정확히 2 주가되었을 때 노드를 삭제하지는 않지만 Cron이 시스템에서 실행될 때에 달려 있다는 경고가 있습니다. 그러나 3 시간 이내에 충분하다고 가정합니다.

(방금 이것이 D8에 대한 것임을 알았습니다. 프로세스는 여전히 건전하다고 생각합니다.)


입력 한 후에야 D8을 깨닫지 못했습니다. 나는 규칙이 D8에 대해 안정적인 알파임을 알고 있습니다. 아직 시도하지 않았습니다.
UnsettlingTrend

나는 규칙의 dev 버전으로 갔다. 내가 시도한 것에 대해서는 안정적으로 보였지만 뷰 결과를 반복하는 데 사용할 Views Rules 모듈의 D8 버전이없는 것 같습니다. 내가 생각할 수없는 규칙으로보기를 얻는 방법이 있다면 효과가있을 수 있습니다. 그렇지 않으면 확실하지 않습니다.
UnsettlingTrend
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.