PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


WordPress Bilder optimieren mit WP-Smash.it und Zend_Http_Client

with 4 comments

Die WordPress Mediathek wächst und wächst, ab und zu sind auch recht große Screenshots dabei oder gar Bilder der Digitalkamera, die häufig sehr groß sind und Metadaten enthalten.

Mit dem Service Smush.it von Yahoo kann man sehr einfach seine Bilder optimieren lassen. Man lädt die zu optimierenden Bilder hoch und erhält eine Auswertung, wieviel Prozent Smush.it sparen konnte (wohlgemerkt ohne die Bildqualität zu verschlechtern, es werden nur Metadaten entfernt sowie die Farbpalette angepasst usw.) und man kann die Bilder dann als zip-Datei herunterladen. Laut FAQ verwendet Smush.it intern aktuell ImageMagick, pngcrush, jpegtran und gifsicle und wählt das beste Ergebnis.

Der Service bietet auch eine API an. Um uns Bloggern das Leben einfacher zu machen gibt es das WordPress-Plugin WP-Smush.it, welches automatisch alle neuen Bilder, die man in die Mediathek hochlädt durch Smush.it optimieren kann. Auch bereits vorhandene Bilder kann man mit einem Klick optimieren.

Im Durchschnitt erhält man dabei Größenoptimierungen von 5-40%, also durchaus akzeptabel, und es passiert im Hindergrund, man muss nicht extra mit Bildprogrammen rumhampeln oder mit Konsolenprogrammen wie optiPNG und Konsorten hantieren.

Ein Problem hatte ich jedoch: Meine Mediathek enthielt bereits 121 Bilder. Da ich nicht 121 Mal den “Smush.it now” Link in der Mediathek klicken wollte, habe ich mir ein kleines Script geschrieben was das für mich erledigt.

Vorgehensweise ist wie folgt: Ich brauche zuerst alle IDs der Bilder, die ich komprimieren kann, denn ein Aufruf zum Optimieren sieht so aus:

http://www.phpgangsta.de/wp-admin/admin.php?action=wp_smushit_manual&attachment_ID=34

Ich möchte also 121 mal diese URL aufrufen, jeweils mit den passenden IDs. Die IDs hole ich mir eben schnell via phpMyAdmin aus der Datenbank mit dem Query:

SELECT ID FROM `wp_posts` WHERE `post_type` = 'attachment' AND `post_mime_type` LIKE 'image/%'

Das Ergebnis exportiere ich als csv-Datei, sodass ich eine Datei erhalte in der jede Zeile exakt eine ID enthält.

Um die entsprechende WordPress-Plugin-URL aufzurufen werde ich Zend_Http_Client verwenden. Sieht dann so aus:

<?php
$ids = file('ids.txt');

include 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();

$client = new Zend_Http_Client();
// Zu Debugzwecken möchte ich das Ergebnis in lesbarer Form, sonst kommt evtl. gzip zurück
$client->setHeaders(array(
    'Accept-encoding' => ''
));
// Timeout erhöhen, 10 Sekunden reichen nicht aus.
$client->setConfig(array('timeout' => 60));
$client->setCookieJar();

// Erste Anfrage: einloggen und eine Session starten (Cookie wird in den CookieJar gepackt und bei den folgenden Requests immer mitgesendet)
$client->setUri('http://www.phpgangsta.de/wp-login.php');
$client->setParameterPost('log', 'MeinAdministratorName');
$client->setParameterPost('pwd', 'MeinAdministratorPasswort');
$client->setParameterPost('rememberme', 'forever');
$client->setParameterPost('wp-submit', 'Anmelden');
$client->setParameterPost('redirect_to', 'http://www.phpgangsta.de/wp-admin/');
$client->setParameterPost('testcookie', '1');
$response = $client->request(Zend_Http_Client::POST);

foreach ($ids as $id) {
	$id = trim($id);
	$client->setUri('http://www.phpgangsta.de/wp-admin/admin.php?action=wp_smushit_manual&attachment_ID='.$id);
	$response = $client->request(Zend_Http_Client::GET);
	echo 'finished'.$id."\n";
}

echo "finished";

Zuerst müssen wir uns natürlich einloggen und speichern das Cookie im CookieJar. Erst danach können wir die URLs in einer Schleife aufrufen.

War eine schöne kurze Übung und garantiert interessanter und schneller als 121 Mal einen Link anzuklicken, wobei man zwischen jedem Klick 3-20 Sekunden warten muss, je nach Bildgröße.

Written by Michael Kliewe

Februar 13th, 2010 at 2:21 pm

4 Responses to 'WordPress Bilder optimieren mit WP-Smash.it und Zend_Http_Client'

Subscribe to comments with RSS or TrackBack to 'WordPress Bilder optimieren mit WP-Smash.it und Zend_Http_Client'.

  1. Danke.

    Eine sehr interessante Idee.

    ragtek

    15 Feb 10 at 00:00

  2. Soweit ich gesehn habe ist die API noch nicht für jeden zugänglich, weist du vielleicht ob die FAQ (http://developer.yahoo.com/yslow/smushit/faq.html#faq_api) veraltet ist oder wo man einen API Key für Entwickler/Beta Tester bekommt?

    chrisweb

    16 Feb 10 at 09:05

  3. Hi.

    schau einfach in den Quelltext von WP-Smush.it, darin findest du die URLs (API), mit denen das Plugin arbeitet. Man benötigt augenscheinlich keinen API Key.

    Michael Kliewe

    16 Feb 10 at 09:19

  4. Hab mir den Quellcode angeschaut. Ich weis nicht recht ob man da von einer API reden kann, hängt wohl von der Definition ab die man von einer API hat.

    Wie man auch sehn kann musste er bereits den Link für smush.it ändern damit sein Script weiterhin funktioniert, was bei einer API nicht der Fall sein sollte. Er nutzt halt den gleichen Link wie YSlow. Daher gibts auch wohl kein API Key.

    Das Problem für mich ist, ich wollte eine ähnliche Funktionalität, in einen Image-Gallery-Manager einbauen. Dieser wurde mit dem Zend Framework geschrieben und soll bald an einen Kunden ausgeliefert werden. Wenn aber aber ein paar Monate später einen Anruf bekommen weil die Optimierung der Bilder nicht mehr Funktioniert, da smush.it ihren Link verändert haben, dann hab einen Kunden verärgert ;)

    Trotzdem interessant sich das ganze mal anzuschauen, danke für den Beitrag, weiter so ;)

    chrisweb

    16 Feb 10 at 17:25

Leave a Reply

You can add images to your comment by clicking here.