LittleDemon WebShell


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/
File Upload :
Command :
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');
    }
}

LittleDemon - FACEBOOK
[ KELUAR ]