首页 / 应用软件 / 手把手教学,为WordPress集成智能化的网站图片懒加载与CDN加速工具

手把手教学,为WordPress集成智能化的网站图片懒加载与CDN加速工具

手把手教学:为WordPress集成智能化的网站图片懒加载与CDN加速工具

引言:为什么WordPress网站需要图片懒加载与CDN加速?

在当今互联网环境中,网站加载速度已成为影响用户体验、搜索引擎排名和转化率的关键因素。据统计,页面加载时间每增加1秒,转化率就会下降7%。对于WordPress网站而言,图片通常是页面中最大的资源,占用了大量的带宽和加载时间。

图片懒加载和CDN加速是解决这一问题的两个关键技术:

  1. 图片懒加载:延迟加载非视口内的图片,只有当用户滚动到图片附近时才加载,显著减少初始页面加载时间。
  2. CDN加速:通过全球分布的服务器网络分发静态资源,减少用户与服务器之间的物理距离,加快资源加载速度。

本文将手把手教您如何通过WordPress代码二次开发,集成智能化的图片懒加载与CDN加速功能,无需依赖臃肿的插件,实现轻量高效的性能优化。

第一部分:理解WordPress图片加载机制

1.1 WordPress默认图片处理方式

WordPress通过the_content()函数和特色图像功能输出图片时,会生成标准的HTML <img>标签。例如:

<img src="https://example.com/wp-content/uploads/2023/05/image.jpg" 
     alt="示例图片" 
     width="800" 
     height="600" 
     class="aligncenter size-full wp-image-123">

这种传统方式会在页面加载时立即请求所有图片,无论用户是否能看到它们。

1.2 现代图片优化技术

现代网站优化通常采用以下技术:

  • 响应式图片:根据设备屏幕尺寸提供不同大小的图片
  • 下一代图片格式:WebP、AVIF等更高效的格式
  • 懒加载:延迟加载非视口图片
  • CDN分发:通过边缘节点快速交付图片

第二部分:实现智能图片懒加载功能

2.1 懒加载的基本原理

懒加载的核心思想是:将图片的src属性替换为data-src属性,当图片进入视口时,再将data-src的值赋给src属性,触发图片加载。

2.2 创建懒加载函数

在您的WordPress主题的functions.php文件中添加以下代码:

/**
 * 为WordPress图片添加懒加载功能
 */
function add_lazy_loading_to_images($content) {
    // 如果内容为空,直接返回
    if (empty($content)) {
        return $content;
    }
    
    // 创建DOM文档对象
    $dom = new DOMDocument();
    
    // 抑制HTML解析错误警告
    libxml_use_internal_errors(true);
    
    // 加载HTML内容,指定编码为UTF-8
    $dom->loadHTML('<?xml encoding="UTF-8">' . $content);
    
    // 清除错误
    libxml_clear_errors();
    
    // 获取所有图片标签
    $images = $dom->getElementsByTagName('img');
    
    // 遍历所有图片
    foreach ($images as $image) {
        // 获取原始src
        $src = $image->getAttribute('src');
        
        // 如果src为空,跳过
        if (empty($src)) {
            continue;
        }
        
        // 获取图片类名
        $classes = $image->getAttribute('class');
        
        // 排除某些不需要懒加载的图片(如首屏图片)
        if (strpos($classes, 'no-lazy') !== false) {
            continue;
        }
        
        // 将src转换为data-src
        $image->setAttribute('data-src', $src);
        
        // 设置占位符(1x1像素的透明GIF)
        $image->setAttribute('src', 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==');
        
        // 添加懒加载类
        $new_classes = $classes . ' lazy-load';
        $image->setAttribute('class', trim($new_classes));
        
        // 添加noscript标签作为降级方案
        $noscript = $dom->createElement('noscript');
        $noscript_img = $dom->createElement('img');
        $noscript_img->setAttribute('src', $src);
        
        // 复制所有原始属性到noscript图片
        foreach ($image->attributes as $attr) {
            if ($attr->nodeName !== 'data-src' && $attr->nodeName !== 'class') {
                $noscript_img->setAttribute($attr->nodeName, $attr->nodeValue);
            }
        }
        
        $noscript->appendChild($noscript_img);
        $image->parentNode->insertBefore($noscript, $image->nextSibling);
    }
    
    // 保存修改后的HTML
    $content = $dom->saveHTML();
    
    // 提取body内容
    $content = preg_replace('/^<!DOCTYPE.+?>/', '', $content);
    $content = str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $content);
    
    return $content;
}

