Làm thế nào để xóa tất cả các thuật ngữ trong một từ vựng với drush?


7

Như đã báo cáo ở đây, tôi gặp vấn đề lớn với các từ vựng lớn trong Drupal 7. Bây giờ tôi muốn làm trống các từ vựng lớn, nhưng tôi không thể làm điều đó thông qua giao diện quản trị viên, vì nó hết bộ nhớ, vì vậy nó không thể được tải hơn.

Làm cách nào tôi có thể xóa tất cả các thuật ngữ của một từ vựng tạo thành dòng lệnh bằng cách sử dụng drushvà MySQL?

Tôi biết, tôi có thể làm một cái gì đó như thế:

DELETE FROM `database`.`taxonomy_term_data` WHERE  `taxonomy_term_data`.`vid` = 17

Nhưng những gì tôi sẽ phải xóa?


bạn muốn loại bỏ một từ vựng một mình? hoặc một từ vựng và các mục của nó?
Aboodred1

@ Aboodred1 chỉ các mục của nó, nhưng cùng với tất cả mọi thứ thuộc về các mục đó, như sử dụng trong các trường, v.v.
user5950

Đừng chạy truy vấn đó. Những điều tồi tệ sẽ xảy ra.
mpdon Arena

@MPD Ok hơn, nhưng làm thế nào tôi có thể xóa các điều khoản đó? Điều này phải có thể một số làm thế nào.
dùng5950

Câu trả lời:


6

Chưa được kiểm tra; sử dụng cho cảm hứng và thử nghiệm:

<?php

$vid = 17;

$tree = taxonomy_get_tree($vid);

if (count($tree) == 0) {
  print "Nothing to delete.\n";
}
else {
  $tree = array_slice($tree, 0, 1000);

  foreach ($tree as $term) {
    print 'Deleting tid ' . $term->tid . "\n";
    taxonomy_term_delete($term->tid);
  }
}

Đặt cái này vào tập tin riêng của nó và thực thi như

drush -u 1 scr nuke_vid_18.php

Tiếp tục chạy cho đến khi nó không hiển thị bất cứ điều gì như đã xóa. Có array_sliceđể hạn chế mọi thứ để bạn không bị hết bộ nhớ. Bạn có khả năng có thể tiết kiệm một số bộ nhớ bằng cách truy vấn trực tiếp, nhưng taxonomy_get_tree()không hiệu quả khủng khiếp miễn là bạn không thực hiện tải đầy đủ.

Sao lưu cơ sở dữ liệu của bạn drush sql-dumpđể đề phòng trước khi bạn làm bất cứ điều gì như thế này.


5

Tôi đã những mô-đun: Drush và Devel Đối với loại trừ tất cả về phân loại, sử dụng generate-ngữ lệnh:

drush tạo thuật ngữ you_vocellect_name 0 --kill

Thay đổi your_vocellect_name thành tên của từ vựng bạn cần xóa các thuật ngữ


Giải pháp khá dễ dàng. cảm ơn. Tại sao - giết?
xaa

2

Bạn có thể sử dụng lệnh sau:

drush -v eval 'foreach(taxonomy_get_tree(123) as $term) { taxonomy_term_delete($term->tid); }'

Trong đó 123 là id từ vựng của bạn mà bạn nên thay đổi.

Nếu nó không hoạt động, hãy đảm bảo rằng bạn xóa bộ nhớ cache của mình (ví dụ: memcached).

Bạn có thể lấy vidtên từ vựng của mình bằng lệnh sau:

drush sqlq "SELECT name, vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name'"

Xem thêm:


2

Bạn cũng có thể sử dụng mô-đun https://www.drupal.org/project/taxonomy_multidelete_terms để xóa các điều khoản phân loại.

Mô-đun này cho phép xóa nhiều thuật ngữ cùng một lúc. Bạn cần chọn điều khoản và nhấp vào nút xóa. Tất cả các điều khoản được chọn sẽ bị xóa. Bạn cũng có thể xóa tất cả các điều khoản cùng một lúc.


Xin chào và chào mừng đến với Câu trả lời của Drupal :) Nếu bạn tham khảo một mô-đun, bạn có thể vui lòng bao gồm một số tóm tắt hoặc mô tả từ trang mô-đun không? Điều đó mang lại cho OP và những người khác một dấu hiệu tốt hơn về nơi bạn đang liên kết đến. Cảm ơn!
Neograph734

1

Ngoài mã @mpdonadio, tôi chỉ cần thêm đoạn mã để tải vid theo tên của từ vựng. Tôi hy vọng nó có thể giúp ai đó tiết kiệm thời gian.

