In WordPress Bildernamen für Google optimieren

Webdesigner und SEO’s kennen das Problem von schlechten Dateinamen von Bildern. Da kommt ein Kunde mit seiner bestehendne WordPress-Webseite als Optimierungs-Auftrag hinzu und man stellt fest, dass die Bildernamen in WordPress so graussig sind wie „IMG_2028323.jpg“ oder „bild_15_nachbearbeitet.jpg“.

Mich traf nun auch so ein Fall mit über 300 Bildern und einer sehr schlechten suboptimalen Namensgebung. Die Kunden-Webseite war normal mit WordPress eingerichtet, sieht vom Design her gut aus, aber hatte keinerlei WordPress-Plugins oder sonstige Optimierungen vorzuweisen.

Die Aufgabe bestand nun darin, dass einerseits die Webseite und vor allem auch die Bilder mehr Besucher von Google und anderen Suchmaschinen anziehen, als die bisher maximal 25 Besucher pro Tag.

Anzeige: WordPress-Programmierung mit dem HTML5 Builder lösen

Da ich Informatik über ein Fernstudium absolviert habe und auch sonst ein bequemer Mensch in Sachen Automatisierung bin, habe ich mir überlegt ein PHP-Script zur Umbenennung von Bildernamen in WordPress zu erstellen.

Den Kunden konnte ich davon überzeugen, dass er in der WordPress Mediathek (da wo in WordPress die Bilder und Anhänge verwaltet werden) die Bildtitel mit passenden Schlüsselwörtern (Keywords) abändert. Damit könnte ich dann die Dateinamen der Bilder in der MySQL-Datenbank und in den Verzeichnissen abändern.

Die Titel der Bilder waren durch den Kunden nach einigen Tagen geändert und für mich ergab sich dann auch ein neues Problem, dass einige Titel doppelt vergeben und andere mit ä,ö und ü benannt wurden. Dazu kam noch die Feststellung, dass WordPress beim Upload über die Mediathek diese kleinen Vorschaubilder in den Größen 150×150 und 300×300 anlegt.

Hier nochmal der Fahrplan zum Optimieren von Bildernamen in WordPress:

  1. In WordPress: Ändern der Bildittel in Mediathek durch Kunden
  2. In MySQL-Datenbank: Doppelte Bildtitel in WordPress suchen
  3. In MySQL-Datenbank: Liste mit Bildern heraussuchen
  4. In MySQL-Datenbank: Jeden Dateinamen anhand des Bildtitels ändern
  5. im Verzeichnis: Jeden Dateinamen anhand des Bildtitels ändern

Den ersten Punkt kann der Kunde relativ einfach und selbstständig durchführen, da dies den Kunden aktiv mit einbindet und mir selbst die Möglichkeit gibt in einen neuen Bereich an Hand der Schlüsselwörter reinzuschauen.

Der zweite Punkt der doppelten Einträge entstand zwangsläufig . Der Kunde konnte sich natürlich nicht alle Bildtitel merken und so vergab er für einige Bilder auch mehrfach den gleichen Bildtitel. Dieses Problem muss behoben werden, da sonst gleiche Dateinamen und somit Fehler in der Webseite entstehen würden. Zur Suche und Behebung der doppelten Einträge dieses kurze SQL-Script:

SELECT id, post_title, COUNT( *  ) AS counter FROM wp_posts GROUP BY post_title HAVING counter >1

Das Ergebnis ist eine Liste von Titeln mit der jeweiligen Anzahl. Die Anzahl von Titeln von z.Bsp. Kategorien ist meist größer 1. Die Titel von Bildern sollten in der Liste nicht auftauchen. Sollte doch ein Bildtitel 2 oder mehrfach vorhanden sein, so kann man diesen in der Mediathek suchen oder einfach mit diesem Script in PHPMyAdmin aufrufen und per Hand editieren:

SELECT * FROM `wp_posts` WHERE `ID` = id

Hat man dann alle doppelten Bilditel gefunden und korrigiert, so kann man mein fertiges Script nutzen, um die anderen Punkte durchzuführen. ABER ACHTUNG: Vorher eine Sicherung der Datenbank ausführen!!!

Hinweis: Alle schreibenden Eingriffe in die Datenbank und im Verzeichnis sind deaktiviert. Das PHP-Script ist somit ungefährlich.

<?php

// 1. Hinweis: Vor dem Ausführen eine Sicherung der Datenbank durchführen!!!
// 2. Hinweis: Vor dem Ausführen sollten die Update-SQL-Befehle und der Copy-Befehl deaktiviert werden

$show_all = "";  // Liste zum Checken der optimierten Dateinamen... wird ganz am Ende angezeigt
$_global_to_replace = ""; // so was wie eine globale variable