// 将懒加载应用到文章内容
add_filter('the_content', 'add_lazy_loading_to_images', 99);

// 将懒加载应用到文章摘要
add_filter('get_the_excerpt', 'add_lazy_loading_to_images', 99);

// 将懒加载应用到小工具内容
add_filter('widget_text', 'add_lazy_loading_to_images', 99);

2.3 添加懒加载JavaScript

在主题的footer.php文件之前或使用wp_footer钩子添加JavaScript代码:

/**
 * 添加懒加载JavaScript
 */
function add_lazy_load_script() {
    ?>
    <script>
    (function() {
        'use strict';
        
        // 懒加载配置
        var lazyLoadConfig = {
            // 图片进入视口前多少像素开始加载
            rootMargin: '50px 0px',
            // 图片加载阈值
            threshold: 0.01
        };
        
        // 检查浏览器是否支持IntersectionObserver
        if ('IntersectionObserver' in window) {
            // 使用IntersectionObserver API实现懒加载
            var lazyImages = document.querySelectorAll('img.lazy-load');
            
            var imageObserver = new IntersectionObserver(function(entries, observer) {
                entries.forEach(function(entry) {
                    if (entry.isIntersecting) {
                        var lazyImage = entry.target;
                        
                        // 替换data-src为src
                        if (lazyImage.dataset.src) {
                            lazyImage.src = lazyImage.dataset.src;
                        }
                        
                        // 替换data-srcset为srcset(响应式图片)
                        if (lazyImage.dataset.srcset) {
                            lazyImage.srcset = lazyImage.dataset.srcset;
                        }
                        
                        // 加载完成后移除懒加载类
                        lazyImage.onload = function() {
                            lazyImage.classList.remove('lazy-load');
                            lazyImage.classList.add('lazy-loaded');
                        };
                        
                        // 处理加载错误
                        lazyImage.onerror = function() {
                            lazyImage.classList.remove('lazy-load');
                            lazyImage.classList.add('lazy-error');
                            console.error('图片加载失败: ' + lazyImage.dataset.src);
                        };
                        
                        // 停止观察该图片
                        imageObserver.unobserve(lazyImage);
                    }
                });
            }, lazyLoadConfig);
            
            // 开始观察所有懒加载图片
            lazyImages.forEach(function(lazyImage) {
                imageObserver.observe(lazyImage);
            });
            
        } else {
            // 不支持IntersectionObserver的降级方案
            var lazyImages = document.querySelectorAll('img.lazy-load');
            var lazyLoadThrottleTimeout;
            
            function lazyLoad() {
                if (lazyLoadThrottleTimeout) {
                    clearTimeout(lazyLoadThrottleTimeout);
                }
                
                lazyLoadThrottleTimeout = setTimeout(function() {
                    var scrollTop = window.pageYOffset;
                    
                    lazyImages.forEach(function(lazyImage) {
                        if (lazyImage.offsetTop < (window.innerHeight + scrollTop)) {
                            // 替换data-src为src
                            if (lazyImage.dataset.src) {
                                lazyImage.src = lazyImage.dataset.src;
                            }
                            
                            // 替换data-srcset为srcset
                            if (lazyImage.dataset.srcset) {
                                lazyImage.srcset = lazyImage.dataset.srcset;
                            }
                            
                            // 加载完成后移除懒加载类
                            lazyImage.onload = function() {
                                lazyImage.classList.remove('lazy-load');
                                lazyImage.classList.add('lazy-loaded');
                            };
                            
                            // 从数组中移除已处理的图片
                            lazyImages = Array.prototype.filter.call(lazyImages, function(image) {
                                return image !== lazyImage;
                            });
                            
                            // 如果所有图片都已加载,移除滚动事件监听
                            if (lazyImages.length === 0) {
                                document.removeEventListener('scroll', lazyLoad);
                                window.removeEventListener('resize', lazyLoad);
                                window.removeEventListener('orientationchange', lazyLoad);
                            }
                        }
                    });
                }, 20);
            }
            
            // 监听滚动、调整大小和方向变化事件
            document.addEventListener('scroll', lazyLoad);
            window.addEventListener('resize', lazyLoad);
            window.addEventListener('orientationchange', lazyLoad);
            
            // 初始加载
            lazyLoad();
        }
        
        // 添加CSS样式
        var style = document.createElement('style');
        style.textContent = `
            img.lazy-load {
                opacity: 0;
                transition: opacity 0.3s;
            }
            img.lazy-loaded {
                opacity: 1;
            }
            img.lazy-error {
                opacity: 0.5;
                filter: grayscale(100%);
            }
        `;
        document.head.appendChild(style);
    })();
    </script>
    <?php
}
add_action('wp_footer', 'add_lazy_load_script', 99);

