prefix . 'flareops_' . $name; } public static function tables(): array { return array( 'bot_hits', 'bot_daily', 'referrals', 'changes' ); } public static function create_tables(): void { global $wpdb; if ( ! function_exists( 'dbDelta' ) ) { require_once ABSPATH . 'wp-admin/includes/upgrade.php'; } $cc = $wpdb->get_charset_collate(); $sql = array(); $sql[] = 'CREATE TABLE ' . self::table( 'bot_hits' ) . " ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, at datetime NOT NULL, bot varchar(40) NOT NULL DEFAULT '', kind varchar(16) NOT NULL DEFAULT '', ua varchar(512) NOT NULL DEFAULT '', ip varchar(45) NOT NULL DEFAULT '', fwd_ip varchar(45) NOT NULL DEFAULT '', path varchar(255) NOT NULL DEFAULT '', product_id bigint(20) unsigned DEFAULT NULL, status smallint(5) unsigned NOT NULL DEFAULT 0, PRIMARY KEY (id), KEY at (at), KEY bot (bot) ) $cc;"; $sql[] = 'CREATE TABLE ' . self::table( 'bot_daily' ) . " ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, day date NOT NULL, bot varchar(40) NOT NULL DEFAULT '', kind varchar(16) NOT NULL DEFAULT '', path varchar(255) NOT NULL DEFAULT '', product_id bigint(20) unsigned DEFAULT NULL, hits int(10) unsigned NOT NULL DEFAULT 0, PRIMARY KEY (id), KEY day (day) ) $cc;"; $sql[] = 'CREATE TABLE ' . self::table( 'referrals' ) . " ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, day date NOT NULL, source varchar(32) NOT NULL DEFAULT '', landing_path varchar(255) NOT NULL DEFAULT '', product_id bigint(20) unsigned DEFAULT NULL, visits int(10) unsigned NOT NULL DEFAULT 0, PRIMARY KEY (id), KEY day (day) ) $cc;"; $sql[] = 'CREATE TABLE ' . self::table( 'changes' ) . " ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, change_id varchar(36) NOT NULL DEFAULT '', product_id bigint(20) unsigned NOT NULL DEFAULT 0, field varchar(32) NOT NULL DEFAULT '', before_value longtext, after_value longtext, restore_data longtext, at datetime NOT NULL, source varchar(20) NOT NULL DEFAULT '', approved_by varchar(190) NOT NULL DEFAULT '', undone_at datetime DEFAULT NULL, PRIMARY KEY (id), KEY change_id (change_id), KEY at (at) ) $cc;"; foreach ( $sql as $q ) { dbDelta( $q ); } update_option( 'flareops_db_version', FLAREOPS_DB_VERSION, true ); } public static function tables_ok(): bool { global $wpdb; foreach ( self::tables() as $t ) { $name = self::table( $t ); $found = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $name ) ); // phpcs:ignore WordPress.DB if ( $found !== $name ) { return false; } } return true; } public static function maybe_upgrade(): void { if ( get_option( 'flareops_db_version' ) !== FLAREOPS_DB_VERSION ) { self::create_tables(); } if ( ! wp_next_scheduled( self::CRON_DAILY ) ) { wp_schedule_event( time() + HOUR_IN_SECONDS, 'daily', self::CRON_DAILY ); } if ( '' === (string) get_option( 'flareops_order_salt', '' ) ) { update_option( 'flareops_order_salt', bin2hex( random_bytes( 32 ) ), false ); } if ( '' === Settings::indexnow_key() ) { update_option( 'flareops_indexnow_key', bin2hex( random_bytes( 16 ) ), true ); } } public static function activate(): void { self::create_tables(); if ( false === get_option( Settings::OPTION, false ) ) { add_option( Settings::OPTION, Settings::defaults(), '', true ); } self::maybe_upgrade(); Feed::add_rewrite(); flush_rewrite_rules( false ); update_option( 'flareops_rewrite_version', Feed::REWRITE_VERSION, true ); } public static function deactivate(): void { wp_clear_scheduled_hook( self::CRON_DAILY ); wp_clear_scheduled_hook( IndexNow::CRON ); wp_clear_scheduled_hook( Events::CRON ); flush_rewrite_rules( false ); } }