GEO AIEngineer', esc_html( GAIE_MIN_PHP_VERSION ), esc_html( PHP_VERSION ) ); printf( '

%s

', wp_kses_post( $message ) ); } ); return false; } if ( version_compare( $wp_version, GAIE_MIN_WP_VERSION, '<' ) ) { add_action( 'admin_notices', function () use ( $wp_version ) { $message = sprintf( /* translators: 1: Plugin name, 2: Required WP version, 3: Current WP version */ esc_html__( '%1$s requires WordPress %2$s or higher. Your current WordPress version is %3$s.', 'adriano-geo-context-crawl-monitor' ), 'GEO AIEngineer', esc_html( GAIE_MIN_WP_VERSION ), esc_html( $wp_version ) ); printf( '

%s

', wp_kses_post( $message ) ); } ); return false; } return true; } /** * Load all required class files. * * @since 1.0.0 */ function gaie_load_dependencies() { require_once GAIE_PLUGIN_DIR . 'includes/class-gaie-activator.php'; require_once GAIE_PLUGIN_DIR . 'includes/class-gaie-deactivator.php'; require_once GAIE_PLUGIN_DIR . 'includes/class-gaie-loader.php'; require_once GAIE_PLUGIN_DIR . 'includes/class-gaie-i18n.php'; require_once GAIE_PLUGIN_DIR . 'includes/class-gaie-virtual-files.php'; require_once GAIE_PLUGIN_DIR . 'includes/class-gaie-markup.php'; require_once GAIE_PLUGIN_DIR . 'includes/class-gaie-tracker.php'; require_once GAIE_PLUGIN_DIR . 'admin/class-gaie-admin.php'; require_once GAIE_PLUGIN_DIR . 'public/class-gaie-public.php'; require_once GAIE_PLUGIN_DIR . 'includes/class-review-notice.php'; } /** * Define the activation hook. * * @since 1.0.0 */ function gaie_activate() { GAIE_Activator::activate(); } /** * Define the deactivation hook. * * @since 1.0.0 */ function gaie_deactivate() { GAIE_Deactivator::deactivate(); } /** * Bootstrap the plugin. * * Instantiates the Loader, registers i18n, admin, public, and all module hooks. * * @since 1.0.0 */ function gaie_run() { $loader = new GAIE_Loader(); // Internationalization. $i18n = new GAIE_I18n(); $loader->add_action( 'init', $i18n, 'load_plugin_textdomain' ); // Module 1 – Virtual Files. $virtual_files = new GAIE_Virtual_Files(); $loader->add_action( 'init', $virtual_files, 'add_rewrite_rules' ); $loader->add_filter( 'query_vars', $virtual_files, 'register_query_vars' ); $loader->add_action( 'template_redirect', $virtual_files, 'handle_virtual_endpoint' ); // Module 2 – Semantic Markup. $markup = new GAIE_Markup(); $loader->add_action( 'wp_head', $markup, 'inject_json_ld', 5 ); $loader->add_filter( 'the_content', $markup, 'enrich_content_markup' ); // Module 3 – Crawler Tracking. $tracker = new GAIE_Tracker(); $loader->add_action( 'init', $tracker, 'track_ai_crawlers' ); // Admin. if ( is_admin() ) { $admin = new GAIE_Admin(); $loader->add_action( 'admin_menu', $admin, 'register_menu_pages' ); $loader->add_action( 'admin_init', $admin, 'register_settings' ); $loader->add_action( 'admin_enqueue_scripts', $admin, 'enqueue_assets' ); } // Public. $public = new GAIE_Public(); $loader->add_action( 'wp_enqueue_scripts', $public, 'enqueue_assets' ); $loader->add_action( 'wp_head', $public, 'inject_head_discovery_link', 10 ); $loader->run(); } // Only proceed if environment is compatible. if ( gaie_check_environment() ) { gaie_load_dependencies(); register_activation_hook( GAIE_PLUGIN_FILE, 'gaie_activate' ); register_deactivation_hook( GAIE_PLUGIN_FILE, 'gaie_deactivate' ); register_activation_hook( GAIE_PLUGIN_FILE, array( 'AGCM_Review_Notice', 'on_activation' ) ); gaie_run(); new AGCM_Review_Notice(); } // Hook di disinstallazione register_uninstall_hook( GAIE_PLUGIN_FILE, 'gaie_complete_uninstall' ); function gaie_complete_uninstall() { global $wpdb; // 1. Drop della tabella dei log $table_name = $wpdb->prefix . 'gaie_crawler_logs'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange $wpdb->query( "DROP TABLE IF EXISTS `{$table_name}`" ); // 2. Eliminazione delle opzioni $options = array( 'gaie_version', 'gaie_db_version', 'gaie_flush_rewrite_rules', 'gaie_tracking_enabled', 'gaie_virtual_endpoint', 'gaie_semantic_markup', 'gaie_log_retention_days', 'gaie_anonymize_ip', 'gaie_data_sharing_consent', 'gaie_endpoint_slug', 'gaie_content_mode', 'gaie_auto_content_count', 'gaie_content_max_length', 'gaie_featured_page_ids', 'agcm_activation_date', 'agcm_show_review_notice', 'agcm_review_dismissed', 'agcm_already_reviewed', ); foreach ( $options as $option ) { delete_option( $option ); } // 3. Rimozione eventi Cron $timestamp = wp_next_scheduled( 'gaie_prune_logs_cron' ); if ( $timestamp ) { wp_unschedule_event( $timestamp, 'gaie_prune_logs_cron' ); } // 4. Flush rewrite rules flush_rewrite_rules(); }