// hier die eigenen datenbank-daten eintragen
$mysqldb   = 'YOUR_MYSQL_DB_HERE';
$mysqluser = 'YOUR_MYSQL_USER_NAME';
$mysqlpwd  = 'YOUR_MYSQL_PASSWORD';
$mysqlhost = 'localhost';

// mysql-datenbank-verbindung aufbauen
$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die("Verbindungsversuch fehlgeschlagen");
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");

// SQL-Anfrage zum Holen einer Liste mit den Bildern
$query  = "SELECT meta_id, post_id, meta_key, meta_value FROM `wp_postmeta` WHERE `meta_key` LIKE '_wp_attached_file' ";

// SQL-Abfrage an Datenbank schicken
$result = mysql_query($query);

// SQL-Anfrage anzeigen
echo "SQL-Query: $query<br>";

// SQL-Ergebniss durchlaufen
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    // SQL-Ergebnisse einzeln anzeigen
    echo "<strong>meta_id</strong> {$row['meta_id']} ".
         "<strong>post_id</strong> {$row['post_id']} ".
         "<strong>meta_key</strong> {$row['meta_key']} ".
         "<strong>meta_value</strong> {$row['meta_value']} <br>";

    // zur besseren Lesbarkeit den folgenden Kram einrücken
    echo "<blockquote>";

    // für jedes einzelnes Bild die Details holen post_id wird von der Liste verwendet
    $query2 = "SELECT * FROM `wp_posts` WHERE `ID` = {$row['post_id']}";

    // SQL-Abfrage an Datenbank schicken
    $result2 = mysql_query($query2);

    // SQL-Abfrage anzeigen (zur Sicherheit)
    echo "SQL-Query: $query2<br>";

    // SQL-Ergebnisse einzeln verarbeiten
    while ($row2 = mysql_fetch_array($result2, MYSQL_ASSOC))
    {
        // Titel des Bildes anzeigen... den der in der Mediathek geändert wurde
    	echo "<strong>post_title</strong> {$row2['post_title']} <br>";

        // Uninteressante Bilder haben als Bildtitel den Dateinamen
        // SQL-Ergebniss wird daher auf .jpg untersucht
    	if (substr($row2['post_title'],-4) == ".jpg")
    	{
    		echo ".jpg im Titel gefunden ... kann ignoriert werden<br>";
    	}
    	else
    	{
    		echo "Kein .jpg im Titel gefunden ... muss optimiert werden<br>";

                // Bild-Dateinamen sollten Bindesstrichen enthalten
                // Liste von zu suchenden Titel-Inhalten
    		$_suche_nach = array(" / ", " - "," ( "," )"," ",".","--");

                // neuen optimierten Dateinamen zusammenbauen... also Titel kleinschreiben und Kommas etc. entfernen
    		$new_post_title = "keyword-".strtolower(str_replace($_suche_nach,"-",$row2['post_title']));

                // neuen titel anzeigen
     		echo "new_post_title: ".$new_post_title."<br>";

                // neuen titel zur gesamtliste hinzufügen... wird sonst hier zu unübersichtlich
		$show_all = $show_all.$new_post_title."<br>";  

                // da die Bilder in der Datenbank mit Verzeichnis gespeichert sind muss der Bildname rausgesucht werden
                // als erste die position des letztens vorkommens suchen...
                $_start = strrpos($row['meta_value'],"/");

                // als zweites die position des beginns von .jpg suchen
	        $_ende = strrpos($row['meta_value'],".jpg");

                // ersetzen und zusammenbauen und anzeigen.. bla bla bla ;-)
		$_to_replace     = substr($row['meta_value'],$_start+1, $_ende-$_start-1);
		$_old_post_title = $row['meta_value'];
		$_new_post_title = substr_replace($row['meta_value'], $new_post_title, $_start+1, $_ende-$_start-1);
		echo "<br>";
		$_global_to_replace = $_to_replace;
		echo "pre: ".$_to_replace."<br>";
		echo "old: ".$_old_post_title."<br>";
		echo "new: ".$_new_post_title;

                echo "<br><br>";

		$query2a = "SELECT * FROM `wp_posts` WHERE `ID` = {$row['post_id']}";
		$result2a = mysql_query($query2a);
		echo "SQL-Query: $query2a<br>";
		while ($row2a = mysql_fetch_array($result2a, MYSQL_ASSOC))
		{
		   	echo "<strong>post_name</strong> {$row2a['post_name']} <br>";
			echo "<strong>post_title</strong> {$row2a['post_title']} <br>";
		    	echo "<strong>guid</strong> {$row2a['guid']} <br>";
		    	$_guid = $row2a['guid'];
		    	$_guid_start = strrpos($_guid,"/");
		    	$_guid_ende = strrpos($_guid,".jpg");
		    	$_guid_new = substr_replace($_guid,$new_post_title,$_guid_start+1,$_guid_ende-1-$_guid_start);

                        // ändern der optimierten titel in mysql-datenbank
                        $query_update0 = "UPDATE `wp_posts` SET `post_name` =  '$new_post_title', `guid` = '$_guid_new' WHERE `wp_posts`.`ID` ={$row2a['ID']};";
			//mysql_query($query_update0);  // den hier mit zwei schrägstrichen aussperren, wenn ihr euch unsicher seit!
			echo $query_update0;
		}

  	        echo "<br><br>";

		$query3 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = {$row['post_id']} and `meta_key`= '_wp_attachment_metadata'";
		$result3 = mysql_query($query3);
		echo "SQL-Query3: $query3<br>";
		while ($row3 = mysql_fetch_array($result3, MYSQL_ASSOC))
		{
		    	echo "<strong>meta_id</strong> {$row3['meta_id']} <br>";
			echo "<strong>meta_value</strong> {$row3['meta_value']} <br>";
		    	$_new_postmeta = str_replace($_to_replace,$new_post_title,$row3['meta_value']);
		    	echo "<strong>to update:</strong> ".$_new_postmeta."<br>";

                        // zweites ändern der optimierten titel und bildnamen in mysql-datenbank
		    	$query_update1  = "UPDATE `widge34ed`.`wp_postmeta` SET `meta_value` =  '$_new_postmeta' WHERE  `wp_postmeta`.`meta_id` ={$row3['meta_id']};";
		    	//mysql_query($query_update1);
		    	echo $query_update1;
		}

		echo "<br><br>";

		$query4 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = {$row['post_id']} and `meta_key`= '_wp_attached_file'";
		$result4 = mysql_query($query4);
		echo "SQL-Query: $query4<br>";
		while ($row4 = mysql_fetch_array($result4, MYSQL_ASSOC))
		{
		    	echo "<strong>meta_id</strong> {$row4['meta_id']} <br>";
			echo "<strong>meta_value</strong> {$row4['meta_value']} <br>";

                        // finales ändern der optimierten titel und bildnamen in mysql-datenbank
		    	$query_update2 = "UPDATE `wp_postmeta` SET `meta_value` =  '$_new_post_title' WHERE  `wp_postmeta`.`meta_id` ={$row4['meta_id']};";
		    	//mysql_query($query_update2);
		    	echo $query_update2;
		}

		// Kopieren der alten Bilddateien aber mit neuem optimierten Dateinamen

                // Verzeichnis wo die Dateien liegen... vorher checken, wo die Bilder liegen!
		$dir = "/www/htdocs/website/wp-content/uploads/2009/07/";
		foreach (glob($dir.$_global_to_replace."*.*") as $filename) {
 				$source = $filename;
 				$dest = str_replace($_global_to_replace,$new_post_title,$filename);
				echo "Quelle: ".$source."<br>";
				echo "Ziel: ".$dest."<br>";
				echo "copy >>> ".copy($source,$dest)." <<<";  // diesen copy-befehl bei bedarf deaktivieren
		}
 		echo "<br>";
    	}
    }
    echo "</blockquote>";
}
echo "<hr>";
echo $show_all;  // vor den Update-Befehlen sollte diese Lite noch mal gecheckt werden!

