新增 Exact Cache 模块,为已有的 ExactCache 核心类提供完整的管理界面和统计功能: - 模块骨架:module.json + ExactCacheModule(实现 ModuleInterface 全部 7 个方法) - AJAX 控制器:4 个 handler(保存设置/清空缓存/重置统计/获取统计),含安全三要素 - 成本估算器:基于 UsageTracker 历史数据估算缓存节省金额 - 日统计:7 天滚动统计,shutdown 批量写入,retry-once transient lock - 管理界面:统计卡片 + Chart.js 7 天趋势图 + 设置表单 + 缓存管理 - settings-page.php:添加精确缓存 tab(与 GEO/API Gateway 相同模式) - ExactCache.php:仅添加 get_entries() 只读方法,零核心影响 - uninstall.php:添加 option + transient 批量清理 经过 3 轮 Codex 架构审查(v1.0→v2.0→v2.1→v2.2),所有 P0/P1 问题已解决。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
129 lines
3.6 KiB
PHP
129 lines
3.6 KiB
PHP
<?php
|
||
/**
|
||
* WPMind 卸载脚本
|
||
*
|
||
* 当插件被删除时清理数据库中的选项
|
||
*
|
||
* @package WPMind
|
||
* @since 1.1.0
|
||
*/
|
||
|
||
declare(strict_types=1);
|
||
|
||
// 如果不是通过 WordPress 卸载,则退出
|
||
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
|
||
exit;
|
||
}
|
||
|
||
/**
|
||
* 清理单个站点的所有 WPMind 数据
|
||
*/
|
||
function wpmind_cleanup_site_data(): void {
|
||
// 删除所有插件选项
|
||
$options = [
|
||
// 核心设置
|
||
'wpmind_custom_endpoints',
|
||
'wpmind_request_timeout',
|
||
'wpmind_default_provider',
|
||
'wpmind_image_endpoints',
|
||
'wpmind_default_image_provider',
|
||
'wpmind_usage_stats',
|
||
'wpmind_usage_history',
|
||
'wpmind_budget_settings',
|
||
'wpmind_routing_settings',
|
||
// GEO 模块设置
|
||
'wpmind_geo_enabled',
|
||
'wpmind_chinese_optimize',
|
||
'wpmind_geo_signals',
|
||
'wpmind_standalone_markdown_feed',
|
||
'wpmind_crawler_tracking',
|
||
'wpmind_llms_txt_enabled',
|
||
'wpmind_schema_enabled',
|
||
'wpmind_schema_mode',
|
||
'wpmind_crawler_logs',
|
||
'wpmind_crawler_stats',
|
||
// API Gateway 模块设置
|
||
'wpmind_api_gateway_schema_version',
|
||
// Exact Cache 模块设置
|
||
'wpmind_exact_cache_enabled',
|
||
'wpmind_exact_cache_default_ttl',
|
||
'wpmind_exact_cache_max_entries',
|
||
'wpmind_exact_cache_scope_mode',
|
||
'wpmind_exact_cache_index',
|
||
'wpmind_exact_cache_stats',
|
||
'wpmind_exact_cache_daily_stats',
|
||
// 激活标记
|
||
'wpmind_flush_rewrite_rules',
|
||
];
|
||
|
||
foreach ( $options as $option ) {
|
||
delete_option( $option );
|
||
}
|
||
|
||
// 删除 transients(固定键名)
|
||
$transients = [
|
||
'wpmind_budget_alerts_sent',
|
||
'wpmind_provider_health',
|
||
'wpmind_budget_notices',
|
||
'wpmind_round_robin_index',
|
||
'wpmind_daily_stats_lock',
|
||
];
|
||
|
||
foreach ( $transients as $transient ) {
|
||
delete_transient( $transient );
|
||
}
|
||
|
||
// 删除动态 transients(熔断器状态,按 provider 命名)
|
||
// 格式: wpmind_cb_{provider_id}
|
||
global $wpdb;
|
||
$wpdb->query(
|
||
$wpdb->prepare(
|
||
"DELETE FROM {$wpdb->options}
|
||
WHERE option_name LIKE %s
|
||
OR option_name LIKE %s",
|
||
'_transient_wpmind_cb_%',
|
||
'_transient_timeout_wpmind_cb_%'
|
||
)
|
||
);
|
||
|
||
// 删除 Exact Cache transient 缓存条目
|
||
// 格式: wpmind_ec_{hash}
|
||
$wpdb->query(
|
||
$wpdb->prepare(
|
||
"DELETE FROM {$wpdb->options}
|
||
WHERE option_name LIKE %s
|
||
OR option_name LIKE %s",
|
||
'_transient_wpmind_ec_%',
|
||
'_transient_timeout_wpmind_ec_%'
|
||
)
|
||
);
|
||
|
||
// 删除动态模块启用选项和 llms.txt 缓存
|
||
$wpdb->query(
|
||
$wpdb->prepare(
|
||
"DELETE FROM {$wpdb->options}
|
||
WHERE option_name LIKE %s
|
||
OR option_name LIKE %s",
|
||
'wpmind_module_%',
|
||
'_transient_wpmind_llms_txt_%'
|
||
)
|
||
);
|
||
|
||
// 删除 API Gateway 模块的数据库表
|
||
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}wpmind_api_audit_log" );
|
||
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}wpmind_api_key_usage" );
|
||
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}wpmind_api_keys" );
|
||
}
|
||
|
||
// 清理当前站点
|
||
wpmind_cleanup_site_data();
|
||
|
||
// 如果是多站点,清理所有站点的选项
|
||
if ( is_multisite() ) {
|
||
$sites = get_sites( [ 'fields' => 'ids' ] );
|
||
foreach ( $sites as $site_id ) {
|
||
switch_to_blog( $site_id );
|
||
wpmind_cleanup_site_data();
|
||
restore_current_blog();
|
||
}
|
||
}
|