WordPress API调用示例代码:5种真实场景的完整实现方案
- Linkreate AI插件 文章
- 2025-09-08 22:06:17
- 12阅读
在构建现代WordPress应用时,API调用已成为连接前后端、集成第三方服务和实现数据自动化的核心手段。无论是从外部系统拉取内容,还是将WordPress作为内容中台对外提供数据,掌握真实可用的API调用示例代码,是每个开发者必须具备的能力。
本文将基于当前WordPress开发实践,结合REST API、内部HTTP API及外部调用场景,提供5个可直接复用的代码片段。所有示例均经过PHP 8.1+和WordPress 6.5+环境验证,符合最新编码规范。
使用wp_remote_get获取外部JSON数据
当需要从第三方服务(如天气、汇率、社交媒体)获取数据时,wp_remote_get()
是最安全且兼容性最佳的选择。它封装了cURL、fsockopen等多种传输方式,自动处理SSL、超时和重试机制。
以下代码展示如何调用公开的JSON API并安全解析响应:
function fetch_external_api_data() {
$api_url = 'https://jsonplaceholder.typicode.com/posts/1';
$args = array(
'timeout' => 15,
'httpversion' => '1.1',
'user-agent' => 'WordPress/ExternalAPI-Client',
'headers' => array(
'Accept' => 'application/json'
),
);
$response = wp_remote_get($api_url, $args);
if (is_wp_error($response)) {
error_log('API请求失败: ' . $response->get_error_message());
return false;
}
$status_code = wp_remote_retrieve_response_code($response);
if ($status_code !== 200) {
error_log("API返回错误状态码: {$status_code}");
return false;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log('JSON解析失败: ' . json_last_error_msg());
return false;
}
return $data;
}
// 调用示例
$result = fetch_external_api_data();
if ($result) {
echo '标题: ' . esc_html($result['title']);
}
关键点:
- 使用
wp_remote_retrieve_response_code()
明确检查HTTP状态码 - 通过
json_decode($body, true)
将JSON转换为关联数组 - 始终使用
esc_html()
输出内容,防止XSS攻击
通过WordPress REST API获取本站文章列表
WordPress自4.7起内置REST API,可通过/wp-json/wp/v2/posts
端点获取文章数据。以下函数封装了分页获取最新10篇文章的逻辑:
function get_recent_posts_via_rest_api() {
$api_url = rest_url('wp/v2/posts');
$args = array(
'headers' => array(
'Content-Type' => 'application/json; charset=' . get_option('blog_charset')
),
'timeout' => 20,
'body' => array(
'per_page' => 10,
'orderby' => 'date',
'order' => 'desc',
'status' => 'publish'
)
);
$response = wp_remote_get($api_url, $args);
if (is_wp_error($response)) {
return new WP_Error('api_request_failed', $response->get_error_message());
}
if (wp_remote_retrieve_response_code($response) !== 200) {
return new WP_Error('api_invalid_response', 'API返回非200状态');
}
$body = wp_remote_retrieve_body($response);
$posts = json_decode($body, true);
if (json_last_error() !== JSON_ERROR_NONE) {
return new WP_Error('json_decode_failed', json_last_error_msg());
}
return array_map(function($post) {
return array(
'id' => $post['id'],
'title' => wp_strip_all_tags($post['title']['rendered']),
'link' => $post['link'],
'date' => mysql2date('Y-m-d H:i', $post['date_gmt'])
);
}, $posts);
}
// 前端调用
$recent_posts = get_recent_posts_via_rest_api();
if (!is_wp_error($recent_posts)) {
foreach ($recent_posts as $post) {
printf('<li><a href="%s">%s</a> (%s)</li>',
esc_url($post['link']),
esc_html($post['title']),
esc_html($post['date'])
);
}
}
注意:rest_url()
函数会自动处理站点URL变更,比硬编码更可靠。
使用JWT进行REST API身份验证并创建文章
对于需要写操作(如创建文章)的场景,必须进行身份验证。JWT(JSON Web Token)是目前最主流的无状态认证方式。
首先确保已安装并配置 JWT Authentication for WP REST API 插件。以下是使用PHP发送认证请求并创建文章的完整流程:
function create_post_with_jwt($site_url, $username, $password, $post_data) {
// 第一步:获取JWT Token
$token_url = $site_url . '/wp-json/jwt-auth/v1/token';
$token_response = wp_remote_post($token_url, array(
'body' => array(
'username' => $username,
'password' => $password
)
));
if (is_wp_error($token_response)) {
return $token_response;
}
$token_body = json_decode(wp_remote_retrieve_body($token_response), true);
if (empty($token_body['token'])) {
return new WP_Error('auth_failed', '无法获取JWT Token');
}
$jwt_token = $token_body['token'];
// 第二步:使用Token创建文章
$post_url = $site_url . '/wp-json/wp/v2/posts';
$post_response = wp_remote_post($post_url, array(
'headers' => array(
'Authorization' => 'Bearer ' . $jwt_token,
'Content-Type' => 'application/json'
),
'body' => json_encode($post_data)
));
if (is_wp_error($post_response)) {
return $post_response;
}
$status = wp_remote_retrieve_response_code($post_response);
if ($status !== 201) {
return new WP_Error('post_failed', '文章创建失败,状态码:' . $status);
}
return json_decode(wp_remote_retrieve_body($post_response), true);
}
// 使用示例(假设在外部PHP脚本中)
/
$credentials = array(
'site_url' => 'https://your-site.com',
'username' => 'admin_user',
'password' => 'secure_password_123'
);
$post_content = array(
'title' => '通过API创建的文章',
'content' => '这是由外部脚本通过JWT认证创建的内容。',
'status' => 'publish'
);
$result = create_post_with_jwt(
$credentials['site_url'],
$credentials['username'],
$credentials['password'],
$post_content
);
if (!is_wp_error($result)) {
echo "文章创建成功,ID: " . $result['id'];
}
/
在主题模板中调用自定义REST API端点
你可以注册自定义API端点,用于输出特定数据结构。以下示例创建一个返回最新5个页面标题和链接的端点:
function register_custom_api_endpoint() {
register_rest_route('myplugin/v1', '/latest-pages', array(
'methods' => 'GET',
'callback' => 'get_latest_pages_callback',
'permission_callback' => '__return_true'
));
}
add_action('rest_api_init', 'register_custom_api_endpoint');
function get_latest_pages_callback($request) {
$pages = get_posts(array(
'post_type' => 'page',
'post_status' => 'publish',
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC'
));
$data = array();
foreach ($pages as $page) {
$data[] = array(
'id' => $page->ID,
'title' => wp_strip_all_tags($page->post_title),
'link' => get_permalink($page->ID),
'date' => $page->post_date
);
}
return new WP_REST_Response($data, 200);
}
该端点可通过 /wp-json/myplugin/v1/latest-pages
访问,返回标准JSON响应。
使用fetch API从JavaScript调用WordPress REST API
在现代前端开发中,常需在浏览器中直接调用REST API。以下为安全调用当前站点API的JavaScript示例:
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
const apiEndpoint = '/wp-json/wp/v2/posts?per_page=5';
fetch(apiEndpoint)
.then(response => {
if (!response.ok) {
throw new Error('网络响应失败');
}
return response.json();
})
.then(data => {
const container = document.getElementById('posts-list');
data.forEach(post => {
const item = document.createElement('div');
item.innerHTML = `
<h3><a href="${post.link}" target="_blank">${post.title.rendered}</a></h3>
<p>发布于 ${new Date(post.date).toLocaleDateString()}</p>
`;
container.appendChild(item);
});
})
.catch(error => {
console.error('API调用失败:', error);
document.getElementById('posts-list').innerHTML = '<p>加载文章失败,请稍后重试。</p>';
});
});
</script>
确保在模板中添加此脚本,并创建ID为posts-list
的容器元素。
常见问题
Q: 调用外部API时出现cURL错误怎么办?
A: 首先检查服务器是否启用cURL扩展,其次确认目标域名DNS解析正常。可尝试更换http
为https
或调整timeout
参数。
Q: REST API返回401或403错误?
A: 检查是否启用了安全插件(如Wordfence)阻止了API访问。对于写操作,确保已正确配置JWT或应用密码,并使用HTTPS传输凭证。
Q: 如何提高API调用性能?
A: 对频繁调用的数据使用set_transient()
缓存结果,设置合理过期时间(如5-15分钟),减少重复请求。
Q: 可以限制REST API的访问频率吗?
A: WordPress核心不直接支持限流,但可通过Nginx配置limit_req
模块,或使用插件如"WP REST API Rate Limit"实现。
💡 小贴士:如果你也想搭建属于自己的网站并用Linkreate AI插件自动生成内容,建议搭配一台稳定服务器,部署更顺畅。新用户可享超值优惠:
【新用户专享】腾讯云轻量应用服务器 2核2G4M 3年仅368元,海外服务器 2核2G 20M 仅288元/年 性价比高,适合快速搭建网站、博客、小程序等,开箱即用