Loading...
正在加载...
请稍候

WordPress用自动静态Cache文章页面WPCode代码片段

✨步子哥 (steper) 2025年11月16日 08:54

这是一个WPCode代码片段,实现了文章静态缓存功能。代码逻辑清晰,包含完整注释,可直接在WPCode插件中使用:

// WPCode代码片段
// 标题: 智能文章静态缓存系统
// 描述: 自动为文章生成静态HTML缓存,优先返回缓存内容以提升访问速度
// 类型: PHP代码片段
// 位置: 在网站前端运行

// ========== 配置区域 ==========
define('HTML_CACHE_DIR', ABSPATH . 'htmlpages/'); // 缓存存储目录
define('HTML_CACHE_LOCK_TTL', 300); // 缓存更新锁有效期(秒)

// ========== 核心功能函数 ==========

/**
 * 确保缓存目录存在且安全
 */
function html_cache_ensure_directory() {
    if (!is_dir(HTML_CACHE_DIR)) {
        wp_mkdir_p(HTML_CACHE_DIR);
        // 创建.htaccess保护文件,防止直接访问
        @file_put_contents(HTML_CACHE_DIR . '.htaccess', "Deny from all\n");
    }
}

/**
 * 获取文章对应的缓存文件路径
 */
function html_cache_get_filepath({{LATEX:0}}post_id . '.html';
}

/**
 * 获取缓存更新锁文件路径
 */
function html_cache_get_lockpath({{LATEX:1}}post_id;
}

/**
 * 验证缓存文件是否有效(未过期)
 */
function html_cache_is_valid({{LATEX:2}}cache_file) {
    if (!file_exists({{LATEX:3}}post_modified = get_post_modified_time('U', false, {{LATEX:4}}cache_modified = @filemtime({{LATEX:5}}cache_modified && {{LATEX:6}}post_modified;
}

/**
 * 输出缓存内容并终止执行
 */
function html_cache_serve({{LATEX:7}}status) {
    // 发送自定义HTTP头(用于调试)
    header('X-Cache: ' . {{LATEX:8}}modified = filemtime({{LATEX:9}}modified) . ' GMT');
    
    // 检查浏览器If-Modified-Since头
    if (isset({{LATEX:10}}if_modified = strtotime({{LATEX:11}}if_modified && {{LATEX:12}}modified) {
            status_header(304); // Not Modified
            exit;
        }
    }
    
    // 读取并输出缓存文件
    readfile({{LATEX:13}}post;
    if (!{{LATEX:14}}post->post_type !== 'post') {
        return;
    }
    
    {{LATEX:15}}post->ID;
    {{LATEX:16}}post_id);
    
    // 确保缓存目录可用
    html_cache_ensure_directory();
    
    // ==================== 场景1: 缓存有效 ====================
    if (html_cache_is_valid({{LATEX:17}}cache_file)) {
        // 缓存未过期,直接返回
        html_cache_serve({{LATEX:18}}cache_file)) {
        // 先返回旧缓存给用户(实现"先返回,后更新")
        html_cache_serve({{LATEX:19}}lock_file = html_cache_get_lockpath({{LATEX:20}}lock_file) || (time() - filemtime({{LATEX:21}}lock_file);
            
            // 使用wp-cron调度后台更新任务
            if (!wp_next_scheduled('html_cache_regenerate', array({{LATEX:22}}post_id));
            }
        }
        
        exit; // 重要:必须终止执行
    }
    
    // ==================== 场景3和4: 缓存不存在 ====================
    // 手动生成缓存:加载模板并捕获输出
    setup_postdata({{LATEX:23}}content = ob_get_clean();
    
    // 保存到缓存文件(原子操作)
    {{LATEX:24}}cache_file . '.tmp';
    @file_put_contents({{LATEX:25}}content, LOCK_EX);
    rename({{LATEX:26}}cache_file);
    
    // 输出生成的内容并标记为MISS
    header('X-Cache: MISS');
    echo {{LATEX:27}}post_id) {
    // 构建带随机参数的文章URL(避免被缓存)
    {{LATEX:28}}post_id);
    {{LATEX:29}}url);
    
    // 发起非阻塞HTTP请求触发缓存生成
    // timeout=0.01确保请求立即返回,不阻塞当前进程
    wp_remote_get({{LATEX:30}}locks = glob(HTML_CACHE_DIR . '.lock_*');
    if ({{LATEX:31}}locks as {{LATEX:32}}lock) > HTML_CACHE_LOCK_TTL * 2) {
                @unlink($lock);
            }
        }
    }
});

功能说明

  1. 三种场景完美实现

    • 缓存有效:直接返回静态文件(X-Cache: HIT
    • 缓存过期:先返回旧缓存,后台静默更新(X-Cache: STALE
    • 无缓存:实时生成,保存后返回(X-Cache: MISS
  2. 智能更新机制

    • 使用wp-cron调度后台任务,PHP非阻塞请求实现异步更新
    • 文件锁防止重复更新,5分钟有效期
  3. 性能优化

    • 支持HTTP 304状态码,减少 bandwidth
    • 添加X-Cache头便于调试
    • 文件原子写入,避免缓存损坏
  4. 安全保护

    • 自动生成.htaccess禁止直接访问缓存目录
    • 严格的后台更新验证

讨论回复

0 条回复

还没有人回复,快来发表你的看法吧!

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录