Sur cette page
Cinémas, ciné-clubs, sites d’actualité locale et offices de tourisme tournent souvent sous WordPress et veulent afficher un programme qui se met à jour tout seul. Ce tutoriel construit un petit plugin qui ajoute un shortcode :
[cinema_showtimes cinema="le-champo-paris-5e-arrondissement"]Il affiche les séances du cinéma pour les jours qui viennent, film par film, chaque horaire menant à la page de réservation du cinéma. Environ 80 lignes de PHP, sans dépendance.
Ce qu’il vous faut
- Un site WordPress où vous pouvez ajouter un plugin (FTP, SFTP ou gestionnaire de fichiers de l’hébergeur).
- Une clé API Cinéma : créez un compte gratuit, confirmez votre adresse e-mail, puis créez une clé depuis le tableau de bord. L’offre gratuite (150 requêtes par semaine) suffit pour essayer ou pour un site non commercial, grâce au cache décrit plus bas ; le site d’un cinéma ou d’une entreprise nécessite un forfait payant, dès 12 € par mois.
- Le
slugdu cinéma. Cherchez-le par son nom :
curl "https://api.api-cinema.com/v1/cinemas?q=champo" -H "Authorization: Bearer ac_live_…"La réponse donne "slug": "le-champo-paris-5e-arrondissement". Tout cinéma français ou américain de l’API marche de la même façon.
Ranger la clé dans wp-config.php
La clé doit rester sur le serveur. Ajoutez cette ligne dans wp-config.php, au-dessus de /* C’est tout, ne touchez pas à ce qui suit ! */ :
define('API_CINEMA_KEY', 'ac_live_…');Créer le plugin
Créez le dossier wp-content/plugins/api-cinema-showtimes/ et, dedans, le fichier api-cinema-showtimes.php :
<?php
/**
* Plugin Name: API Cinéma showtimes
* Description: [cinema_showtimes cinema="le-champo-paris-5e-arrondissement"] affiche le programme d’un cinéma pour les jours qui viennent.
* Version: 1.0.0
*/
if (!defined('ABSPATH')) {
exit;
}
add_shortcode('cinema_showtimes', 'api_cinema_showtimes_shortcode');
function api_cinema_showtimes_shortcode($atts)
{
$atts = shortcode_atts(['cinema' => '', 'days' => 7], $atts, 'cinema_showtimes');
$cinema = sanitize_title($atts['cinema']);
$days = max(1, min(14, (int) $atts['days']));
if ($cinema === '' || !defined('API_CINEMA_KEY')) {
return '';
}
$showtimes = api_cinema_fetch_showtimes($cinema, $days);
if ($showtimes === null) {
return '<p class="cinema-showtimes">Programme momentanément indisponible.</p>';
}
if (!$showtimes) {
return '<p class="cinema-showtimes">Aucune séance dans les jours qui viennent.</p>';
}
return api_cinema_render_showtimes($showtimes);
}
/** Séances à venir d’un cinéma, gardées en cache deux heures ; null si l’API ne répond pas. */
function api_cinema_fetch_showtimes($cinema, $days)
{
$cache_key = 'api_cinema_' . md5($cinema . '|' . $days);
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$url = add_query_arg([
'to' => wp_date('Y-m-d', strtotime('+' . ($days - 1) . ' days')),
'include' => 'movie',
'limit' => 1000,
], 'https://api.api-cinema.com/v1/cinemas/' . rawurlencode($cinema) . '/showtimes');
$response = wp_remote_get($url, [
'headers' => ['Authorization' => 'Bearer ' . API_CINEMA_KEY],
'timeout' => 10,
]);
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) !== 200) {
return null;
}
$body = json_decode(wp_remote_retrieve_body($response), true);
$showtimes = $body['data'] ?? [];
set_transient($cache_key, $showtimes, 2 * HOUR_IN_SECONDS);
return $showtimes;
}
/** Jour par jour, film par film, chaque horaire menant à la réservation quand elle existe. */
function api_cinema_render_showtimes($showtimes)
{
$days = [];
foreach ($showtimes as $s) {
$day = substr($s['startsAt'], 0, 10);
$film = $s['movie']['title'];
$days[$day][$film][] = $s;
}
$html = '<div class="cinema-showtimes">';
foreach ($days as $day => $films) {
$html .= '<h3>' . esc_html(wp_date('l j F', strtotime($day . 'T12:00:00'))) . '</h3><ul>';
foreach ($films as $film => $times) {
$html .= '<li><strong>' . esc_html($film) . '</strong> ';
foreach ($times as $s) {
$label = substr($s['startsAt'], 11, 5) . ($s['version'] !== 'VF' ? ' ' . $s['version'] : '');
$html .= $s['bookingUrl']
? '<a href="' . esc_url($s['bookingUrl']) . '" rel="nofollow noopener" target="_blank">' . esc_html($label) . '</a> '
: '<span>' . esc_html($label) . '</span> ';
}
$html .= '</li>';
}
$html .= '</ul>';
}
return $html . '</div>';
}Activez ensuite API Cinéma showtimes dans Extensions.
Comment ça marche
- Une requête toutes les deux heures au plus. La réponse est gardée deux heures dans un transient : une page vue 10 000 fois par jour coûte toujours 12 requêtes par jour, 84 par semaine, dans les limites de l’offre gratuite.
tosansfrom. Sansfrom, l’API part de maintenant à l’heure locale du cinéma : les séances déjà commencées sont écartées ;to=2026-10-28inclut toute cette journée.include=movie. Le cinéma est le même sur chaque ligne : n’embarquer que le film allège la réponse.- Heures locales.
startsAtest l’heure du cinéma (2026-10-24T20:30:00) : le plugin l’affiche telle quelle, quel que soit le fuseau du serveur. - Versions. La
VFest la norme et n’est pas affichée ;VOetVOSTs’ajoutent à côté de l’heure. Pour un cinéma américain, chaque horaire afficheraitVO: remplacez le test par!in_array($s['version'], ['VF', 'VO'], true)pour la masquer. - Échappement. Titres et liens viennent des sites des cinémas :
esc_html()etesc_url()les rendent inoffensifs.
L’utiliser
Dans une page, un article ou un bloc Code court :
[cinema_showtimes cinema="le-champo-paris-5e-arrondissement" days="3"]days va de 1 à 14 (7 par défaut). Le résultat ressemble à ceci :
<div class="cinema-showtimes">
<h3>jeudi 22 octobre</h3>
<ul>
<li><strong>Cris et Chuchotements</strong> <a href="…">11:50 VOST</a> <a href="…">21:50 VOST</a></li>
<li><strong>Sonate d'automne</strong> <a href="…">13:40 VOST</a> …</li>
</ul>
</div>Les noms des jours suivent la langue du site, réglée dans Réglages › Général.
Un peu de style
Ajoutez dans Apparence › Personnaliser › CSS additionnel :
.cinema-showtimes ul { list-style: none; padding: 0; }
.cinema-showtimes li { margin: 0.4em 0; }
.cinema-showtimes a, .cinema-showtimes span {
display: inline-block; margin: 0.15em 0.3em 0.15em 0; padding: 0.15em 0.5em;
border: 1px solid currentColor; border-radius: 4px; text-decoration: none; font-variant-numeric: tabular-nums;
}Pour aller plus loin
- Plusieurs cinémas : le shortcode s’utilise autant de fois que voulu sur une page ; chaque cinéma a son propre cache.
- Affiches :
$s['movie']['posterUrl']donne l’affiche du film,durationMinsa durée,synopsisson résumé. - Tous les cinémas d’une ville : appelez
/v1/showtimes?city=…ounear=lat,lngau lieu d’un seul cinéma ; voir le guide pour la France.
Chaque champ est décrit dans la documentation.