<?php
/**
 * WordPress 清理和优化功能
 * 包含头像替换、自动更新禁用、冗余代码移除等功能
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

/**
 * 替换 Gravatar 头像为 V2EX CDN
 */
function replace_gravatar($avatar) {
    $avatar = str_replace(array(
        "//gravatar.com/", 
        "//secure.gravatar.com/", 
        "//www.gravatar.com/", 
        "//0.gravatar.com/", 
        "//1.gravatar.com/", 
        "//2.gravatar.com/", 
        "//cn.gravatar.com/"
    ), "//cdn.v2ex.com/gr", $avatar);
    return $avatar;
}
add_filter('get_avatar', 'replace_gravatar');

/**
 * 修复 WordPress 上 Cravatar 头像无法显示问题
 */
if (!function_exists('get_cravatar_url')) {
    function get_cravatar_url($url) {
        $sources = array(
            'www.gravatar.com',
            '0.gravatar.com',
            '1.gravatar.com',
            '2.gravatar.com',
            'secure.gravatar.com',
            'cn.gravatar.com'
        );
        return str_replace($sources, 'cravatar.cn', $url);
    }
    add_filter('um_user_avatar_url_filter', 'get_cravatar_url', 1);
    add_filter('bp_gravatar_url', 'get_cravatar_url', 1);
    add_filter('get_avatar_url', 'get_cravatar_url', 1);
}

/**
 * 文章插入图片自动移除 img 的 width、height、class 属性
 */
function fanly_remove_images_attribute($html) {
    $html = preg_replace('/width="(\d*)"\s+height="(\d*)"\s+class="[^"]*"/', "", $html);
    $html = preg_replace('/  /', "", $html);
    return $html;
}
add_filter('post_thumbnail_html', 'fanly_remove_images_attribute', 10);
add_filter('image_send_to_editor', 'fanly_remove_images_attribute', 10);

/**
 * 移动设备自适应图片删除 width 和 height 属性
 */
function ludou_remove_width_height_attribute($content) {
    preg_match_all('/<[img|IMG].*?src=[\'"](.+?(?:[\.+gif|\.+jpg|\.+png\.webp]))[\'"].*?[\/]?>/', $content, $images);
    if (!empty($images) && is_array($images) && isset($images[0]) && is_array($images[0]) && !empty($images[0])) {
        foreach ($images[0] as $index => $value) {
            if (isset($images[0][$index]) && is_string($images[0][$index])) {
                $new_img = preg_replace('/(width|height)="\d*"\s/', "", $images[0][$index]);
                $content = str_replace($images[0][$index], $new_img, $content);
            }
        }
    }
    return $content;
}

// 判断是否是移动设备浏览
if (wp_is_mobile()) {
    add_filter('the_content', 'ludou_remove_width_height_attribute', 99);
}

/**
 * 彻底关闭自动更新（核心程序/主题/插件/翻译自动更新）
 */
add_filter('automatic_updater_disabled', '__return_true');

// 关闭更新检查定时作业
remove_action('init', 'wp_schedule_update_checks');

// 移除已有的版本检查定时作业
wp_clear_scheduled_hook('wp_version_check');
wp_clear_scheduled_hook('wp_update_plugins');
wp_clear_scheduled_hook('wp_update_themes');
wp_clear_scheduled_hook('wp_maybe_auto_update');

// 移除后台内核更新检查
remove_action('admin_init', '_maybe_update_core');

// 移除后台插件更新检查
remove_action('load-plugins.php', 'wp_update_plugins');
remove_action('load-update.php', 'wp_update_plugins');
remove_action('load-update-core.php', 'wp_update_plugins');
remove_action('admin_init', '_maybe_update_plugins');

// 移除后台主题更新检查
remove_action('load-themes.php', 'wp_update_themes');
remove_action('load-update.php', 'wp_update_themes');
remove_action('load-update-core.php', 'wp_update_themes');
remove_action('admin_init', '_maybe_update_themes');

// 关闭程序更新提示
add_filter('pre_site_transient_update_core', function($a) { return null; });
add_filter('pre_site_transient_update_plugins', function($a) { return null; });
add_filter('pre_site_transient_update_themes', function($a) { return null; });

/**
 * 关闭 WordPress 的 XML-RPC 功能
 */
add_filter('xmlrpc_enabled', '__return_false');

/**
 * 关闭 XML-RPC 的 pingback 端口
 */
function remove_xmlrpc_pingback_ping($methods) {
    // 确保 $methods 是数组
    if (!is_array($methods)) {
        return $methods;
    }
    
    unset($methods['pingback.ping']);
    return $methods;
}
add_filter('xmlrpc_methods', 'remove_xmlrpc_pingback_ping');

