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.