第三部分:集成CDN加速功能

3.1 CDN加速原理

CDN(内容分发网络)通过将静态资源(如图片、CSS、JavaScript)缓存到全球分布的边缘服务器上,使用户可以从地理位置上最近的服务器获取资源,从而显著减少延迟。

3.2 配置WordPress使用CDN

functions.php中添加以下代码,将本地资源URL替换为CDN URL:

/**
 * 配置WordPress使用CDN
 */
function setup_cdn_for_wordpress() {
    // CDN配置
    $cdn_config = array(
        // 启用CDN
        'enabled' => true,
        
        // CDN域名(请替换为您的CDN域名)
        'cdn_domain' => 'cdn.yourdomain.com',
        
        // 本地域名(您的WordPress网站域名)
        'local_domain' => $_SERVER['HTTP_HOST'],
        
        // 要使用CDN的资源类型
        'file_extensions' => array('jpg', 'jpeg', 'png', 'gif', 'webp', 'ico', 'svg', 'css', 'js', 'pdf', 'zip', 'mp4', 'mp3', 'woff', 'woff2', 'ttf', 'eot'),
        
        // 排除的路径(某些路径下的资源不使用CDN)
        'exclude_paths' => array('/wp-admin/', '/wp-includes/', '/wp-content/plugins/', '/wp-content/themes/'),
        
        // 是否对管理员禁用CDN
        'disable_for_admin' => true
    );
    
    // 如果CDN未启用,直接返回
    if (!$cdn_config['enabled']) {
        return;
    }
    
    // 对管理员禁用CDN
    if ($cdn_config['disable_for_admin'] && current_user_can('manage_options')) {
        return;
    }
    
    // 返回配置
    return $cdn_config;
}

/**
 * 将本地URL替换为CDN URL
 */
