0 ) ); foreach ( $sites as $site ) { self::activate_site( (int) $site->blog_id ); } return; } self::activate_site(); } /** * Ensure a site has the required database table and default options. * * @param int|WP_Site|null $blog_id Blog ID or site object to bootstrap. Defaults to current blog. */ public static function activate_site( $blog_id = null ): void { $current_blog_id = get_current_blog_id(); $target_blog_id = $current_blog_id; if ( $blog_id instanceof WP_Site ) { $target_blog_id = absint( $blog_id->blog_id ); } elseif ( is_int( $blog_id ) ) { $target_blog_id = absint( $blog_id ); } if ( $target_blog_id > 0 && $target_blog_id !== $current_blog_id ) { switch_to_blog( $target_blog_id ); } self::create_log_table(); self::set_default_options(); if ( $target_blog_id > 0 && $target_blog_id !== $current_blog_id ) { restore_current_blog(); } } /** * Create or update the log table. */ private static function create_log_table(): void { global $wpdb; $table_name = $wpdb->prefix . 'ability_guard_logs'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE {$table_name} ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, ability_name varchar(200) NOT NULL DEFAULT '', user_id bigint(20) unsigned NOT NULL DEFAULT 0, triggered_via varchar(50) NOT NULL DEFAULT 'php', input_data longtext DEFAULT NULL, output_data longtext DEFAULT NULL, status varchar(20) NOT NULL DEFAULT 'success', error_code varchar(100) DEFAULT NULL, execution_ms int(11) unsigned NOT NULL DEFAULT 0, ip_address varchar(45) DEFAULT NULL, created_at datetime NOT NULL, PRIMARY KEY (id), KEY ability_name (ability_name(191)), KEY user_id (user_id), KEY triggered_via (triggered_via), KEY status (status), KEY created_at (created_at) ) {$charset_collate};"; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; dbDelta( $sql ); update_option( 'ability_guard_db_version', ABILITY_GUARD_VERSION ); } /** * Set default options. */ private static function set_default_options(): void { add_option( 'ability_guard_log_input_data', true ); add_option( 'ability_guard_log_output_data', false ); add_option( 'ability_guard_log_retention_limit', ABILITY_GUARD_LOG_LIMIT ); add_option( 'ability_guard_delete_data_on_uninstall', false ); add_option( 'ability_guard_watchlist', array() ); add_option( 'ability_guard_registered_abilities', array() ); add_option( 'ability_guard_alerts_enabled', false ); add_option( 'ability_guard_alert_email', get_option( 'admin_email' ) ); add_option( 'ability_guard_alert_on_high_risk', true ); add_option( 'ability_guard_alert_on_errors', true ); add_option( 'ability_guard_alert_on_watched', true ); add_option( 'ability_guard_reports_enabled', false ); add_option( 'ability_guard_report_frequency', 'weekly' ); add_option( 'ability_guard_report_email', get_option( 'admin_email' ) ); add_option( 'ability_guard_saved_views', array() ); } }