Externe API-Aufrufe in WordPress cachen

Dieser Tage bekam dieses Blogdings hier ein neues Theme. Dazu aber irgendwann mal mit ein bisschen Zeit mehr. Heute soll es um eine Kleinigkeit gehen, die ich im Laufe der Entwicklung gelernt habe.

Vor allem aus Performance-Gründen möchte ich nicht, dass eingebettete Videos oder Spotify-Playlisten direkt beim Seitenaufruf geladen werden. Deswegen habe ich ein wenig an den Embed-Templates von WordPress herumgeschraubt, so dass es nun einen expliziten Klick des Benutzers braucht, damit zum Beispiel Daten von YouTube geladen werden. Damit habe ich mir aber leider auch die Möglichkeit genommen, einigermaßen schicke Vorschauen bei den eingebetteten Medien auszugeben. Im letzten Theme sah man nur ein Logo des entsprechenden Anbieters. Schon recht langweilig.

Das alles soll dieses mal schicker sein und deshalb hole ich mir die notwendigen Daten von den oEmbed-Schnittstellen der Anbieter. Das kann, je nach Lust und Laune der entsprechenden Server auch mal ein bisschen dauern und macht sich dann auch in der Ladezeit meiner Seite hier bemerkbar. Also muss ein bisschen Caching her. WordPress bietet dazu die Transients API, die wirklich einfach zu bedienen ist. Am Besten zeigt das wohl folgendes relativ verständliche Code-Beispiel.


$transientName = 'elvarbjarki_spotify_' . wp_hash($spotifyContentUrl);
$transient     = get_transient($transientName);

if (! empty($transient)) {
    $playlistData = $transient;
} else {
    $spotifyApiUrl = "https://embed.spotify.com/oembed?url=" . $spotifyContentUrl;
    $apiResponse   = wp_remote_get($spotifyApiUrl);
    $playlistData  = json_decode($apiResponse['body']);

    set_transient($transientName, $playlistData, MONTH_IN_SECONDS);
}

Nun kann man ja von WordPress wirklich halten was man will - aber das abfragen und zwischenspeichern der oEmbed-APIs mit Hilfe von wp_remote_get() statt einem umständigen PHP-Curl-Block und der Transient-API war wirklich einfach.