function replace_urls_with_cdn($url) {
    // 获取CDN配置
    $cdn_config = setup_cdn_for_wordpress();
    
    // 如果没有配置或CDN未启用,返回原URL
    if (!$cdn_config || !$cdn_config['enabled']) {
        return $url;
    }
    
    // 解析URL
    $parsed_url = parse_url($url);
    
    // 如果不是HTTP/HTTPS协议,返回原URL
    if (!isset($parsed_url['scheme']) || !in_array($parsed_url['scheme'], array('http', 'https'))) {
        return $url;
    }
    
    // 检查主机名是否匹配本地域名
    if (isset($parsed_url['host']) && $parsed_url['host'] === $cdn_config['local_domain']) {
        // 检查路径是否在排除列表中
        if (isset($parsed_url['path'])) {
            foreach ($cdn_config['exclude_paths'] as $exclude_path) {
                if (strpos($parsed_url['path'], $exclude_path) === 0) {
                    return $url;
                }
            }
        }
        
        // 检查文件扩展名
        $path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
        $extension = pathinfo($path, PATHINFO_EXTENSION);
        
        if (empty($extension) || !in_array(strtolower($extension), $cdn_config['file_extensions'])) {
            return $url;
        }
        
        // 替换域名为CDN域名
        $url = str_replace(
            $cdn_config['local_domain'],
            $cdn_config['cdn_domain'],
            $url
        );
    }
    
    return $url;
}

// 应用CDN替换到各种URL
add_filter('wp_get_attachment_url', 'replace_urls_with_cdn');
add_filter('the_content', 'cdn_replace_content_urls', 99);
add_filter('widget_text', 'cdn_replace_content_urls', 99);
add_filter('stylesheet_uri', 'replace_urls_with_cdn');
add_filter('script_loader_src', 'replace_urls_with_cdn');
add_filter('style_loader_src', 'replace_urls_with_cdn');

/**
 * 替换内容中的URL为CDN URL
 */
function cdn_replace_content_urls($content) {
    // 获取CDN配置
    $cdn_config = setup_cdn_for_wordpress();
    
    // 如果没有配置或CDN未启用,返回原内容
    if (!$cdn_config || !$cdn_config['enabled']) {
        return $content;
    }
    
    // 正则表达式匹配URL
    $local_domain = preg_quote($cdn_config['local_domain'], '/');
    $cdn_domain = $cdn_config['cdn_domain'];
    
    // 匹配图片、CSS、JS等资源的URL
    $pattern = '/https?://' . $local_domain . '/[^"'s]*.(' . implode('|', $cdn_config['file_extensions']) . ')(?:?[^"'s]*)?/i';
    
    // 替换URL
    $content = preg_replace_callback($pattern, function($matches) use ($cdn_config) {
        $url = $matches[0];
        
        // 检查路径是否在排除列表中
        foreach ($cdn_config['exclude_paths'] as $exclude_path) {
            if (strpos($url, $exclude_path) !== false) {
                return $url;
            }
        }
        
        // 替换域名为CDN域名
        return str_replace(
            '//' . $cdn_config['local_domain'],
            '//' . $cdn_config['cdn_domain'],
            $url
        );
    }, $content);
    
    return $content;
}

3.3 高级CDN功能:自动WebP转换

现代CDN通常支持自动图片格式转换。以下代码可以检测浏览器是否支持WebP,并相应调整图片URL:

/**
 * 根据浏览器支持自动提供WebP格式图片
 */
function provide_webp_when_supported($url, $attachment_id) {
    // 获取CDN配置
    $cdn_config = setup_cdn_for_wordpress();
    
    // 如果没有配置或CDN未启用,返回原URL
    if (!$cdn_config || !$cdn_config['enabled']) {
        return $url;
    }
    
    // 检查URL是否已经是CDN URL
    if (strpos($url, $cdn_config['cdn_domain']) === false) {
        return $url;
    }
    
    // 检查文件扩展名
    $extension = pathinfo($url, PATHINFO_EXTENSION);
    $supported_extensions = array('jpg', 'jpeg', 'png');
    
    if (!in_array(strtolower($extension), $supported_extensions)) {
        return $url;
    }
    
    // 检查浏览器是否支持WebP
    if (isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'image/webp') !== false) {
        // 在URL中添加WebP参数或修改扩展名
        // 这取决于您的CDN提供商如何配置WebP转换
        // 示例:在URL末尾添加?format=webp
        if (strpos($url, '?') === false) {
            $url .= '?format=webp';
        } else {
            $url .= '&format=webp';
        }
    }
    
    return $url;
}

