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?


14

Chỉ cần tự hỏi nếu Drush có khả năng xóa các nút của một loại nội dung nhất định.

Cái gì đó như: $ drush delete-node --type=MyContentType

Nếu không thể, tôi có thể tạo một phương thức như vậy không?

Câu trả lời:


5

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 SELECTtruy 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).


Tôi thấy, có vẻ như liên kết kho lưu trữ cho thấy làm thế nào để thêm một phương thức drush đúng cách.
Chefnelone

Vâng Readme có một số cách khác nhau mà bạn có thể thực hiện chúng là tốt!
Chapabu

22

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

Thông minh, tôi thích nó.
m4olivei

3
Điều này hoạt động với D8. Các devel_generatemô-đ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ó.
William Turrell

16

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


Tôi có nghĩa là để xóa tất cả các nút theo loại nội dung.
Chefnelone

Bạn đã thử mô-đun này drupal.org/project/delete_all Cách sử dụng Drush drush xóa-all Ví dụ: drush xóa-all article
ninjascorner

nơi tôi có thể tìm thấy lệnh drush node_delete <nid>?
Adrian Cid Almaguer

Để tiết kiệm thời gian của mọi người, kể từ tháng 12 năm 2016, delete_all chưa được chuyển sang Drupal 8 , nhưng câu trả lời genc hoạt động.
William Turrell

6

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 Annoucementsbằng cách sử dụng EntityFieldQuery(). Sau đó, nó nhận được tất cả $nidstừ 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.


6

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

5

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ố.


Tôi nghĩ rằng đây là những gì tôi cần. Chỉ cần 2 câu hỏi: Phương pháp drush để thực hiện một khung nhìn là gì? và phương pháp này có nhanh hơn việc thực hiện chế độ xem trong trình duyệt không?
Chefnelone

Chỉnh sửa câu trả lời để xác định lệnh drush chính xác. Và vâng, nó sẽ nhanh hơn vì cách này không được hiển thị.
Bojan Zivanovic


2

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.


Tại sao điều kiện 'nid' > 5000?
ЕЕннн

đó là một ví dụ, giống như kiểu.
Mauro Mascia

Nhưng poster ban đầu không đề cập đến một điều kiện như vậy, đó là lý do tại sao tôi nghĩ rằng ví dụ này không liên quan, do đó gây hiểu lầm.
ЕЕннн

2

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 ý: nodelà 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);

2

Để 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).


2

Đố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


Vui lòng thêm một số chi tiết để giải thích mã của bạn, mà không có điều này có thể được coi là một câu trả lời chất lượng thấp (và do đó nó có thể bị xóa thông qua kiểm duyệt).
Pierre.Vriens

1

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.


Tôi không thể tìm thấy lệnh NID drush node_delete.
Adrian Cid Almaguer


1

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);'

drush ev '$ type =' \ '' nút '\' '; entity_delete_mult Môn ($ type, \ Drupal :: entityQuery ($ type) -> exec ()); '
geek-merlin

Để cập nhật câu trả lời hiện có, vui lòng gửi bình luận để đề xuất chỉnh sửa.
leymannx
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.