WordPress API调用示例代码:5种真实场景的完整实现方案

在构建现代WordPress应用时,API调用已成为连接前后端、集成第三方服务和实现数据自动化的核心手段。无论是从外部系统拉取内容,还是将WordPress作为内容中台对外提供数据,掌握真实可用的API调用示例代码,是每个开发者必须具备的能力。

本文将基于当前WordPress开发实践,结合REST API、内部HTTP API及外部调用场景,提供5个可直接复用的代码片段。所有示例均经过PHP 8.1+和WordPress 6.5+环境验证,符合最新编码规范。

WordPress API调用示例代码: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解析正常。可尝试更换httphttps或调整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"实现。