'; echo esc_html( sprintf( /* translators: 1: required PHP version, 2: current PHP version */ __( 'Figgle benötigt PHP %1$s oder höher. Du läufst auf %2$s. Bitte aktualisiere PHP, dann ist Figgle wieder bereit.', 'figgle' ), FIGGLE_MIN_PHP, PHP_VERSION ) ); echo '
'; } ); return; } // Load core. require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-compat-check.php'; require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-atomic.php'; require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-snippet.php'; require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-connection.php'; require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-settings.php'; require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-verify.php'; // REST-API fuer den Goal-Sync (seit v0.3). require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-rest-api.php'; // Seit v0.6: Datenquelle fuer Bestseller-Hinweise — Top-N nach echten // total_sales. Ohne WooCommerce liefert sie eine leere Liste. require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-bestsellers.php'; // Seit v0.4: Konfiguration direkt ins HTML schreiben ("Sofort-Modus"), damit // die Variante ohne Nachladen steht und das Original nie kurz aufblitzt. require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-inline-config.php'; // Seit v0.5: WooCommerce-Adapter. Bestellung, Erstattung und Storno gehen // signiert von Server zu Server — kein Adblocker dazwischen. // Datei wird immer geladen, Klasse initialisiert sich nur bei aktivem Woo // (class_exists-Gate in figgle_bootstrap). require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-woo.php'; // Seit v0.5: Sortier-Test fuer Kategorieseiten, serverseitig. Der // Cache-Selbsttest schaltet im Zweifel ab. Nur bei aktivem WooCommerce. require_once FIGGLE_PLUGIN_DIR . 'includes/class-figgle-plp.php'; // WooCommerce-Kompatibilitaet — Pflicht-Deklaration im Main-Plugin-File per // Woo-Doku. Ohne sie markiert Woo das Plugin als "inkompatibel" und blockt // ggf. den HPOS-Switch des Shops. `cart_checkout_blocks` gehoert dazu, weil // der Woo-Adapter aktiv im Store-API-Checkout haengt. add_action( 'before_woocommerce_init', function () { if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) { \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true ); \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'cart_checkout_blocks', __FILE__, true ); } } ); /** * Main bootstrap. * * @return void */ function figgle_bootstrap() { // Defaults pro Blog anlegen, falls sie fehlen. Bei netzwerkweiter // Aktivierung laeuft der Activation-Hook nur einmal — jede weitere // Unterseite haette sonst nie Standard-Einstellungen. figgle_ensure_default_options(); // v0.4 — Options-Migration (inline_mode-Default für Bestand = opt-in). Figgle_Inline_Config::maybe_migrate_options(); // Snippet-Inject in wp_head — Prioritaet 3: WordPress druckt die // Resource-Hints (dns-prefetch/preconnect aus dem Filter darunter) bei // Prioritaet 2 via Core, der Loader folgt direkt danach und bleibt // weiter vor Theme-CSS (Prioritaet 8). add_action( 'wp_head', array( 'Figgle_Snippet', 'render' ), 3 ); add_filter( 'wp_resource_hints', array( 'Figgle_Snippet', 'resource_hints' ), 10, 2 ); // v0.4 — Async-Config-Refresh via WP-Cron (stale-while-revalidate, // kein blocking Fetch im Page-Render-Pfad solange Cache da ist). add_action( 'figgle_refresh_inline_config', array( 'Figgle_Inline_Config', 'cron_refresh' ), 10, 1 ); // REST-Routen registrieren; den rest_api_init-Hook setzt die Klasse selbst. Figgle_Rest_Api::instance()->init(); Figgle_Bestsellers::instance()->init(); // Verbindung: registriert die oeffentliche Origin-Proof-Route und den // Status-Cron. Beides sind KEINE Admin-Requests — der Aufruf darf deshalb // nicht im is_admin()-Block stehen, sonst kann keine Verbindung zustande // kommen. Die Formular-/AJAX-Handler klammert init() selbst. Figgle_Connection::instance()->init(); // v0.5 — WooCommerce-Adapter nur bei aktivem Woo (Plugins sind zum // plugins_loaded-Zeitpunkt alle geladen — class_exists ist verlaesslich). if ( class_exists( 'WooCommerce' ) ) { Figgle_Woo::instance()->init(); Figgle_Plp::instance()->init(); } // Admin-only. if ( is_admin() ) { Figgle_Settings::instance()->init(); Figgle_Compat_Check::instance()->init(); Figgle_Verify::instance()->init(); } } add_action( 'plugins_loaded', 'figgle_bootstrap', 5 ); /** * Hinweis, wenn das Plugin aktiv ist, aber keine Site-ID hinterlegt hat. * * Ohne gueltige Site-ID gibt Figgle_Snippet nichts aus. Das sieht von aussen * aus wie ein laufendes Plugin, misst aber nichts — der Hinweis fuehrt * deshalb direkt auf die Einstellungsseite. * * Guideline 11: Setup-Hinweise gehoeren nicht auf jede Admin-Seite. Anzeige * nur auf Dashboard und Plugin-Liste; Figgle-eigene Screens bleiben wie * bisher ausgespart (dort steht der Verbindungs-Flow bereits im Kontext). */ function figgle_admin_notice_no_site_id() { if ( ! current_user_can( 'manage_options' ) ) { return; } $opts = get_option( FIGGLE_OPTION_KEY, array() ); $site_id = isset( $opts['site_id'] ) ? trim( (string) $opts['site_id'] ) : ''; if ( '' !== $site_id && Figgle_Snippet::is_valid_site_id( $site_id ) ) { // Site-ID konfiguriert — keine Notice. return; } // Skip auf Figgle-eigenen Screens (sonst doppelte UX). $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null; $screen_id = ( $screen && isset( $screen->id ) ) ? (string) $screen->id : ''; if ( false !== strpos( $screen_id, 'figgle' ) ) { return; } // Ueberall sonst nur auf Dashboard und Plugin-Liste. if ( ! in_array( $screen_id, array( 'dashboard', 'plugins' ), true ) ) { return; } // Top-Level-Menue (add_menu_page), daher admin.php statt options-general.php. $settings_url = admin_url( 'admin.php?page=' . Figgle_Settings::PAGE_SLUG ); echo 'Figgle: '; echo esc_html__( 'Das Plugin ist aktiv, aber noch nicht mit Figgle verbunden — auf deiner Website läuft deshalb noch kein Test.', 'figgle' ); echo ' '; echo esc_html__( 'Jetzt mit Figgle verbinden', 'figgle' ); echo '
Figgle: '; echo esc_html__( 'Unter „Erweitert: manuelle Einrichtung" steht eine andere Site-ID als die, mit der diese Website verbunden ist. Es zählt die Verbindung — deine Tests werden also im verbundenen Figgle-Konto gemessen. Lösche den abweichenden Eintrag, damit nichts durcheinandergerät.', 'figgle' ); echo ' '; echo esc_html__( 'Eintrag prüfen', 'figgle' ); echo '