WordPress is uitgerust met een zeer eenvoudig en krachtig update systeem. Dankzij dit systeem kunnen WordPress gebruikers eenvoudig WordPress, plugins en thema’s eenvoudig updaten. Ik als ontwikkelaar was erg benieuwd naar deze opzet van dit systeem. Ik ben daarom de WordPress code ingedoken om de werking van dit systeem te onderzoeken.
Het WordPress update systeem maakt gebruik van een API die op WordPress.org staat. Dankzij deze API is eenvoudig informatie op te vragen over WordPress, plugins en thema’s. Elke WordPress installatie informeert om de 12 uren of er updates beschikbaar zijn via de WordPress.org API. De WordPress.org API kun je benaderen via de volgende URL: http://api.wordpress.org/
Als je de WordPress broncode doorzoekt op deze URL zul je een tiental bestanden vinden waarin hier gebruik van gemaakt wordt. In het bestand wp-includes\update.php is te zien op welke wijze WordPress controleert of er nieuwe versies zijn van WordPress, plugins of thema’s. Ik zal hieronder met enkele code fragmenten laten zien hoe gecontroleerd wordt of er thema update beschikbaar is.
WordPress zal in eerste instantie informatie over de geïnstalleerde WordPress thema’s opvragen met behulp van de get_themes() functie. Vervolgens zal deze informatie met behulp van HTTP POST verzoek worden verstuurd naar de WordPress.org API. Hiervoor wordt gebruik gemaakt van de wp_remote_post() functie die onderdeel is van de WordPress HTTP API. De WordPress.org API zal vervolgens aangeven of er updates beschikbaar zijn voor de geïnstalleerde thema’s.
In onderstaande code fragment is globaal te zien hoe een dergelijk verzoek wordt opgebouwd en uitgevoerd:
$themes = array( 'twentyten' => array( 'Name' => 'Twenty Ten' , 'Version' => '1.0' ) , 'platform' => array( 'Name' => 'Platform' , 'Version' => '1.0' ) , 'delicate' => array( 'Name' => 'Delicate' , 'Version' => '1.0' ) ); $args = array( 'body' => array('themes' => serialize($themes)) ); $response = wp_remote_post('http://api.wordpress.org/themes/update-check/1.0/', $args); if(is_wp_error($response)) { exit('Sorry, something went wrong.'); } if(200 != $response['response']['code']) { exit('Sorry, something went wrong.'); } $result = unserialize($response['body']);
Als alles goed gaat dan zal de variabele $result informatie over thema’s bevatten waar updates voor beschikbaar zijn. Hieronder zie je een voorbeeld dump van de $result variabele:
array(3) { ["twentyten"]=> array(3) { ["new_version"]=> string(3) "1.1" ["url"]=> string(44) "http://wordpress.org/extend/themes/twentyten" ["package"]=> string(61) "http://wordpress.org/extend/themes/download/twentyten.1.1.zip" } ["platform"]=> array(3) { ["new_version"]=> string(5) "1.3.1" ["url"]=> string(43) "http://wordpress.org/extend/themes/platform" ["package"]=> string(62) "http://wordpress.org/extend/themes/download/platform.1.3.1.zip" } ["delicate"]=> array(3) { ["new_version"]=> string(5) "3.4.3" ["url"]=> string(43) "http://wordpress.org/extend/themes/delicate" ["package"]=> string(62) "http://wordpress.org/extend/themes/download/delicate.3.4.3.zip" } }
De WordPress.org API geeft dus aan welke versie nu beschikbaar is en waar deze te vinden is. WordPress zal vervolgens met behulp van de Transient API het updaten van de thema’s kenbaar maken aan de WordPress beheerders. De beheerder krijgen daardoor een melding te zien dat er updates beschikbaar zijn. Zodra de beheerder de update uitvoert zal de package URL gedownload worden en de thema bestanden vervangen worden. Hiervoor gebruikt WordPress onder andere de Theme_Upgrader PHP klasse.