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

如何用PHP Curl获取WordPress文章总数?无法获取分页响应头

解决PHP Curl调用WordPress REST API无法获取X-WP-Total/X-WP-TotalPages头的问题

X-WP-Total和X-WP-TotalPages属于HTTP响应头字段,并非响应体JSON的一部分。你的当前代码仅获取了响应体内容,没有捕获响应头信息,因此无法拿到这两个用于分页的字段。以下是两种修正方案:

方案一:分离响应头与响应体

通过启用CURLOPT_HEADER选项让Curl返回完整的响应(头+体),再通过CURLINFO_HEADER_SIZE拆分出头和体:

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://example.com/wp-json/wp/v2/posts",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HEADER => true, // 启用返回响应头
    CURLOPT_HTTPHEADER => [
        'Accept: application/json',
        // 移除不必要的Access-Control-*请求头(这是服务器返回的响应头,客户端无需发送)
    ],
));

$fullResponse = curl_exec($curl);
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$responseHeaders = substr($fullResponse, 0, $headerSize);
$responseBody = substr($fullResponse, $headerSize);

// 解析响应头
$headers = [];
foreach (explode("\r\n", $responseHeaders) as $line) {
    if (strpos($line, ':') !== false) {
        list($key, $value) = explode(':', $line, 2);
        $headers[trim($key)] = trim($value);
    }
}

// 获取分页字段
$totalPosts = $headers['X-WP-Total'] ?? 0;
$totalPages = $headers['X-WP-TotalPages'] ?? 0;

// 处理文章数据
$posts = json_decode($responseBody);

curl_close($curl);

// 后续可使用$totalPosts和$totalPages实现分页逻辑

方案二:使用回调函数收集响应头

通过CURLOPT_HEADERFUNCTION设置回调,在Curl接收响应头时直接收集:

$curl = curl_init();
$responseHeaders = [];

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://example.com/wp-json/wp/v2/posts",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => [
        'Accept: application/json',
    ],
    CURLOPT_HEADERFUNCTION => function($curl, $header) use (&$responseHeaders) {
        $len = strlen($header);
        $header = explode(':', $header, 2);
        if (count($header) >= 2) {
            $responseHeaders[trim($header[0])] = trim($header[1]);
        }
        return $len;
    }
));

$responseBody = curl_exec($curl);
$posts = json_decode($responseBody);

// 获取分页字段
$totalPosts = $responseHeaders['X-WP-Total'] ?? 0;
$totalPages = $responseHeaders['X-WP-TotalPages'] ?? 0;

curl_close($curl);

注意事项

  • 确保WordPress REST API默认分页功能未被禁用,若自定义了API路由,需确认代码中保留了响应头输出逻辑。
  • 若站点使用缓存插件,需清除缓存或配置缓存规则以保留X-WP-Total/X-WP-TotalPages头信息。

内容的提问来源于stack exchange,提问作者G-Square Official

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:51:29