| Linux webm007.cluster106.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64 Path : /home/eglisebaa/www/ |
| Current File : /home/eglisebaa/www/sync-latest-message.php |
<?php
/**
* Script de synchronisation du bloc "Dernier message" de la page d'accueil.
* Récupère le dernier message (CPT message) via REST API ou WP_Query,
* puis met à jour la page d'accueil (options WordPress ou meta Elementor).
*
* Usage:
* php sync-latest-message.php
* php sync-latest-message.php --dry-run
*
* Config: sync-latest-message.config.json à côté de ce fichier (optionnel).
*/
// Prevent web execution
if (php_sapi_name() !== 'cli') {
die('Ce script doit être exécuté en ligne de commande (CLI).');
}
$dryRun = in_array('--dry-run', $argv ?? [], true);
$baseDir = dirname(__FILE__);
$configFile = $baseDir . '/sync-latest-message.config.json';
// --- Config par défaut ---
$config = [
'site_url' => 'https://www.eglisebaptistefloirac.fr',
'homepage_post_id' => 126,
'mode' => 'options', // 'options' | 'elementor'
'wp_load_path' => null, // si défini, utilise WP_Query au lieu de REST
'option_keys' => [
'title' => 'ebf_latest_message_title',
'date' => 'ebf_latest_message_date',
'reference' => 'ebf_latest_message_reference',
'orateur' => 'ebf_latest_message_orateur',
'link' => 'ebf_latest_message_link',
'url_audio' => 'ebf_latest_message_url_audio',
],
'purge_cache' => false,
];
if (is_file($configFile)) {
$loaded = json_decode(file_get_contents($configFile), true);
if (is_array($loaded)) {
$config = array_merge($config, $loaded);
}
}
$siteUrl = rtrim($config['site_url'], '/');
$homepagePostId = (int) ($config['homepage_post_id'] ?? 126);
$mode = $config['mode'] ?? 'options';
$optionKeys = $config['option_keys'] ?? $config['option_keys'];
// --- Récupération du dernier message ---
$message = null;
if (!empty($config['wp_load_path']) && is_file($config['wp_load_path'])) {
require_once $config['wp_load_path'];
$message = getLatestMessageViaWpQuery($optionKeys);
} else {
$message = getLatestMessageViaRest($siteUrl);
}
if (!$message) {
echo "Erreur : impossible de récupérer le dernier message.\n";
exit(1);
}
echo "Dernier message récupéré : " . $message['title'] . " (" . $message['date'] . ", " . $message['orateur'] . ")\n";
if ($dryRun) {
echo "[DRY-RUN] Valeurs qui seraient écrites :\n";
print_r($message);
exit(0);
}
// --- Mise à jour de la page d'accueil ---
$wpLoadPath = $config['wp_load_path'] ?? null;
if (!$dryRun && empty($wpLoadPath)) {
echo "Pour mettre à jour la page d'accueil, définir wp_load_path dans la config (chemin vers wp-load.php).\n";
exit(1);
}
if (!$dryRun && $wpLoadPath && is_file($wpLoadPath) && !function_exists('update_option')) {
require_once $wpLoadPath;
}
if ($mode === 'options') {
$updated = updateHomepageViaOptions($message, $optionKeys);
} else {
$updated = updateHomepageViaElementor($message, $homepagePostId, $wpLoadPath);
}
if (!$updated) {
echo "Avertissement : aucune mise à jour effectuée (vérifier la config ou le mode).\n";
exit(0);
}
echo "Mise à jour terminée.\n";
if (!empty($config['purge_cache'])) {
purgeCache($config['wp_load_path'] ?? null);
}
exit(0);
// ---------------------------------------------------------------------------
/**
* Récupère le dernier message via l'API REST WordPress.
*/
function getLatestMessageViaRest($siteUrl) {
$url = $siteUrl . '/wp-json/wp/v2/message?per_page=1&orderby=date&order=desc&_embed';
$context = stream_context_create([
'http' => [
'timeout' => 15,
'user_agent' => 'sync-latest-message/1.0',
],
]);
$json = @file_get_contents($url, false, $context);
if ($json === false) {
if (function_exists('curl_init')) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_USERAGENT, 'sync-latest-message/1.0');
$json = curl_exec($ch);
curl_close($ch);
}
}
if (!$json) {
return null;
}
$data = json_decode($json, true);
if (empty($data[0])) {
return null;
}
$post = $data[0];
return parseMessageFromRestPost($post);
}
/**
* Parse un post message (REST) en tableau titre, date, reference, orateur, link, url_audio.
*/
function parseMessageFromRestPost($post) {
$title = isset($post['title']['rendered']) ? strip_tags($post['title']['rendered']) : '';
$link = isset($post['link']) ? $post['link'] : '';
$content = isset($post['content']['rendered']) ? $post['content']['rendered'] : '';
$dateRaw = isset($post['date']) ? $post['date'] : '';
$orateur = '';
if (!empty($post['_embedded']['wp:term'])) {
foreach ($post['_embedded']['wp:term'] as $terms) {
foreach ($terms as $term) {
if (isset($term['taxonomy']) && $term['taxonomy'] === 'orateur') {
$orateur = $term['name'] ?? '';
break 2;
}
}
}
}
if ($orateur === '' && preg_match('/Par\s+([^<]+)/ui', $content, $m)) {
$orateur = trim(strip_tags($m[1]));
}
$reference = '';
if (preg_match('/>([^<]*\b(?:Genèse|Exode|Lévitique|Nombres|Deutéronome|Josué|Juges|Ruth|Samuel|Rois|Chroniques|Esdras|Néhémie|Esther|Job|Psaume[s]?|Proverbes|Ecclésiaste|Cantique|Ésaïe|Jérémie|Lamentations|Ézéchiel|Daniel|Osée|Joël|Amos|Abdias|Jonas|Michée|Nahum|Habakuk|Sophonie|Aggée|Zacharie|Malachie|Matthieu|Marc|Luc|Jean|Actes|Romains|Corinthiens|Galates|Éphésiens|Philippiens|Colossiens|Thessaloniciens|Timothée|Tite|Philémon|Hébreux|Jacques|Pierre|Jude|Apocalypse)\s*[\d.:\-,\s]+)<\/p>/ui', $content, $m)) {
$reference = trim(strip_tags($m[1]));
}
$dateFormatted = '';
if ($dateRaw) {
$ts = strtotime($dateRaw);
if ($ts) {
$months = ['janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre'];
$dateFormatted = 'Le ' . date('d', $ts) . ' ' . $months[(int)date('n', $ts) - 1] . ' ' . date('Y', $ts);
if ($orateur !== '') {
$dateFormatted .= ', par ' . $orateur;
}
}
}
if ($dateFormatted === '' && preg_match('/Le\s+\d+.+?\d{4}/u', $content, $m)) {
$dateFormatted = trim(strip_tags($m[0]));
if ($orateur !== '') {
$dateFormatted .= ', par ' . $orateur;
}
}
$urlAudio = '';
if (preg_match('/<audio[^>]+src=["\']([^"\']+)["\']/i', $content, $m)) {
$urlAudio = $m[1];
} elseif (preg_match('/<a[^>]+href=["\']([^"\']+\.mp3)["\']/i', $content, $m)) {
$urlAudio = $m[1];
}
return [
'title' => $title,
'date' => $dateFormatted,
'reference' => $reference,
'orateur' => $orateur,
'link' => $link,
'url_audio' => $urlAudio,
];
}
/**
* Récupère le dernier message via WP_Query (nécessite wp-load.php).
*/
function getLatestMessageViaWpQuery($optionKeys) {
if (!function_exists('get_posts')) {
return null;
}
$posts = get_posts([
'post_type' => 'message',
'post_status' => 'publish',
'posts_per_page' => 1,
'orderby' => 'date',
'order' => 'DESC',
]);
if (empty($posts)) {
return null;
}
$post = $posts[0];
$content = $post->post_content;
$orateur = '';
$terms = get_the_terms($post->ID, 'orateur');
if ($terms && !is_wp_error($terms)) {
$orateur = $terms[0]->name ?? '';
}
$reference = get_post_meta($post->ID, 'reference_biblique', true) ?: '';
if ($reference === '' && preg_match('/>([^<]*(?:Philippiens|Luc|Actes|Psaume|Genèse|Romains|Ephésiens|Éphésiens)[^<]*)</ui', $content, $m)) {
$reference = trim(strip_tags($m[1]));
}
$dateFormatted = '';
$ts = strtotime($post->post_date);
if ($ts) {
$months = ['janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre'];
$dateFormatted = 'Le ' . date('d', $ts) . ' ' . $months[(int)date('n', $ts) - 1] . ' ' . date('Y', $ts);
if ($orateur !== '') {
$dateFormatted .= ', par ' . $orateur;
}
}
$urlAudio = get_post_meta($post->ID, 'url_audio', true) ?: '';
if ($urlAudio === '' && preg_match('/<audio[^>]+src=["\']([^"\']+)["\']/i', $content, $m)) {
$urlAudio = $m[1];
} elseif ($urlAudio === '' && preg_match('/<a[^>]+href=["\']([^"\']+\.mp3)["\']/i', $content, $m)) {
$urlAudio = $m[1];
}
return [
'title' => $post->post_title,
'date' => $dateFormatted,
'reference' => $reference,
'orateur' => $orateur,
'link' => get_permalink($post->ID),
'url_audio' => $urlAudio,
];
}
/**
* Met à jour la page d'accueil via les options WordPress.
*/
function updateHomepageViaOptions($message, $optionKeys) {
if (!function_exists('update_option')) {
echo "update_option non disponible (exécutez le script avec wp_load_path dans la config).\n";
return false;
}
$updated = false;
foreach ($message as $key => $value) {
$optKey = $optionKeys[$key] ?? null;
if ($optKey !== null && $value !== '') {
update_option($optKey, $value);
$updated = true;
}
}
return $updated;
}
/**
* Met à jour la page d'accueil via la meta Elementor (_elementor_data).
* Remplace récursivement dans les widgets les textes correspondant au titre du message, à la référence, à la date/orateur, au lien.
*/
function updateHomepageViaElementor($message, $homepagePostId, $wpLoadPath) {
if (!function_exists('get_post_meta') || !function_exists('update_post_meta')) {
if ($wpLoadPath && is_file($wpLoadPath)) {
require_once $wpLoadPath;
}
if (!function_exists('get_post_meta')) {
echo "WordPress non chargé : mode elementor nécessite wp_load_path dans la config.\n";
return false;
}
}
$data = get_post_meta($homepagePostId, '_elementor_data', true);
if (!is_string($data)) {
echo "Meta _elementor_data introuvable ou vide pour la page $homepagePostId.\n";
return false;
}
$decoded = json_decode($data, true);
if (!is_array($decoded)) {
echo "Meta _elementor_data invalide (JSON).\n";
return false;
}
$replaced = replaceInElementorElements($decoded, $message);
if (!$replaced) {
echo "Aucun widget correspondant trouvé dans _elementor_data (vérifier les textes de recherche).\n";
return false;
}
$newJson = function_exists('wp_json_encode') ? wp_json_encode($decoded) : json_encode($decoded, JSON_UNESCAPED_UNICODE);
if (function_exists('wp_slash')) {
$newJson = wp_slash($newJson);
}
update_post_meta($homepagePostId, '_elementor_data', $newJson);
return true;
}
/**
* Parcourt récursivement les éléments Elementor et remplace titre, editor, url selon le message.
*/
function replaceInElementorElements(&$elements, $message) {
$replaced = false;
foreach ($elements as &$el) {
if (!is_array($el)) {
continue;
}
$settings = &$el['settings'] ?? null;
if (is_array($settings)) {
if (isset($settings['title']) && is_string($settings['title'])) {
if (stripos($settings['title'], 'Si Dieu est pour nous') !== false || stripos($settings['title'], 'Dernier message') !== false || strlen($settings['title']) < 80) {
if (stripos($settings['title'], 'Dernier message') !== false) {
// garder le titre de section
} elseif (stripos($settings['title'], 'Si Dieu') !== false || preg_match('/^[^<>]{5,120}$/u', $settings['title'])) {
$settings['title'] = $message['title'];
$replaced = true;
}
}
}
if (isset($settings['editor']) && is_string($settings['editor'])) {
if (stripos($settings['editor'], 'Philippiens 1:12-26') !== false || stripos($settings['editor'], '18 janvier 2026') !== false || stripos($settings['editor'], 'Guillaume') !== false) {
$settings['editor'] = $message['reference'] . "\n\n" . $message['date'];
if ($message['url_audio']) {
$settings['editor'] .= "\n\n" . $message['url_audio'];
}
$replaced = true;
}
}
if (isset($settings['url']) && is_string($settings['url']) && (stripos($settings['url'], 'eglisebaptistefloirac') !== false && stripos($settings['url'], 'message/') !== false)) {
$settings['url'] = $message['link'];
$replaced = true;
}
}
if (!empty($el['elements']) && is_array($el['elements'])) {
if (replaceInElementorElements($el['elements'], $message)) {
$replaced = true;
}
}
}
return $replaced;
}
/**
* Purge du cache (WP Fastest Cache ou action WordPress).
*/
function purgeCache($wpLoadPath) {
if ($wpLoadPath && is_file($wpLoadPath)) {
require_once $wpLoadPath;
}
if (function_exists('do_action')) {
do_action('wpfc_clear_all_cache');
do_action('cache_clear');
}
}