// 为图片URL添加WebP支持检测
add_filter('wp_get_attachment_url', 'provide_webp_when_supported', 10, 2);
add_filter('the_content', 'add_webp_support_to_content', 99);

/**
 * 为内容中的图片添加WebP支持
 */
function add_webp_support_to_content($content) {
    // 如果浏览器不支持WebP,直接返回
    if (!isset($_SERVER['HTTP_ACCEPT']) || strpos($_SERVER['HTTP_ACCEPT'], 'image/webp') === false) {
        return $content;
    }
    
    // 获取CDN配置
    $cdn_config = setup_cdn_for_wordpress();
    
    // 如果没有配置或CDN未启用,返回原内容
    if (!$cdn_config || !$cdn_config['enabled']) {
        return $content;
    }
    

图片URL并添加WebP参数

$cdn_domain = preg_quote($cdn_config['cdn_domain'], '/');
$pattern = '/https?://' . $cdn_domain . '/[^"'s]*.(jpg|jpeg|png)(?:?[^"'s]*)?/i';

$content = preg_replace_callback($pattern, function($matches) {
    $url = $matches[0];
    
    // 添加WebP格式参数
    if (strpos($url, '?') === false) {
        return $url . '?format=webp';
    } else {
        return $url . '&format=webp';
    }
}, $content);

return $content;

}


## 第四部分:集成响应式图片支持

### 4.1 WordPress响应式图片基础

WordPress 4.4+ 已内置响应式图片支持,但我们可以进一步优化:

/**

  • 增强WordPress响应式图片功能
    */

function enhance_responsive_images($html, $attachment_id, $size, $icon, $attr) {

// 获取原始图片URL
$image_url = wp_get_attachment_url($attachment_id);

if (!$image_url) {
    return $html;
}

// 获取图片元数据
$image_meta = wp_get_attachment_metadata($attachment_id);

if (!$image_meta) {
    return $html;
}

// 获取CDN配置
$cdn_config = setup_cdn_for_wordpress();

// 如果是CDN URL,确保响应式图片srcset也使用CDN
if ($cdn_config && $cdn_config['enabled']) {
    $html = str_replace(
        'srcset="' . $cdn_config['local_domain'],
        'srcset="' . $cdn_config['cdn_domain'],
        $html
    );
}

// 添加懒加载属性
$html = preg_replace('/<img(.*?)src=/', '<img$1data-src=', $html);
$html = preg_replace('/srcset=/', 'data-srcset=', $html);

// 添加懒加载类
if (strpos($html, 'class="') !== false) {
    $html = preg_replace('/class="(.*?)"/', 'class="$1 lazy-load"', $html);
} else {
    $html = preg_replace('/<img/', '<img class="lazy-load"', $html);
}

// 添加noscript回退
$noscript_html = preg_replace('/data-src=/', 'src=', $html);
$noscript_html = preg_replace('/data-srcset=/', 'srcset=', $noscript_html);
$noscript_html = preg_replace('/class="(.*?)lazy-load(.*?)"/', 'class="$1$2"', $noscript_html);

$html .= '<noscript>' . $noscript_html . '</noscript>';

return $html;

}

// 应用增强的响应式图片功能
add_filter('wp_get_attachment_image', 'enhance_responsive_images', 10, 5);


### 4.2 自定义图片尺寸生成

/**

  • 添加自定义图片尺寸用于响应式设计
    */

function add_custom_image_sizes() {

// 添加各种设备适用的图片尺寸
add_image_size('retina_large', 1920, 0, false);      // 大屏Retina设备
add_image_size('desktop_large', 1200, 0, false);     // 桌面大屏
add_image_size('desktop_medium', 800, 0, false);     // 桌面中屏
add_image_size('tablet_large', 600, 0, false);       // 平板大屏
add_image_size('tablet_small', 400, 0, false);       // 平板小屏
add_image_size('mobile_large', 300, 0, false);       // 手机大屏
add_image_size('mobile_small', 150, 0, false);       // 手机小屏

}

add_action('after_setup_theme', 'add_custom_image_sizes');

/**

  • 自定义图片尺寸的srcset
    */

function custom_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id) {

// 获取CDN配置
$cdn_config = setup_cdn_for_wordpress();

// 自定义尺寸映射
$custom_sizes = array(
    'retina_large' => 1920,
    'desktop_large' => 1200,
    'desktop_medium' => 800,
    'tablet_large' => 600,
    'tablet_small' => 400,
    'mobile_large' => 300,
    'mobile_small' => 150
);

foreach ($custom_sizes as $size_name => $width) {
    // 检查是否有该尺寸的图片
    if (isset($image_meta['sizes'][$size_name])) {
        $image_url = wp_get_attachment_image_url($attachment_id, $size_name);
        
        // 应用CDN
        if ($cdn_config && $cdn_config['enabled']) {
            $image_url = replace_urls_with_cdn($image_url);
        }
        
        $sources[$width] = array(
            'url'        => $image_url,
            'descriptor' => 'w',
            'value'      => $width,
        );
    }
}

// 按宽度排序
ksort($sources);

return $sources;

}