/**
 * 移除前端网页源代码内的头部冗余代码
 */
remove_action('wp_head', 'feed_links_extra', 3);
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'index_rel_link');
remove_action('wp_head', 'start_post_rel_link', 10, 0);
remove_action('wp_head', 'wp_generator');

/**
 * 禁止新版文章编辑器加载前端样式
 */
function wpassist_remove_block_library_css() {
    wp_dequeue_style('wp-block-library');
    wp_dequeue_style('wp-block-library-theme');
    wp_dequeue_style('wc-block-style'); // WooCommerce
    wp_dequeue_style('global-styles'); // WordPress 5.9+
}
add_action('wp_enqueue_scripts', 'wpassist_remove_block_library_css', 100);

/**
 * 移除前后台顶部工具栏指定菜单
 */
function admin_bar_item(WP_Admin_Bar $admin_bar) {
    $admin_bar->remove_menu('wp-logo'); // 移除 wp 的 logo
    $admin_bar->remove_menu('updates'); // 移除更新提示
    $admin_bar->remove_menu('comments'); // 移除评论提示
}
add_action('admin_bar_menu', 'admin_bar_item', 500);

/**
 * 移除后台仪表盘菜单：活动、新闻
 */
function bzg_remove_dashboard_widgets() {
    global $wp_meta_boxes;
    
    // 确保 $wp_meta_boxes 是数组且包含必要的键
    if (!is_array($wp_meta_boxes)) {
        return;
    }
    
    // 安全地移除 "活动"
    if (isset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_activity'])) {
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_activity']);
    }
    
    // 安全地移除 "WordPress 新闻"
    if (isset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary'])) {
        unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);
    }
}
add_action('wp_dashboard_setup', 'bzg_remove_dashboard_widgets');

/**
 * 移除 login 页面的版权信息
 */
function yqd_login_logo_url() {
    return home_url();
}
add_filter('login_headerurl', 'yqd_login_logo_url');

/**
 * 自定义登录页面logo
 */
function custom_login_logo() {
    echo '<style type="text/css">
        #login h1 a {
            background-image: url(' . get_template_directory_uri() . '/assets/images/logo.svg) !important;
            background-size: contain !important;
            background-repeat: no-repeat !important;
            background-position: center !important;
            width: 200px !important;
            height: 80px !important;
            margin: 0 auto 25px !important;
        }
    </style>';
}
add_action('login_enqueue_scripts', 'custom_login_logo');

/**
 * 自定义登录页面logo标题
 */
function custom_login_logo_title() {
    return get_bloginfo('name');
}
add_filter('login_headertitle', 'custom_login_logo_title');

/**
 * 删除 WordPress 后台底部版权信息
 */
function _admin_footer_right_text($text) {
    $text = '';
    return $text;
}
add_filter('update_footer', '_admin_footer_right_text', 11);

/**
 * 移除后台仪表盘菜单：帮助
 */
function bzg_remove_help() {
    $screen = get_current_screen();
    if ($screen && method_exists($screen, 'remove_help_tabs')) {
        $screen->remove_help_tabs();
    }
}
add_action('admin_head', 'bzg_remove_help');

/**
 * 禁用 pingbacks, enclosures, trackbacks
 */
remove_action('do_pings', 'do_all_pings', 10);
remove_action('publish_post', '_publish_post_hook', 5);

/**
 * 禁止加载 s.w.org 获取表情和头像
 */
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_styles', 'print_emoji_styles');

/**
 * 移除 DNS 预取
 */
function remove_dns_prefetch($hints, $relation_type) {
    // 确保 $hints 是数组
    if (!is_array($hints)) {
        return $hints;
    }
    
    if ('dns-prefetch' === $relation_type) {
        $unique_hosts = wp_dependencies_unique_hosts();
        if (is_array($unique_hosts)) {
            return array_diff($hints, $unique_hosts);
        }
    }
    return $hints;
}
add_filter('wp_resource_hints', 'remove_dns_prefetch', 10, 2);

/**
 * 替换评论用户头像链接为国内镜像加速源访问
 */
add_filter('get_avatar', function ($avatar) {
    return str_replace([
        'www.gravatar.com/avatar/',
        '0.gravatar.com/avatar/',
        '1.gravatar.com/avatar/',
        '2.gravatar.com/avatar/',
        'secure.gravatar.com/avatar/',
        'cn.gravatar.com/avatar/'
    ], 'cravatar.cn/', $avatar);
});

/**
 * 禁止查询网站静态资源连接版本字符
 */
