Links oder Artikelbilder per MySQL aus WordPress entfernen
Alexander Trust, den 8. Juli 2015Alte oder unnötige Links und Artikelbilder entfernen oder ersetzen kann man per Hand. Viel schneller geht es jedoch per MySQL-Datenbankabfrage, wenn es mehr als drei sind.
Dies gilt selbstverständlich nicht nur für WordPress, sondern alle anderen CMS und Blogsysteme, die auf MySQL oder andere Datenbanksysteme vertrauen. Die folgende Anleitung beschäftigt sich konkret mit dem Beispiel von WordPress und MySQL.
Ich möchte zeigen, wie man eine Menge Zeit bei der Optimierung von Webseiten sparen kann, indem man MySQL zu seinen Gunsten einsetzt. Da ich Webseiten betreue, bei denen mitunter mehrere zehntausend Artikel und manchmal sogar hunderttausende Objekte verwaltet werden, macht Handarbeit, Artikel für Artikel, keinen Sinn.
Deshalb sollte man sich nicht scheuen, sich mit MySQL vertraut zu machen. Diese Sprache zur Abfrage und Manipulation von Daten in MySQL-Datenbanken ist für jeden, der der englischen Sprache halbwegs mächtig ist, sehr leicht nachvollziehbar – Anlaufstellen im Internet gibt es gratis und in Hülle und Fülle.
Wichtig ist, bevor man anfängt Änderungen an der Datenbank vorzunehmen, einer Sicherungskopie zu erstellen. Geht mal etwas schief, kann man binnen Sekunden aus dem Backup alles wieder Heile machen.
Artikelbilder entfernen oder ersetzen
Als WordPress noch nicht die Funktion von „Featured Images“ bot, hat man Artikelbilder per HTML-IMG-Tag direkt in den Artikel integriert. Wer nicht den WYSIWYG-Editor, sondern den Nur-Text-Editor in WordPress verwendet, kann solche HTML-Tags direkt ausfindig machen. Wenn man regelmäßig über ein Thema geschrieben hat, hat man oft dasselbe Bild wieder und wieder benutzt. Wenn man nun die neuen Featured Images nutzt, und aber alte Artikel noch Bilder im Quellcode nutzen, kann man deren HTML-Code leicht per SQL-Abfrage löschen.
UPDATE `wp_posts` SET `post_content` = REPLACE(`post_content`, '<img src="http://www.macnotes.de/images/appleaktie_icon.gif" class="thumb_tr" alt="Aktie" style="border:none;" />', '');
Konkret aktualisierte ich in diesem Fall die Tabelle, in der WordPress-Artikel enthalten sind wp_posts
. Ich wies SQL an, das Feld post_content
mit neuem Inhalt zu befüllen, was mittels SET
geschieht. Nach dem Gleichheitszeichen folgt der REPLACE
-Befehl, der drei Parameter aufweist. Der erste ist die Tabellenspalte post_content
, der zweite beinhaltet den alten Inhalt und der dritte formuliert den neuen Inhalt. Da ich das Bild nur löschen wollte, habe ich den dritten Parameter mit ''
leer gelassen.
Links entfernen oder ersetzen
Die Struktur eines Links von einem Affiliate-Programm hat sich geändert und man hat aber dutzende alter Links zu diesen Produkten in seinen Texten verarbeitet? Oder man hat seine eigene Linkstruktur angepasst und Kategorien umbenannt? Links auf /thema/X
führen dann auf /kategorie/X
. Es ist richtig und wichtig, dass man per htaccess
-Datei bei Apache, oder mittels analoger Regeln über die Konfigurationsdatei von Nginx Umleitungen einrichtet, damit Google und andere Suchmaschinen die Änderung mitbekommen. Genauso wichtig ist, dass man alle Links ändert, die man in seinen Texten hat.
Das verhindert, dass man mittelfristig schlechter in der Suchmaschine seines Vertrauens abschneidet. Denn der Bot folgt dem Link nach /thema/X
und wird per 301 an /kategorie/X
weitergeleitet. Das ist jedes Mal zusätzliche Zeit, die der Bot aufbringen muss, und die Suchmaschinen dem Webseitenbetreiber negativ auslegen, weil der Nutzer ebenfalls diese unnötigen Sekunden warten muss. Wie ändere ich also so einen Link per MySQL-Anweisung? Genauso wie man zuvor das Bild gelöscht hat. Nur dass man als zweiten Parameter eben den neuen Link eingibt.
UPDATE `wp_posts` SET `post_content` = REPLACE(`post_content`, '<a href="http://sajonara.de/thema/x">;', '<a href="http://sajonara.de/kategorie/x">');
Was ist, wenn man Links hingegen löschen möchte, ohne aber das verlinkte Wort oder die verlinkten Wörter im Text zu verlieren? Dazu nutzt man folgenden SQL-Befehl:
UPDATE wp_posts SET post_content = REPLACE(post_content, '<a href="http://www.macnotes.de/2012/09/24/verkaufszahlen-iphone-5-5-millionen-stueck-erstes-we/">5 Millionen iPhone 5</a>', '5 Millionen iPhone 5') WHERE post_status = 'publish' AND post_type = 'post';
Mithilfe der WHERE-Angabe in MYSQL kann man die Fälle, die bearbeitet werden sollen, einschränken. Wichtig wäre das zum Beispiel, wenn man zwar Links in Artikeln löschen möchte, nicht aber auf Seiten oder anderen Eintrags-Typen, die WordPress im Feld post_type
speichert. attachment
lautet beispielsweise der Schlüssel für Medien, die man zu einem Artikel hochgeladen hat. Hat man selbst sogenannte Artikeltypen (post types) hinzugefügt, sollte man deren Namen verwenden. Lässt man die Bedingungen weg, würde man die Inhalte per SQL der gesamten Tabelle wp_posts
ändern. Das ist eher selten erwünscht.