$voca = "forums";
$vobj=taxonomy_vocabulary_machine_name_load("forums");
$vid = $vobj->vid;

$tree = taxonomy_get_tree($vid);

if (count($tree) == 0) {
    print "Nothing to delete.\n";
}
else {
   $tree = array_slice($tree, 0, 1000);

   foreach ($tree as $term) {
    print 'Deleting tid ' . $term->tid . "\n";
    taxonomy_term_delete($term->tid);
   }
}

0

Bạn có thể tạo một lệnh drush có tên vocabulary-clean. Tạo một mô-đun có tên drush_taxonomy, bên trong drush_taxonomy.drush.inctệp đặt mã này:

<?php
/**
 * @file
 * Drush commands related to taxonomy.
 */

/**
* Implements hook_drush_command().
*/
function drush_taxonomy_drush_command() {
  $items['vocabulary-clean'] = array(
    'description' => dt("Delete all terms in a vocabulary."),
    'aliases' => array('vc'),
    'arguments' => array(
      'name' => dt('The vocabulary names to clean.'),
    ),
    'examples' => array(
      'drush vocabulary-clean tags' => dt('Delete all the terms in tags vocabulary'),
      'drush vocabulary-clean tags test' => dt('Delete all the terms in tags and test vocabularies'),

    ),
  );
  return $items;
}

/**
 * Callback for the vocabulary clean command.
 */
function drush_drush_taxonomy_vocabulary_clean() {
  $names = func_get_args();

  if (!empty($names)) {
    // Check for duplicate ids.
    $test_names = array_unique($names);
    if (count($test_names) != count($names)) {
      drush_set_error('DRUSH_VOCABULARY_CLEAN_ERROR', dt('You have duplicate vocabulary names.'));
      return;
    }
    //Searching the vocabularies in the site
    $vocabulary_in_db = array_column(taxonomy_get_vocabularies(), 'machine_name');
    $vocabulary_non_existent = array_diff($names, $vocabulary_in_db);
    $vocabulary_existent = array_diff($names, $vocabulary_non_existent);

    if(count($vocabulary_existent) == 0) {
      drush_set_error('DRUSH_VOCABULARY_CLEAN_ERROR', dt("The desired vocabularies to clean doesn't exists."));
      return;
    }

    if(count($vocabulary_non_existent)) {
      drush_print(dt("Non-existent vocabularies:"));
      drush_print(implode(' ', $vocabulary_non_existent));
    }

    foreach ($vocabulary_existent as $name) {
      $vid = taxonomy_vocabulary_machine_name_load($name)->vid;
      foreach(taxonomy_get_tree($vid) as $term) {
        taxonomy_term_delete($term->tid);
      }
    }

    drush_print(dt("Vocabularies cleaned:"));
    drush_print(implode(' ', $vocabulary_existent));
  }
  else {
    drush_set_error('DRUSH_VOCABULARY_CLEAN_ERROR', dt("You must enter at least one vocabulary name."));
  }
}

Cài đặt mô-đun, chạy drush cc drushđể xóa bộ đệm ẩn và sử dụng lệnh như thế này:

drush vc tags

hoặc là

drush vocabulary-clean tags

Nếu bạn muốn thêm một bí danh khác vào lệnh, hãy thêm các phần tử vào mảng bí danh như thế này:

'aliases' => array('vc', 'voc-clean', 'clean'),

Và bạn có thể sử dụng các lệnh này:

drush vc tags
drush voc-clean tags
drush clean tags

Luôn luôn đầu ra sẽ là:

Vocabularies cleaned:
tags

@ user5950 bạn đã thử câu trả lời của tôi chưa?
Adrian Cid Almaguer

0

Giả sử API thực thể được cài đặt, chúng ta có thể sử dụng entity_delete_multipl, tốc độ này sẽ nhanh hơn xóa mỗi lần.

define("MY_VOCAB", "tags");

function _custom_zap_vocab() {
  $vocab = taxonomy_vocabulary_machine_name_load(MY_VOCAB);

  $tree = taxonomy_get_tree($vocab->vid);

  $tids = array_map(function($term){
    return $term->tid;
  }, $tree);

  entity_delete_multiple('taxonomy_term', $tids);
}

0

Ngày nay, thật dễ dàng để làm điều này với Drupal Console. Ví dụ: xóa tất cả các thuật ngữ của từ vựng "thẻ"

phân loại drupal: hạn: xóa thẻ

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.