mysql_close($connection);
?>

Das Kopieren der Bilder mit neuem Dateinamen dient zur Sicherheit, falls man einen Fehler macht.  Die Update-Befehle sollte man unbedingt beim ersten Test deaktiviert lassen, damit man prüfen kann, ob diese korrekt wären.

Mit Sicherheit muss man das Script anpassen, wenn Bilder in verschiedenen Monaten hochgeladen wurden und somit in verschiedenen Dateiordnern liegen. Genauso habe ich hier keine PDF-Dateien oder ähnliches beachtet.

Wer Fragen oder Verbesserungen zum Script hat: Per Kommentar melden, vielleicht kann ich helfen.

PS: Die Verwendung des PHP-Scriptes erfolgt auf eigene Gefahr. Ich übernehme keinerlei Haftung.

8 Gedanken zu „In WordPress Bildernamen für Google optimieren“

  1. Hallo echt toller Blog, machst du Geld damit ? Ich selbst habe bei meiner Webseite lange nach Verdienstmöglichkeiten gesucht aber nicht gefunden. Jetzt bin ich auf Backlinkseller gestoßen, damit verdiene ich schon fast 56 € im Monat. Hast du vielleicht eine noch bessere Alternative für mich ? Währe echt nett.

  2. @Arwid, Geld machen mit einer Website ist doch nicht sooo schwer, einfach eine Nische suchen, SEO – passendes Partnerprogramm – fertig und nächstes Projekt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.