Câu trả lời:
Bạn có thể tạo một chức năng như sau:
function MYMODULE_delete_all_the_things() {
$query = new EntityFieldQuery;
$result = $query->entityCondition('entity_type', 'node')
->propertyCondition('type', 'YOUR-CONTENT-TYPE')
->execute();
if (isset($result['node']) && count($result['node'])) {
$node_ids = array_keys($result['node']);
node_delete_multiple($node_ids);
}
}
Lưu ý - Bạn cũng có thể sử dụng một SELECT
truy vấn đơn giản , nhưng khi bạn làm việc với các thực thể, việc sử dụng EntityFieldQuery có vẻ hợp lý / thông thường hơn .
Điều này cũng khá dễ dàng để thay đổi hoặc thêm đối số. Bạn cũng có thể đặt nó trong lệnh Drush khá dễ dàng - có một ví dụ về cách thực hiện việc này trong kho lưu trữ Drush (kiểm tra phần Lệnh gần phía dưới).
Cài đặt mô-đun phát và sử dụng drush để xóa tất cả các nút,
$ drush genc --kill 0 0
Bạn cũng có thể cung cấp một tùy chọn loại,
$ drush genc --kill --types=article 0 0
devel_generate
mô-đun được bao gồm với devel, nhưng cần phải được kích hoạt với drush en devel_generate
genc thường được sử dụng để tạo ra các nút, do đó 0 0 ở cuối là nói cho nó không tạo ra bất cứ điều gì mới, và các --kill để loại bỏ những gì đã có.
Tôi đoán bạn có thể bằng cách sử dụng lệnh dưới đây
drush node_delete <nid>
EDIT: Tìm thấy một mô-đun làm một cái gì đó / liên quan đến câu hỏi
http://drupal.org/project/delete_all
Sử dụng
Drush
drush delete-all
Thí dụ: drush delete-all article
delete_all
chưa được chuyển sang Drupal 8 , nhưng câu trả lời genc hoạt động.
Một cái gì đó như thế này sẽ làm việc (chưa được kiểm tra):
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node', '=')
->entityCondition('bundle', 'Announcements')
->execute();
$nids = array_keys($entities['node']);
node_delete_multiple($nids);
Điều này sẽ tìm thấy tất cả các nút có loại nội dung Annoucements
bằng cách sử dụng EntityFieldQuery()
. Sau đó, nó nhận được tất cả $nids
từ kết quả và xóa chúng bằng cách sử dụng node_delete_multiple()
.
Bạn có thể lấy mã này, đặt nó vào một tệp PHP riêng biệt và sau đó thực thi nó với drush scr
.
Sử dụng API sẽ đảm bảo rằng tất cả các móc thích hợp sẽ kích hoạt. Ngoài ra, họ cũng sẽ xóa các bản sửa đổi nút và dữ liệu trường (và bản sửa đổi của chúng) để bạn không có dữ liệu mồ côi trong cơ sở dữ liệu.
Có một số ý tưởng tốt về chủ đề này. Nếu bạn không muốn thực hiện bất kỳ chương trình nào thực sự và muốn sử dụng Drush, bạn có thể xem mô-đun Xóa Tất cả đóng góp:
Drush xóa sạch tất cả Ví dụ: drush xóa tất cả bài viết Drush trên phiên bản Drupal 7 Xóa tất cả các nút, nút của một loại nội dung cụ thể hoặc người dùng. Ví dụ: drush xóa tất cả bài viết Chọn tất cả các nút bài viết. xóa sạch tất cả các nút Xóa tất cả các loại. drush xóa-all --reset Xóa các loại nút và đặt lại nút, sửa đổi và nhận xét. xóa sạch tất cả người dùng Xóa người dùng. Tùy chọn: --reset Đặt lại bộ đếm cho các nút, bảng sửa đổi và nhận xét. - vai trò chọn Bí danh: da
VBO có tích hợp Drush. Tạo chế độ xem VBO của các nút, thực hiện nó thông qua Drush (sử dụng drush vbo-execute
), chuyển loại nút làm đối số.
Bạn cũng có thể tạo một tập lệnh drush (giả sử nó được gọi là "Bulk_delete.php" và được đặt trong thư mục gốc Drupal):
#!/usr/bin/env drush
$res = db_delete('node')
->condition('type', 'mycontenttype', '=')
->execute();
echo "deleted:" . $res;
Đây hoàn toàn là cách nhanh nhất để làm điều đó: truy vấn trực tiếp tới db, sử dụng hàm db_delete của Drupal
Sử dụng:
:~# cd /var/www/www.mysite.com
:~# drush --uri=www.mysite.com scr bulk_delete.php
Tài liệu: https://api.drupal.org/api/drupal/includes!database!database.inc/feft/db_delete/7
Cảnh báo: quá trình này không xóa dữ liệu của các trường của họ. Dù sao, quá trình tương tự có thể được áp dụng cho các trường này (nhìn vào cột "bó" của từng trường). Ví dụ:
#!/usr/bin/env drush
$field_tables = array(
'field_data_field_body',
'field_data_field_mycoolfield',
'field_revision_body',
'field_revision_field_mycoolfield'
);
foreach ($field_tables as $field_table) {
$res = db_delete($field_table)
->condition('bundle', 'mycontenttype', '=')
->execute();
echo "deleted:" . $res . "\n\n";
}
Trong đó "mycontenttype" là cái được sử dụng trong truy vấn đầu tiên.
'nid' > 5000
?
Drupal 7
Hãy thử một lớp lót sau, nó sẽ loại bỏ tất cả các nút MyContentType khỏi Drupal:
drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'
Hoặc bạn có thể xóa tất cả các thực thể dựa trên tên loại thực thể (ví dụ: nút):
drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->execute(); entity_delete_multiple("node", array_keys(reset($res)));'
Lưu ý: node
là tên loại thực thể của bạn, bạn có thể thay đổi nó nếu cần.
Nếu bạn gặp lỗi bộ nhớ hoặc hết thời gian, bạn có thể thêm các bộ sau ngay trước $res
:
ini_set('memory_limit', -1); ini_set('max_execution_time', 0);
Để xóa tất cả các nút của một loại nội dung cụ thể, bạn có thể thử chạy lệnh sau qua drush:
drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'
Trong đó MyContentType là tên Loại nội dung của máy (ví dụ Trang).
Đối với các nút riêng lẻ:
$ drush php-eval 'node_delete($node->nid);'
drush php-eval
Đánh giá mã php tùy ý sau khi bootstrapping Drupal
Bạn có thể dùng
drush node_delete NID
để xóa nút cụ thể, nhưng nếu bạn muốn xóa tất cả các nút theo loại nội dung, tôi đoán bạn có thể tạo một plugin drush bằng cách sử dụng lô api.
Bạn cũng có thể làm điều này với mô-đun phát như đã trả lời tại Tôi có thể xóa các nút của một loại nội dung nhất định bằng Drush không?
Cài đặt mô-đun phát và sử dụng drush để xóa tất cả các nút,
$ drush genc - giết 0 0
Bạn cũng có thể cung cấp một tùy chọn loại,
$ drush genc --kill --types = bài viết 0 0
Cập nhật câu trả lời được cung cấp bởi @kenorb.
Trong Drupal 8
drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'