Drupal: объединение терминов таксономии с массивными дубликатами

У меня есть база данных, которая использовалась в исследовательских целях. К сожалению, во время этого исследования алгоритму было разрешено работать слишком долго, что непреднамеренно создавало дублирующие термины таксономии вместо повторного использования исходного TID для первого экземпляра термина.

Чтобы исправить это, была предпринята попытка использовать модули "term_merge" и "taxonomy_manager". "term_merge" предлагает интерфейс для удаления дубликатов и может устанавливать ограничения на количество загружаемых терминов за один раз, чтобы предотвратить исчерпание лимита памяти сервера базы данных. Однако в моем случае использования я даже не могу загрузить экран конфигурации, расположенный в /admin/structure/taxonomy/[My-Vocabulary]/merge, тем более интерфейс дубликатов, найденный в / admin / structure / taxonomy / [My -Locabulary]/merge/duplicates, поскольку оба они исчерпывают ограничение памяти, несмотря на то, что ограничение установлено на 1024M.

Чтобы обойти это, я написал собственный модуль, который вызывает функцию term_merge, найденную в модуле term_merge. Поскольку в этом проекте есть только один узел узла, который использует рассматриваемый словарь таксономии, я могу безопасно написать свою собственную логику для объединения повторяющихся терминов без необходимости использовать функции, предоставляемые модулем term_merge, но я бы хотел использовать его так, как он предназначен для этой цели и, теоретически, обеспечивает более безопасный процесс.

Мой модуль обеспечивает обратный вызов страницы, а также логику для получения списка TID, которые относятся к дублированному термину таксономии. Вот код, который содержит вызов функции term_merge:

//Use first element, with lowest TID value, as the 'trunk'
// which all other terms will be merged into

$trunk = $tids[0];

//Remove first element from branch array, to ensure the trunk 
//is not being merged into itself

array_shift($tids);

//Set the merge settings array, similarly to the default values 
//which are given in _term_merge_batch_process of term_merge.batch.inc

$merge_settings = array(
  'term_branch_keep' => FALSE,
  'merge_fields' => array(),
  'keep_only_unique' => TRUE,
  'redirect' => -1,
  'synonyms' => array(),
);

term_merge($tids, $trunk, $merge_settings);

Это не приводит к каким-либо объединенным условиям, а также не предоставляет никаких ошибок или уведомлений в Watchdog или журналах веб-сервера.

Я также попытался вызвать term_merge для каждого отдельного дублируемого TID, а не использовать массив TID в целом.

Я был бы признателен за любую информацию о том, как лучше всего использовать функции term_merge программно, или альтернативу, которая позволит мне удалить много повторяющихся терминов из большой базы данных, где некоторые термины содержат тысячи дубликатов.

Для справки, вот комментарии, которые предоставляют информацию о параметрах, взятых в term_merge, найденном в term_merge.module предоставленного модуля term_merge:

/**
 * Merge terms one into another using batch API.
 *
 * @param array $term_branch
 *   A single term tid or an array of term tids to be merged, aka term branches
 * @param int $term_trunk
 *   The tid of the term to merge term branches into, aka term trunk
 * @param array $merge_settings
 *   Array of settings that control how merging should happen.     Currently
 *   supported settings are:
 *     - term_branch_keep: (bool) Whether the term branches should not be
 *       deleted, also known as "merge only occurrences" option
 *     - merge_fields: (array) Array of field names whose values should be
 *       merged into the values of corresponding fields of term trunk (until
 *       each field's cardinality limit is reached)
 *     - keep_only_unique: (bool) Whether after merging within one field only
 *       unique taxonomy term references should be kept in other entities. If
 *       before merging your entity had 2 values in its taxonomy term reference
 *       field and one was pointing to term branch while another was pointing to
 *       term trunk, after merging you will end up having your entity
 *       referencing to the same term trunk twice. If you pass TRUE in this
 *       parameter, only a single reference will be stored in your entity after
 *       merging
 *     - redirect: (int) HTTP code for redirect from $term_branch to
 *       $term_trunk, 0 stands for the default redirect defined in Redirect
 *       module. Use constant TERM_MERGE_NO_REDIRECT to denote not creating any
 *       HTTP redirect. Note: this parameter requires Redirect module enabled,
 *       otherwise it will be disregarded
 *     - synonyms: (array) Array of field names of trunk term into which branch
 *       terms should be added as synonyms (until each field's cardinality limit
 *       is reached). Note: this parameter requires Synonyms module enabled,
 *       otherwise it will be disregarded
 *     - step: (int) How many term branches to merge per script run in batch. If
 *       you are hitting time or memory limits, decrease this parameter
 */

1 ответ

Решение

Казалось бы, поскольку функция term_merge была разработана с намерением, которое будет использоваться внутри функции для обработки отправки формы, мой пользовательский модуль использует ее так, что не удается вызвать batch_process.

Явный вызов следующего решает это:

batch_process()

Не нужно передавать аргументы в функцию.

Другие вопросы по тегам