add_filter('wp_calculate_image_srcset', 'custom_image_srcset', 10, 5);


## 第五部分:性能优化与缓存策略

### 5.1 浏览器缓存优化

/**

  • 添加浏览器缓存头
    */

function add_cache_headers() {

// 如果不是管理页面
if (!is_admin()) {
    // 设置静态资源缓存时间(1年)
    $cache_time = 31536000; // 60*60*24*365
    
    // 获取当前请求的扩展名
    $request_uri = $_SERVER['REQUEST_URI'];
    $extension = pathinfo($request_uri, PATHINFO_EXTENSION);
    
    // 静态资源扩展名列表
    $static_extensions = array(
        'jpg', 'jpeg', 'png', 'gif', 'webp', 'ico', 'svg',
        'css', 'js', 'pdf', 'zip', 'mp4', 'mp3',
        'woff', 'woff2', 'ttf', 'eot'
    );
    
    if (in_array(strtolower($extension), $static_extensions)) {
        header("Cache-Control: public, max-age={$cache_time}, immutable");
        header("Expires: " . gmdate('D, d M Y H:i:s', time() + $cache_time) . ' GMT');
        
        // 添加ETag
        $etag = md5($request_uri . filemtime(ABSPATH . $request_uri));
        header("ETag: {$etag}");
    }
}

}

add_action('send_headers', 'add_cache_headers');


### 5.2 资源预加载与预连接

/**

  • 添加资源提示(Resource Hints)
    */

function add_resource_hints() {

// 获取CDN配置
$cdn_config = setup_cdn_for_wordpress();

if ($cdn_config && $cdn_config['enabled']) {
    // 预连接到CDN域名
    echo '<link rel="preconnect" href="https://' . esc_attr($cdn_config['cdn_domain']) . '" crossorigin>';
    
    // DNS预获取
    echo '<link rel="dns-prefetch" href="//' . esc_attr($cdn_config['cdn_domain']) . '">';
}

// 预加载关键资源
echo '<link rel="preload" href="' . get_template_directory_uri() . '/assets/css/critical.css" as="style">';
echo '<link rel="preload" href="' . get_template_directory_uri() . '/assets/js/lazyload.js" as="script">';

}

add_action('wp_head', 'add_resource_hints', 1);


## 第六部分:监控与调试功能

### 6.1 性能监控

/**

  • 添加性能监控
    */