function _remove_script_version($src) {
    $parts = explode('?', $src);
    return $parts[0];
}
add_filter('script_loader_src', '_remove_script_version', 15, 1);
add_filter('style_loader_src', '_remove_script_version', 15, 1);

/**
 * 支持 WebP 格式
 */
function add_webp_mime_type($mimes) {
    $mimes['webp'] = 'image/webp';
    return $mimes;
}
add_filter('mime_types', 'add_webp_mime_type');

/**
 * 支持 SVG 格式
 */
function add_svg_mime_type($mimes) {
    $mimes['svg'] = 'image/svg+xml';
    return $mimes;
}
add_filter('upload_mimes', 'add_svg_mime_type');

/**
 * 优化CSS加载 - 延迟加载非关键CSS
 */
function optimize_css_loading() {
    // 仅在前端执行
    if (is_admin()) {
        return;
    }
    
    // 延迟加载非关键CSS
    add_filter('style_loader_tag', function($html, $handle, $href, $media) {
        // 定义非关键CSS样式表
        $non_critical_styles = array(
            'wp-block-library',
            'wp-block-library-theme',
            'wc-block-style',
            'global-styles'
        );
        
        if (in_array($handle, $non_critical_styles)) {
            // 使用preload + onload技术延迟加载
            $html = str_replace("rel='stylesheet'", "rel='preload' as='style' onload=\"this.onload=null;this.rel='stylesheet'\"", $html);
            // 添加noscript fallback
            $html .= '<noscript>' . str_replace("rel='preload' as='style' onload=\"this.onload=null;this.rel='stylesheet'\"", "rel='stylesheet'", $html) . '</noscript>';
        }
        
        return $html;
    }, 10, 4);
}
add_action('wp_enqueue_scripts', 'optimize_css_loading', 1);

/**
 * 优化JavaScript加载
 */
function optimize_js_loading() {
    // 仅在前端执行
    if (is_admin()) {
        return;
    }
    
    // 为非关键JS添加defer属性
    add_filter('script_loader_tag', function($tag, $handle, $src) {
        // 定义需要defer的脚本
        $defer_scripts = array(
            'jquery-migrate',
            'wp-embed',
            'comment-reply'
        );
        
        if (in_array($handle, $defer_scripts)) {
            return str_replace(' src', ' defer src', $tag);
        }
        
        return $tag;
    }, 10, 3);
}
add_action('wp_enqueue_scripts', 'optimize_js_loading', 1);

/**
 * 移除不必要的CSS和JS
 */
function remove_unnecessary_assets() {
    // 仅在前端执行
    if (is_admin()) {
        return;
    }
    
    // 移除WordPress默认样式
    wp_dequeue_style('dashicons'); // 仅后台需要
    
    // 移除不必要的JS
    wp_dequeue_script('wp-embed');
    
    // 如果不使用评论功能，移除评论相关脚本
    if (!is_single() && !is_page()) {
        wp_dequeue_script('comment-reply');
    }
}
add_action('wp_enqueue_scripts', 'remove_unnecessary_assets', 100);

/**
 * 添加关键CSS内联
 */
function add_critical_css() {
    // 仅在前端执行
    if (is_admin()) {
        return;
    }
    
    // 添加关键CSS到head中
    echo '<style id="critical-css">';
    echo 'body{margin:0;padding:0;font-family:sans-serif;}';
    echo '.site-header{position:relative;z-index:999;}';
    echo '.main-content{min-height:50vh;}';
    echo '</style>';
}
add_action('wp_head', 'add_critical_css', 1);

/**
 * 优化资源提示
 */
function add_resource_hints() {
    // 仅在前端执行
    if (is_admin()) {
        return;
    }
    
    // 添加DNS预连接
    echo '<link rel="preconnect" href="//fonts.googleapis.com" crossorigin>';
    echo '<link rel="preconnect" href="//cdn.v2ex.com" crossorigin>';
    echo '<link rel="preconnect" href="//cravatar.cn" crossorigin>';
}
add_action('wp_head', 'add_resource_hints', 1);

/**
 * 压缩HTML输出
 */
function compress_html_output($buffer) {
    // 仅在前端压缩
    if (is_admin()) {
        return $buffer;
    }
    
    // 移除HTML注释（保留IE条件注释）
    $buffer = preg_replace('/<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->/s', '', $buffer);
    
    // 移除多余的空白字符
    $buffer = preg_replace('/\s+/', ' ', $buffer);
    
    // 移除行首行尾空白
    $buffer = preg_replace('/^\s+|\s+$/m', '', $buffer);
    
    return $buffer;
}

// 启用HTML压缩（可选，可能影响某些插件）
// add_action('template_redirect', function() {
//     if (!is_admin()) {
//         ob_start('compress_html_output');
//     }
// });