
本文详解如何使用 WordPress REST API 的 after 参数配合 PHP DateTime 类,动态生成 ISO8601 格式时间戳,精准拉取最近 14 天内发布的全部文章,并安全集成到 wp_remote_get 请求中。
本文详解如何使用 wordpress rest api 的 `after` 参数配合 php datetime 类,动态生成 iso8601 格式时间戳,精准拉取最近 14 天内发布的全部文章,并安全集成到 `wp_remote_get` 请求中。
在 WordPress 开发中,通过 REST API 获取指定时间范围内的文章是常见需求。原方法仅拉取分页数据而未限定时间,易导致冗余或遗漏。要精准获取最近两周(14天)内发布的所有文章,关键在于正确构造 after 查询参数——它需符合 ISO8601 标准(如 2024-05-10T00:00:01),并代表时间下限(即“发布时间晚于该时刻”)。
以下为优化后的完整方法,已整合时间计算、错误处理与编码安全:
public function get_posts_via_rest_api(): array {
$page_number = (int) get_option('global_posts_page', 1);
// 计算 14 天前的零点后 1 秒(避免包含更早的午夜文章)
$two_weeks_ago = new DateTime();
$two_weeks_ago->modify('-14 days');
$two_weeks_ago->setTime(0, 0, 1); // 精确到 00:00:01
$after_param = rawurlencode($two_weeks_ago->format('Y-m-d\TH:i:s'));
$api_url = add_query_arg([
'page' => $page_number,
'after' => $after_param,
'per_page' => 100 // 建议显式设置 per_page(最大100),提升单次响应效率
], 'https://example.com/wp-json/wp/v2/posts');
try {
$response = wp_remote_get($api_url, [
'timeout' => 15,
'headers' => ['User-Agent' => 'WordPress-Custom-Plugin/1.0']
]);
if (is_wp_error($response)) {
error_log('REST API request failed: ' . $response->get_error_message());
return [];
}
$status_code = wp_remote_retrieve_response_code($response);
if ($status_code !== 200) {
error_log("REST API returned status code: {$status_code}");
return [];
}
$body = wp_remote_retrieve_body($response);
$posts = json_decode($body, false, 512, JSON_THROW_ON_ERROR);
return is_array($posts) ? $posts : [];
} catch (JsonException $e) {
error_log('JSON decode error: ' . $e->getMessage());
return [];
} catch (Exception $e) {
error_log('Unexpected error: ' . $e->getMessage());
return [];
}
}关键改进说明:
✅ 时间精度控制:使用 modify('-14 days') + setTime(0,0,1) 确保起始时间为“14天前的 00:00:01”,规避因时区或数据库毫秒级差异导致的边界遗漏;
✅ URL 安全编码:用 rawurlencode() 处理时间字符串,防止特殊字符(如 T、:)破坏 URL 结构;
✅ 请求健壮性增强:添加 timeout 和自定义 User-Agent 头;显式设置 per_page=100(REST API 默认仅返回10条),减少分页请求次数;
✅ 错误分类处理:区分 WP_Error、HTTP 状态码异常、JSON 解析异常,便于调试与监控;
✅ 类型安全:强制 $page_number 为整型,get_option 提供默认值避免空值风险。
⚠️ 注意事项:
- 若需获取全部符合条件的文章(不限于单页),需实现分页循环(检查
X-WP-TotalPages响应头并递增page参数); -
after参数仅支持 ISO8601 时间格式,不接受相对时间字符串(如"2 weeks ago"); - 确保目标站点的 REST API 已启用且未被插件/防火墙限制;
- 生产环境建议增加缓存层(如
wp_cache_set/get)避免高频重复请求。
通过以上实现,你即可稳定、高效、可维护地获取最近两周的 WordPress 文章数据,为内容聚合、数据分析或第三方同步提供可靠基础。


