class PerformanceMonitor {

private $start_time;
private $queries = array();

public function __construct() {
    $this->start_time = microtime(true);
    
    // 监控数据库查询
    if (defined('SAVEQUERIES') && SAVEQUERIES) {
        add_filter('query', array($this, 'log_query'));
    }
}

public function log_query($query) {
    $this->queries[] = array(
        'query' => $query,
        'time' => microtime(true)
    );
    return $query;
}

public function get_performance_data() {
    $end_time = microtime(true);
    $load_time = ($end_time - $this->start_time) * 1000; // 转换为毫秒
    
    $data = array(
        'load_time' => round($load_time, 2),
        'memory_usage' => round(memory_get_peak_usage() / 1024 / 1024, 2),
        'query_count' => count($this->queries),
        'cdn_enabled' => false
    );
    
    // 检查CDN状态
    $cdn_config = setup_cdn_for_wordpress();
    if ($cdn_config && $cdn_config['enabled']) {
        $data['cdn_enabled'] = true;
        $data['cdn_domain'] = $cdn_config['cdn_domain'];
    }
    
    return $data;
}

}

// 初始化性能监控
$performance_monitor = new PerformanceMonitor();

/**

  • 在页脚显示性能数据(仅管理员可见)
    */

function display_performance_data() {

global $performance_monitor;

if (current_user_can('manage_options')) {
    $data = $performance_monitor->get_performance_data();
    
    echo '<div style="position:fixed;bottom:10px;right:10px;background:rgba(0,0,0,0.8);color:#fff;padding:10px;font-size:12px;z-index:9999;border-radius:5px;">';
    echo '<strong>性能数据:</strong><br>';
    echo '加载时间: ' . $data['load_time'] . 'ms<br>';
    echo '内存使用: ' . $data['memory_usage'] . 'MB<br>';
    echo '数据库查询: ' . $data['query_count'] . '<br>';
    echo 'CDN: ' . ($data['cdn_enabled'] ? '已启用 (' . $data['cdn_domain'] . ')' : '未启用');
    echo '</div>';
}

}

add_action('wp_footer', 'display_performance_data');


### 6.2 图片加载错误处理

/**

  • 图片加载错误处理
    */

function handle_image_errors() {

?>
<script>
document.addEventListener('DOMContentLoaded', function() {
    // 监听图片加载错误
    document.addEventListener('error', function(e) {
        if (e.target.tagName === 'IMG') {
            var img = e.target;
            
            // 如果是懒加载图片
            if (img.classList.contains('lazy-load')) {
                // 尝试加载原始src(非CDN版本)
                var originalSrc = img.dataset.src;
                if (originalSrc) {
                    // 移除CDN域名,尝试加载原始图片
                    var localSrc = originalSrc.replace('cdn.yourdomain.com', 'yourdomain.com');
                    img.src = localSrc;
                    
                    // 标记为回退加载
                    img.dataset.fallback = 'true';
                }
            }
            
            // 添加错误类
            img.classList.add('image-error');
            
            // 可选:显示占位图
            if (!img.dataset.placeholderSet) {
                img.style.backgroundColor = '#f0f0f0';
                img.style.minHeight = '100px';
                img.dataset.placeholderSet = 'true';
            }
        }
    }, true); // 使用捕获阶段
});
</script>

<style>
.image-error {
    opacity: 0.5;
    filter: grayscale(100%);
}

.image-error::after {
    content: '图片加载失败';
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    color: #999;
    font-size: 12px;
}
</style>
<?php

}

add_action('wp_footer', 'handle_image_errors');


## 第七部分:完整集成与配置

### 7.1 创建配置页面

/**

  • 创建懒加载和CDN配置页面
    */

