You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在W3 Total Cache的mfunc标签内获取页面ID?

在W3 Total Cache的mfunc片段中获取页面ID的解决方案

问题原因

页面被缓存后,WordPress的全局查询上下文(比如$wp_query对象)不会被初始化,导致get_queried_object_id()无法获取到正确的文章ID——这个函数依赖未缓存时的动态查询环境,缓存后自然失效。

解决方法

方法一:通过请求路径获取文章ID(适配大多数 permalink 结构)

这是最通用的方案,利用当前请求的URL路径反向匹配文章:

<!-- mfunc {phrase} -->
// 提取请求的路径部分
$request_path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
// 根据路径获取对应的文章对象
$post = get_page_by_path($request_path);
if ($post) {
    $approved_comments = get_comments([
        "post_id" => $post->ID,
        "status" => "approve"
    ]);
    wp_list_comments([], $approved_comments);
}
<!-- /mfunc {phrase}-->

方法二:直接读取URL中的ID参数(仅适用于默认 permalink)

如果你的网站使用默认的/?p=123这类URL格式,可以直接从请求参数中获取ID:

<!-- mfunc {phrase} -->
if (isset($_GET['p']) && is_numeric($_GET['p'])) {
    $post_id = (int)$_GET['p'];
    $approved_comments = get_comments([
        "post_id" => $post_id,
        "status" => "approve"
    ]);
    wp_list_comments([], $approved_comments);
}
<!-- /mfunc {phrase}-->

方法三:利用W3 Total Cache内置的请求头(需配置支持)

部分W3 Total Cache配置会在请求头中传递文章ID,你可以尝试读取这个值:

<!-- mfunc {phrase} -->
if (isset($_SERVER['HTTP_X_W3TC_POST_ID']) && is_numeric($_SERVER['HTTP_X_W3TC_POST_ID'])) {
    $post_id = (int)$_SERVER['HTTP_X_W3TC_POST_ID'];
    $approved_comments = get_comments([
        "post_id" => $post_id,
        "status" => "approve"
    ]);
    wp_list_comments([], $approved_comments);
}
<!-- /mfunc {phrase}-->

注意:这个方法需要确保W3 Total Cache的相关配置已启用,否则无法获取到该请求头。

推荐方案

优先选择方法一,它不依赖特定的URL格式或缓存配置,适配绝大多数WordPress网站的 permalink 设置。

内容的提问来源于stack exchange,提问作者trainmania100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:10:53