Files

346 lines
10 KiB
PHP
Raw Permalink Normal View History

<?php
/**
* AI SEO Generator 安装脚本
* 用于插件的安装、升级和卸载操作
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
/**
* 插件安装类
*/
class AiSeoInstaller {
/**
* 插件激活时执行
*/
public static function activate() {
self::create_database_tables();
self::set_default_options();
self::create_directories();
self::schedule_events();
// 刷新重写规则
flush_rewrite_rules();
// 记录激活时间
update_option('ai_seo_activated_time', current_time('timestamp'));
// 显示欢迎消息
set_transient('ai_seo_activation_notice', true, 30);
}
/**
* 插件停用时执行
*/
public static function deactivate() {
// 清理计划任务
wp_clear_scheduled_hook('ai_seo_cleanup_task');
// 刷新重写规则
flush_rewrite_rules();
// 记录停用时间
update_option('ai_seo_deactivated_time', current_time('timestamp'));
}
/**
* 插件卸载时执行
*/
public static function uninstall() {
// 删除选项
self::remove_options();
// 删除用户meta
self::remove_user_meta();
// 删除文章meta
self::remove_post_meta();
// 删除数据库表(可选)
// self::drop_database_tables();
// 清理计划任务
wp_clear_scheduled_hook('ai_seo_cleanup_task');
}
/**
* 创建数据库表
*/
private static function create_database_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// SEO日志表
$table_name = $wpdb->prefix . 'ai_seo_logs';
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
post_id bigint(20) NOT NULL,
action varchar(50) NOT NULL,
old_value text,
new_value text,
user_id bigint(20) NOT NULL,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY post_id (post_id),
KEY user_id (user_id),
KEY created_at (created_at)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 更新数据库版本
update_option('ai_seo_db_version', '1.0');
}
/**
* 设置默认选项
* 自动检测并支持所有公开的文章类型
*/
private static function set_default_options() {
// 获取所有公开的文章类型作为默认支持类型
$all_post_types = get_post_types(array('public' => true), 'names');
$default_supported_types = !empty($all_post_types) ? $all_post_types : array('post', 'page');
$default_options = array(
'ai_seo_api_key' => '',
'ai_seo_api_url' => '',
'ai_seo_auto_generate' => false,
'ai_seo_enable_logging' => true,
'ai_seo_cache_duration' => 3600, // 1小时
'ai_seo_max_retries' => 3,
'ai_seo_timeout' => 30,
'ai_seo_supported_post_types' => $default_supported_types,
'ai_seo_title_template' => '{title}',
'ai_seo_description_template' => '{description}',
'ai_seo_keywords_template' => '{keywords}',
'ai_seo_enable_frontend' => true,
'ai_seo_enable_admin_notices' => true
);
foreach ($default_options as $option_name => $default_value) {
if (get_option($option_name) === false) {
add_option($option_name, $default_value);
}
}
}
/**
* 创建必要的目录
*/
private static function create_directories() {
$upload_dir = wp_upload_dir();
$ai_seo_dir = $upload_dir['basedir'] . '/ai-seo';
if (!file_exists($ai_seo_dir)) {
wp_mkdir_p($ai_seo_dir);
// 创建.htaccess文件保护目录
$htaccess_content = "Order deny,allow\nDeny from all";
file_put_contents($ai_seo_dir . '/.htaccess', $htaccess_content);
// 创建index.php文件
file_put_contents($ai_seo_dir . '/index.php', '<?php // Silence is golden');
}
// 创建日志目录
$logs_dir = $ai_seo_dir . '/logs';
if (!file_exists($logs_dir)) {
wp_mkdir_p($logs_dir);
file_put_contents($logs_dir . '/index.php', '<?php // Silence is golden');
}
}
/**
* 安排计划任务
*/
private static function schedule_events() {
if (!wp_next_scheduled('ai_seo_cleanup_task')) {
wp_schedule_event(time(), 'daily', 'ai_seo_cleanup_task');
}
}
/**
* 删除插件选项
*/
private static function remove_options() {
$options_to_remove = array(
'ai_seo_api_key',
'ai_seo_api_url',
'ai_seo_auto_generate',
'ai_seo_enable_logging',
'ai_seo_cache_duration',
'ai_seo_max_retries',
'ai_seo_timeout',
'ai_seo_supported_post_types',
'ai_seo_title_template',
'ai_seo_description_template',
'ai_seo_keywords_template',
'ai_seo_enable_frontend',
'ai_seo_enable_admin_notices',
'ai_seo_activated_time',
'ai_seo_deactivated_time',
'ai_seo_db_version'
);
foreach ($options_to_remove as $option) {
delete_option($option);
}
}
/**
* 删除用户meta数据
*/
private static function remove_user_meta() {
global $wpdb;
$wpdb->query(
"DELETE FROM {$wpdb->usermeta}
WHERE meta_key LIKE 'ai_seo_%'"
);
}
/**
* 删除文章meta数据
*/
private static function remove_post_meta() {
global $wpdb;
$meta_keys = array(
'_ai_seo_title',
'_ai_seo_description',
'_ai_seo_keywords',
'_ai_seo_generated_at',
'_ai_seo_last_updated'
);
foreach ($meta_keys as $meta_key) {
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->postmeta} WHERE meta_key = %s",
$meta_key
)
);
}
}
/**
* 删除数据库表
*/
private static function drop_database_tables() {
global $wpdb;
$table_name = $wpdb->prefix . 'ai_seo_logs';
$wpdb->query("DROP TABLE IF EXISTS $table_name");
}
/**
* 检查系统要求
*/
public static function check_requirements() {
$requirements = array(
'php_version' => '7.4',
'wp_version' => '5.0',
'extensions' => array('curl', 'json')
);
$errors = array();
// 检查PHP版本
if (version_compare(PHP_VERSION, $requirements['php_version'], '<')) {
$errors[] = sprintf(
'需要PHP版本 %s 或更高,当前版本:%s',
$requirements['php_version'],
PHP_VERSION
);
}
// 检查WordPress版本
global $wp_version;
if (version_compare($wp_version, $requirements['wp_version'], '<')) {
$errors[] = sprintf(
'需要WordPress版本 %s 或更高,当前版本:%s',
$requirements['wp_version'],
$wp_version
);
}
// 检查PHP扩展
foreach ($requirements['extensions'] as $extension) {
if (!extension_loaded($extension)) {
$errors[] = sprintf('需要PHP扩展%s', $extension);
}
}
return $errors;
}
/**
* 数据库升级
*/
public static function upgrade_database() {
$current_version = get_option('ai_seo_db_version', '0');
if (version_compare($current_version, '1.0', '<')) {
self::create_database_tables();
}
// 未来版本的升级逻辑可以在这里添加
}
/**
* 创建示例内容
*/
public static function create_sample_content() {
// 可以在这里创建示例文章或页面
// 用于演示插件功能
}
/**
* 导入默认设置
*/
public static function import_default_settings() {
$settings_file = AI_SEO_PLUGIN_PATH . 'config/default-settings.json';
if (file_exists($settings_file)) {
$settings = json_decode(file_get_contents($settings_file), true);
if ($settings) {
foreach ($settings as $key => $value) {
update_option($key, $value);
}
}
}
}
}
// 注册激活、停用和卸载钩子
register_activation_hook(__FILE__, array('AiSeoInstaller', 'activate'));
register_deactivation_hook(__FILE__, array('AiSeoInstaller', 'deactivate'));
register_uninstall_hook(__FILE__, array('AiSeoInstaller', 'uninstall'));
// 检查数据库版本并升级
add_action('plugins_loaded', function() {
$current_version = get_option('ai_seo_db_version', '0');
if (version_compare($current_version, '1.0', '<')) {
AiSeoInstaller::upgrade_database();
}
});
// 显示激活通知
add_action('admin_notices', function() {
if (get_transient('ai_seo_activation_notice')) {
echo '<div class="notice notice-success is-dismissible">';
echo '<p><strong>AI SEO Generator</strong> 插件已成功激活!请前往 <a href="' . admin_url('options-general.php?page=ai-seo-generator') . '">设置页面</a> 配置API密钥。</p>';
echo '</div>';
delete_transient('ai_seo_activation_notice');
}
});
?>