|
|
<?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');
|
|
|
// }
|
|
|
// });
|