* * Version gratuite : aucune fonction IA, aucun appel réseau. * * @package aiforya-faq-generator */ if ( ! defined( 'ABSPATH' ) ) { exit; } if ( class_exists( 'Aiforya_Faq_Generator_Frontend', false ) ) { return; } class Aiforya_Faq_Generator_Frontend { /** @var self|null Singleton instance (pattern AIFORYA canonical). */ private static ?self $instance = null; public static function get_instance(): self { if ( self::$instance === null ) { self::$instance = new self(); } return self::$instance; } public function __construct() {} /** @var bool Les variables de couleur n'ont de sens qu'une fois par page. */ private bool $inline_vars_added = false; public function register_hooks(): void { add_action( 'wp_head', [ $this, 'maybe_add_faq_schema' ], 10 ); add_action( 'wp_enqueue_scripts', [ $this, 'register_front_assets' ] ); add_shortcode( 'aiforya_faq', [ $this, 'shortcode_render' ] ); add_filter( 'the_content', [ $this, 'maybe_auto_inject' ], 20 ); add_action( 'init', [ $this, 'register_gutenberg_block' ] ); add_action( 'plugins_loaded', [ $this, 'maybe_init_elementor' ], 100 ); } /** * Enregistre la feuille de style du rendu front — SANS la mettre en file. * * Elle n'est mise en file qu'au moment où une FAQ est réellement rendue * (voir enqueue_front_style()), pour ne rien charger sur les pages qui * n'en affichent aucune. */ public function register_front_assets(): void { wp_register_style( 'aiforya-fg-faq', AIFORYA_FG_URL . 'assets/css/faq.css', [], AIFORYA_FG_VERSION ); } /** * Met la feuille en file et y ajoute les quatre couleurs réglables. * * ⛔ NE PAS revenir à un bloc