class LazyLoadCDN_Settings {


public function __construct() {
    add_action('admin_menu', array($this, 'add_admin_menu'));
    add_action('admin_init', array($this, 'settings_init'));
}

public function add_admin_menu() {
    add_options_page(
        '懒加载与CDN设置',
        '图片优化',
        'manage_options',
        'lazyload-cdn-settings',
        array($this, 'settings_page')
    );
}

public function settings_init() {
    register_setting('lazyload_cdn', 'lazyload_cdn_settings');
    
    add_settings_section(
        'lazyload_cdn_section',
        '懒加载与CDN配置',
        array($this, 'settings_section_callback'),
        'lazyload_cdn'
    );
    
    // CDN域名设置
    add_settings_field(
        'cdn_domain',
        'CDN域名',
        array($this, 'cdn_domain_render'),
        'lazyload_cdn',
        'lazyload_cdn_section'
    );
    
    // 懒加载启用设置
    add_settings_field(
        'lazyload_enabled',
        '启用懒加载',
        array($this, 'lazyload_enabled_render'),
        'lazyload_cdn',
        'lazyload_cdn_section'
    );
    
    // WebP支持设置
    add_settings_field(
        'webp_support',
        '启用WebP支持',
        array($this, 'webp_support_render'),
        'lazyload_cdn',
        'lazyload_cdn_section'
    );
    
    // 排除路径设置
    add_settings_field(
        'exclude_paths',
        '排除路径',
        array($this, 'exclude_paths_render'),
        'lazyload_cdn',
        'lazyload_cdn_section'
    );
}

public function cdn_domain_render() {
    $options = get_option('lazyload_cdn_settings');
    ?>
    <input type="text" name="lazyload_cdn_settings[cdn_domain]" 
           value="<?php echo isset($options['cdn_domain']) ? esc_attr($options['cdn_domain']) : ''; ?>"
           placeholder="cdn.yourdomain.com">
    <p class="description">请输入您的CDN域名,例如:cdn.yourdomain.com</p>
    <?php
}

public function lazyload_enabled_render() {
    $options = get_option('lazyload_cdn_settings');
    ?>
    <input type="checkbox" name="lazyload_cdn_settings[lazyload_enabled]" 
           value="1" <?php checked(isset($options['lazyload_enabled']) && $options['lazyload_enabled']); ?>>
    <label>启用图片懒加载功能</label>
    <?php
}

public function webp_support_render() {
    $options = get_option('lazyload_cdn_settings');
    ?>
    <input type="checkbox" name="lazyload_cdn_settings[webp_support]" 
           value="1" <?php checked(isset($options['webp_support']) && $options['webp_support']); ?>>
    <label>为支持WebP的浏览器自动提供WebP格式图片</label>
    <?php
}

public function exclude_paths_render() {
    $options = get_option('lazyload_cdn_settings');
    $paths = isset($options['exclude_paths']) ? $options['exclude_paths'] : "/wp-admin/n/wp-includes/";
    ?>
    <textarea name="lazyload_cdn_settings[exclude_paths]" 
              rows="5" cols="50"><?php echo esc_textarea($paths); ?></textarea>
    <p class="description">每行一个路径,这些路径下的资源将不使用CDN</p>
    <?php
}

public function settings_section_callback() {
    echo '配置图片懒加载和CDN加速功能';
}

public function settings_page() {
    ?>
    <div class="wrap">
        <h1>懒加载与CDN设置</h1>
        <form action="options.php" method="post">
            <?php
            settings_fields('lazyload_cdn');
            do_settings_sections('lazyload_cdn');
            submit_button();
            ?>
        </form>
        
        <div class="card">
            <h2>使用说明</h2>
            <ol>
                <li>配置CDN域名后,所有静态资源将通过CDN加速</li>
                <li>懒加载功能会延迟加载非视口内的图片</li>
                <li>WebP支持会自动为兼容浏览器提供更小的图片格式</li>
                <li>保存设置后,请清除缓存以查看效果</li>
            </ol>
        </div>
    </div>
    <?php
}

}

// 初始化设置页面
if (is_admin()) {

new LazyLoadCDN_Settings();

}


### 7.2 更新配置获取函数

/**

  • 更新CDN配置获取函数,
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5363.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部