Làm thế nào để xóa tất cả các nút của một loại nội dung nhất định?


31

Tôi có vài nghìn nút của một loại nội dung cụ thể. Sử dụng giao diện web (example.com/admin/content), tôi chỉ có thể xóa khoảng 50 lần. Làm thế nào tôi có thể nhanh chóng xóa chúng?

Câu trả lời:


32

Có một mô-đun cho điều đó (TM).

Xem Xóa hàng loạt .

Điều đó sẽ sử dụng API Batch để xóa các nút để tránh các vấn đề về thời gian chờ hoặc bộ nhớ khi xóa hàng ngàn nút với một lệnh gọi đến node_delete_mult Môn ().

Xóa hàng loạt là một mô-đun bị bỏ rơi. Xem để thay thế:


Wow, tôi hoàn toàn bỏ lỡ cái này Tìm tốt
Greg

4
Một phương pháp khác, có thể hữu ích nếu bạn đang thực hiện nhiều hơn một bộ lọc loại nội dung đơn giản, là sử dụng Lượt xem Hoạt động hàng loạt: drupal.org/project/view_bulk_operations
ge Muffguy

Mô-đun Xóa hàng loạt bị bỏ rơi ngay bây giờ. Nó được đề xuất ở đó để sử dụng Lượt xem hoạt động hàng loạt.
Refineo

26

Nhìn vào mô-đun Devel Generate để lấy cảm hứng, đây là chức năng "giết nội dung" của nó devel_generate_content_kill:

function devel_generate_content_kill($values) {
  $results = db_select('node', 'n')
              ->fields('n', array('nid'))
              ->condition('type', $values['node_types'], 'IN')
              ->execute();
  foreach ($results as $result) {
    $nids[] = $result->nid;
  }

  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(t('Deleted %count nodes.', array('%count' => count($nids))));
  }
}

Vì vậy, tôi sẽ thử sử dụng Devel Generate để xóa tất cả các nút nhưng không tạo nút mới hoặc sử dụng example.com/devel/php để gọi devel_generate_content_kill(array('node_types' => array('my_node_type')));trực tiếp.


17

Trong Drupal 8, một cách là sử dụng phương thức entityQuery () với phương thức EntityStorageInterface :: xóa () :

$result = \Drupal::entityQuery("node")
    ->condition("type", "YOUR_CONTENT_TYPE_NAME")
    // If the update is being executed via drush entityQuery will only
    // return the content uid 0 have access to. To return all set
    // accessCheck to false since it defaults to TRUE. 
    ->accessCheck(FALSE)
    ->execute();

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);

Nếu bạn cần áp dụng các bộ lọc / điều kiện khác, bạn có thể kiểm tra trang giao diện QueryInterface

EDIT (Cách khác, nhờ @ 4k4 ):

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);

Nếu bạn muốn kiểm tra mã bạn có thể sử dụng:

drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'

Điều này sẽ xóa tất cả các bài viết của bạn.


Điều này không chính xác, xóa () mong đợi các thực thể được tải, không phải ID, đó là những gì truy vấn thực thể trả về. Thay vì kết quả $ không mô tả, hãy sử dụng $ ids hoặc $ nids và sau đó $ Storage-> xóa ($ Storage-> load ($ ids)).
Berdir

@Berdir cảm ơn, tôi sẽ kiểm tra lại mã, có thể vấn đề này đã được giới thiệu trong một lần chỉnh sửa
Adrian Cid Almaguer

@Berdir Tôi cập nhật câu trả lời và tôi kiểm tra mã và nó hoạt động, vấn đề được đưa ra trong một lần chỉnh sửa.
Adrian Cid Almaguer

2
@AdrianCidAlmaguer, bạn có thể thay thế truy vấn bằng$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
Gần đây đã sử dụng điều này trong một bản cập nhật, điều đáng chú ý là nếu bạn sử dụng, entityQuery bạn nên đặt accessCheckcâu lệnh trên. Mặt khác, nếu bạn chạy nó trong drush, theo mặc định accessCheck được đặt thành true và bất kỳ nút nào mà uid 0 không có quyền truy cập sẽ không được trả về.
awm

13

Nếu bạn muốn thực hiện nó hoàn toàn thông qua giao diện người dùng, bạn có thể sử dụng mô-đun devel_generate.

  1. Điều hướng đến menu "Tạo nội dung" trong "Cấu hình" (admin / config / Development / created / content).
  2. Chọn loại nội dung bạn muốn xóa.
  3. Đảm bảo hộp kiểm bên cạnh "Xóa tất cả nội dung trong các loại nội dung này trước khi tạo nội dung mới" được chọn.
  4. Đặt số lượng nút bạn muốn tạo thành "0".

Bằng cách này, không có nút nào được tạo và tất cả các nút của các loại đã chọn sẽ bị xóa.


10

Tạo một tệp với mã dưới đây trong root của cài đặt drupal và thực thi tệp.

<?php
  require_once './includes/bootstrap.inc';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

  $aquery= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'company'");
  while ($row = db_fetch_object($aquery)) {
    node_delete($row->nid);
  }
?>

1
db_fetch_object không phải là một phần của api cơ sở dữ liệu D7.
ya.teck

10

Bạn có thể thực hiện điều này trong Drupal 7 bằng cách sử dụng phần Mã PHP thực thi của mô-đun Devel bằng cách nhập:

$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
  node_delete($record->nid);
}

