У меня есть база данных, которая использовалась в исследовательских целях. К сожалению, во время этого исследования алгоритму было позволено слишком долго действовать, что непреднамеренно создавало повторяющиеся термины таксономии вместо повторного использования исходного TID для первого экземпляра термина.Drupal: Условия слияния таксономии с массивными дубликатами
Чтобы исправить это, была предпринята попытка использовать модули «term_merge» и «taxonomy_manager». «term_merge» предлагает интерфейс для удаления дубликатов, и он может похвастаться возможностью устанавливать ограничения на количество терминов, которые он загружает, в качестве времени, чтобы предотвратить исчерпание предела памяти сервера базы данных. Однако в моем случае использования я даже не могу загрузить экран конфигурации, расположенный в/admin/structure/taxonomy/[My-Vocabulary]/merge, а тем более интерфейс дубликатов, найденный в/admin/structure/taxonomy/[My -Vocabulary]/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
*/
Вы можете принять свой собственный ответ, если вы считаете это решение. – pal4life