Update taxonomy referenties via MySQL
Het is niet de meest nette manier om de database van Drupal rechtstreeks aan te passen maar soms kan het handig zijn. Bijvoorbeeld wanneer er een nieuwe taxonomy term is en er vervolgens veel nodes zijn die naar deze term moeten verwijzen.
Aanpassingen in de Node om naar een andere term te verwijzen
Als je in een node alle referenties naar een term wil vervangen kijk je wat het veld is dat gebruikt wordt voor de referentie.
In dit voorbeeld 'field_product_category'. Vervolgens geef je met behulp van de mysql opdracht 'UPDATE' aan om in dit veld een nieuwe
id te plaatsen 'SET' voor alle velden waar 'WHERE' nu een bepaalde id is ingesteld.
Doe dit zowel voor de field data:UPDATE field_data_field_product_category SET field_product_category_tid=61 WHERE field_product_category_tid=45
Als voor de revisieUPDATE field_revision_field_product_category SET field_product_category_tid=61 WHERE field_product_category_tid=45
Updaten van taxonomy_index
De relatie tussen de node en de term worden ook in een tabel van taxonomy zelf bij gehouden, namelijk: taxonomy_index.
Vergeet dus niet om hier ook alle wijzigingen door te voeren.
UPDATE taxonomy_index SET tid=61 WHERE tid=45
Waarschuwing
In dit geval ben ik er van uit gegaan dat er geen andere voorwaarden zijn waarom de term geupdate is. Als dit wel zo is of als er bijvoorbeeld voor een ander content type een ander veld is dat de referentie legt met de term dan kun je deze opdracht niet zomaar doorvoeren. Dan zou je namelijk ook termen updaten die niet aangepast dienen te worden.
Zorg dus dat je goed zicht hebt op hoe de database in elkaar zit voordat je zomaar een update uitvoert. En maak van te voren een backup. Via drush en de commandline doe je dat met: drush sql-dump --result-file
Je zou ook de module backup and migrate kunnen gebruiken. Of gewoon via mysql.
Updaten van termen bij alle nodes in een bepaalde taal
Stel dat er honderden artikelen zijn vertaald maar dat daarbij is vergeten om de referentie naar de goede term te leggen.
Dan wil je niet overal een bepaalde term voor een andere term vervangen maar alleen de termen waarvan de betreffende node in die taal staan.
UPDATE field_data_field_product_category AS c
INNER JOIN node AS n
ON c.entity_id = n.nid
SET c.field_product_category_tid = 76
WHERE n.language = 'da' AND c.field_product_category_tid=60;
We gebruiken dezelfde mysql functie 'Update'. UPDATE field_data_field_product_category
Vervolgens schrijven we een alias voor het veld 'field_data_field_product_category', het alias noemen we 'c' Dit doen we met: AS c
Het veld weet niet in welke taal de bijbehorende node staat. Daarom willen we dit linken met behulp van 'INNER JOIN'.
Samen met de alias 'n' voor de 'node' tabel ziet de join er dan zo uit: INNER JOIN node AS n
Om de join compleet te maken moeten we nog aangeven via welke velden de twee tafels moeten linken. Dat doen we met 'ON' daarbij gebruiken we de eerder aliassen in de vorm 'alias.veldnaam'. De voorwaarde waarop we linken wordt dan: ON c.entity_id = n.nid
.
Het 'SET' commando blijft hetzelfde. en bij de voorwaarde 'WHERE' gebruiken we weer de alias. Ook gebruiken we 'AND' om meerdere voorwaarden te gebruiken.
Voor de revision tabel:UPDATE field_revision_field_product_category AS c
INNER JOIN node AS n
ON c.entity_id = n.nid
SET c.field_product_category_tid = 76
WHERE n.language = 'da' AND c.field_product_category_tid=60;
En voor de taxonomy_index tabel:UPDATE taxonomy_index AS i
INNER JOIN node AS n
ON i.nid = n.nid
SET i.tid = 76
WHERE n.language = ‘da’ AND i.tid=60