1
Điều này sẽ thực thi rất chậm, nếu bạn cần xóa hàng ngàn nút, tốt hơn là sử dụng phương thức sử dụng API hàng loạt như VBO.
abielefeldt

6

Làm điều này trong thiết bị đầu cuối, nếu bạn sử dụng Drush và xóa tất cả các mô-đun:

 drush delete-all [content-type-machine-name]


Examples:
 drush delete-all article             Delect all article nodes.
 drush delete-all all                 Delete nodes of all types.
 drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.
 drush delete-all users               Delete users.

Options:
 --reset                              Reset counter for node, revision and comment tables.
 --roles                              pick roles

5

Lượt xem Hoạt động hàng loạt cung cấp màn hình quản trị nút có thể định cấu hình BatchAPI, cho phép lọc theo loại, lựa chọn tất cả các nút phù hợp với tiêu chí tìm kiếm của bạn, v.v.

Đó là giải pháp tuyệt vời của tôi trong Drupal 6 - ngoài việc xóa hàng loạt, bạn có thể chỉnh sửa hàng loạt các nút và thực hiện một loạt các công cụ khác.

Có vẻ như phiên bản Drupal 7 chưa sẵn sàng - nhưng tôi đang xem mô-đun đó để phát hành D7.


4

Một đoạn khác là:

$query = db_query("SELECT n.nid FROM {node} n WHERE n.type = 'TO_BE_DELETED'"); 
while ($n = db_fetch_object($query)) 
{
     node_delete($n->nid); 
} 

nơi TO_BE_DELETEDlà loại nội dung bị xóa.


3
Cần lưu ý rằng chỉ hoạt động cho Drupal 4.6, 5 và 6. Phiên bản Drupal 7 làdb_delete('node')
Greg

4

Với mô-đun Devel, sử dụng drush:

drush genc 0 --types=article --kill

Hoặc trong giao diện người dùng như được giải thích tại đây: http://befuse.com/drupal/delete-nodes-devel


Đó là mô-đun con Devel devel_generatecần được kích hoạt. Và đối với nhiều loại, đó làdrush genc 0 --kill --types="article, page"
leymannx

3

Tôi sử dụng Xóa tất cả các mô-đun, nó hoạt động tốt với D8 và cung cấp các lệnh drush rất hữu ích. Ví dụ: để xóa tất cả nội dung của articleloại nội dung:

drush delete-all article  

Cái này có hoạt động với D8 không? Tôi đã kích hoạt mô-đun nhưng tôi nhận được lệnh drush 'xóa tất cả bài viết'. Tôi cũng đã xóa bộ đệm cache
Yassin Tahtah

1

Bạn có thể thử Xóa tất cả mô-đun, điều hướng đến 'admin / content / xóa_content' và bạn sẽ được cung cấp một biểu mẫu để xóa nội dung thuộc về một số loại nội dung nhất định.

Trân trọng



0

Mô-đun này được sử dụng để xóa tất cả nội dung và / hoặc người dùng khỏi một trang web. Đây chủ yếu là một công cụ dành cho nhà phát triển, có thể có ích trong một số trường hợp

https://www.drupal.org/project/delete_all

như mô-đun Xóa hàng loạt sẽ xóa bất kỳ nút nào của một loại nút nhất định bằng cách sử dụng lô api. Bạn nên sử dụng mô-đun Operations Batch Operations (VBO) cho một số lượng nhỏ các nút. Nhưng nếu bạn phải xóa 10.000 nút, mô-đun này có thể là một lựa chọn tốt hơn.

https://www.drupal.org/project/bulkdelete


0

Xóa tất cả các nút của loại nội dung theo chương trình ở đây là một hàm trợ giúp:


function _delete_all_nodes_of_type($type = '') {
  // Return all nids of nodes of type.
  $nids = db_select('node', 'n')
    ->fields('n', array('nid'))
    ->condition('n.type', $type)
    ->execute()
    ->fetchCol(); // returns an indexed array
  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(format_plural(count($nids), count($nids) . ' node Deleted.', count($nids) . ' nodes Deleted.'));
  }
}


-1

Tôi đã kết thúc bằng db_delete , không yêu cầu mô-đun:

<?php
  db_delete('node')
    ->condition('type', 'MY_CONTENT_TYPE')
    ->execute();
?>

Chỉnh sửa / Cảnh báo: Xem bình luận của Berdir bên dưới. Phương pháp này không dọn sạch tất cả dữ liệu liên quan đến các nút.


3
Vấn đề với phương pháp này là các mô-đun khác không thể phản ứng và xóa thông tin của họ. Tùy thuộc vào loại nội dung, có bảng thông tin cụ thể của nút trong bảng content_type của nút đó, các trường, phân loại (thực tế cũng là một trường), bình luận, v.v. Vì vậy, bạn có thể kết thúc với rất nhiều thông tin cũ trong cơ sở dữ liệu của bạn.
Berdir

@Berdir - Thú vị. Có cách tích hợp tốt hơn để xóa các nút không?
Greg

3
Có node_delete () và node_delete_mult Môn (), xem câu trả lời của tim.plunket, nhưng không được thiết kế để xử lý hàng ngàn nút, xem api.drupal.org/api/drupal/modules--node--node.module/feft / Lọ . Nó tải tất cả các nút và sau đó lặp lại chúng trong một yêu cầu. Vì vậy, khá nhiều phải sử dụng một mô-đun đóng góp như hàng loạt nếu bạn muốn xóa hàng trăm hoặc hàng ngàn nút.
Berdir

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.