Shortcode pro načítání dat z CSFD.cz


Nedávno jsem narazil na velice zajímavé API, které tahá data přímo z csfd.cz a dokáže je v krásném nejkrásnějším JSONu zobrazit. A co bych to nebyl já, kdybych toho nevyužil ke krásnému příkladu, jak využít WordPress a jeho shorcode.

V příkladu budu využívat pouze API, které stahuje informace o filmech, ale určitě vám nebude nic bránit v tom, abyste si kód upravili tak, aby například zobrazil vyhledávání či informace o uživatelích. Už jednou jsem řešil něco podobného. Pomocí APIčka jsem napojil kurz české koruny. Nyní se naopak obejdu bez cronu a výsledky nebudu ukládat do options, ale pouze je vložím do cache. API je omezeno 20 requesty za minutu, takže to bude třeba.

Začnu s funkcemi, pomocí kterých načtu data z API a uložím je do cache:

function requestMovie($id)
{
    $baseUrl = 'http://csfdapi.cz/movie/';
    $url = $baseUrl . $id;

    if(!($content = @file_get_contents($url))) {
        return null;
    }

    $object = json_decode($content);

    // check if film was loaded
    if(!isset($object->plot)) {
        return null;
    }

    return $object;
}

function getMovie($id)
{
    // set cache variable
    $cacheKey = 'moviex/' . $id;

    // check if movie is in cache, if so, just load it
    if($movie = get_transient($cacheKey)) {
        return $movie;
    }

    // request movie from API
    if ($movie = requestMovie($id)) {

        // set response to cache
        set_transient($cacheKey, $movie, 60 * 60 * 24);

        return $movie;
    }

    // if request failed, return null
    return null;
}

Funkce set_transient a get_transient data cachují pouze uložením do databáze. Jediný rozdíl oproti funkcím set_option a get_option je, že se jim dá nastavit omezená délka trvání. Ve scriptu mám nastaveno, že cache jednotlivých filmů se obnoví za 24 hodin.

A teď už jen velmi jednoduchý script pro zapracování do shorcode.

function csfd_fce($atts) {

    $attrMap = [
        'id' => null,
        'key' => null,
        'secundary' => null,
        ];

    extract(shortcode_atts($attrMap, $atts));

    if ($id == null) {
        return 'Chybí id.';
    }

    if ($key == null) {
        return 'Chybí klíč.';
    }

    $show = getMovie($id)->$key;

    if (is_array($show)) {
        return join(', ', $show);
    }

    if (is_object($show)) {
        return $show->$secondary;
    }

    return $show;
}
 
add_shortcode('csfd-movie', 'csfd_fce');

Shorcode má celkem tři parametry. Dva základní: Id pro identifikační číslo filmu (na csfd ho vidíte v url) a key, kterým určíte, kterou informaci chcete načíst. Jejich seznam si najděte v dokumentaci APIčka. Poslední, volitelný parametr secondary slouží vypsání vrácené části objektu. Viz. v příkladu dole vypsání anglického názvu.

Všimněte si také, že pokud atribut vrací array, na web se pak vypíšou hodnoty oddělené čárkou.

A jak může vypadat konkrétní použití? Třeba takto:

Film Atlas mraků, byl natočen v roce [csfd-movie id="290326" key="year"] a jeho stopáž je [csfd-movie id="290326" key="runtime"]. Jeho aktuální hodnocení je [csfd-movie id="290326" key="rating"]%. Patří mezi žánry: genres [csfd-movie id="290326" key="genres"] Jeho anglický název je:  [csfd-movie id="290326" key="names" secondary="en"]

API bohužel není úplně nejstabilnější. Občas se stává, že neodpoví, takže není určené pro produkční prostředí. A kdyby se do toho ještě pustili právníci …no škoda mluvit.