'update','type'=>'plugin','plugins'=>[...]] */ public static function on_upgrade_complete($upgrader, $hook_extra): void { if (!is_array($hook_extra)) return; if (($hook_extra['action'] ?? '') !== 'update') return; if (($hook_extra['type'] ?? '') !== 'plugin') return; $plugins = (array)($hook_extra['plugins'] ?? []); $self = plugin_basename(CF7STG_PLUGIN_FILE); if (!in_array($self, $plugins, true)) { return; } // Skip guard_requirements() — already running on a live install whose // PHP/WP versions are clearly compatible. wp_die here would interrupt // the upgrader and leave admin in a broken state. self::install_table(); self::seed_silent_drop_options(); self::ensure_scheduled(); } private static function guard_requirements(): void { if (version_compare(PHP_VERSION, '7.4', '<')) { deactivate_plugins(plugin_basename(CF7STG_PLUGIN_FILE)); wp_die('Плагин CF7 Spam → Telegram требует PHP 7.4 или выше. Текущая: ' . PHP_VERSION); } global $wp_version; if (version_compare($wp_version, '6.0', '<')) { deactivate_plugins(plugin_basename(CF7STG_PLUGIN_FILE)); wp_die('Плагин CF7 Spam → Telegram требует WordPress 6.0 или выше.'); } } private static function install_table(): void { global $wpdb; $table = $wpdb->prefix . 'cf7stg_queue'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE {$table} ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, flamingo_post_id BIGINT UNSIGNED NULL, form_id BIGINT UNSIGNED NULL, source_key VARCHAR(40) NOT NULL DEFAULT 'cf7', payload_json LONGTEXT NOT NULL, label VARCHAR(10) NOT NULL DEFAULT 'unclear', is_retro TINYINT(1) NOT NULL DEFAULT 0, status VARCHAR(20) NOT NULL DEFAULT 'pending', attempts SMALLINT UNSIGNED NOT NULL DEFAULT 0, last_error TEXT NULL, next_try_at DATETIME NULL, created_at DATETIME NOT NULL, sent_at DATETIME NULL, PRIMARY KEY (id), KEY idx_status_next (status, next_try_at), UNIQUE KEY uq_flamingo (flamingo_post_id, is_retro) ) {$charset_collate};"; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; dbDelta($sql); update_option(self::DB_VERSION_OPTION, self::DB_VERSION); } /** * Seed safe defaults for silent-drop options. Uses add_option (not update_option), * so existing values from prior versions or user customisations are preserved. * Runs on every activate() call — fresh installs and upgrades alike. */ private static function seed_silent_drop_options(): void { add_option(Settings::OPT_DRY_RUN_DROP, true); add_option(Settings::OPT_DROP_THRESHOLD, -5); add_option(Settings::OPT_HARD_DROP_ENABLED, true); add_option(Settings::OPT_DROP_COUNTERS, [ 'total' => 0, 'real_today' => 0, 'real_yesterday' => 0, 'dry_today' => 0, 'dry_yesterday' => 0, 'today_date' => wp_date('Y-m-d'), 'reset_at' => wp_date('Y-m-d'), ]); } }