如何用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
相关产品推荐
相关产品推荐

