GEO AIEngineer',
esc_html( GAIE_MIN_PHP_VERSION ),
esc_html( PHP_VERSION )
);
printf( '
', 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( '', 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();
}