XML-RPC 是 WordPress 从早期版本就开始支持的一项远程调用协议,它允许外部应用通过 HTTP 请求远程操作 WordPress 网站,比如发布文章、编辑页面、管理评论、上传媒体等。在 REST API 出现之前,XML-RPC 是 WordPress 唯一的标准远程接口,至今仍然被许多移动端应用(如 WordPress 官方 APP)、第三方客户端(如 MarsEdit、Windows Live Writer)以及一些自动化工具广泛使用。

XML-RPC 的入口文件是 /xmlrpc.php。所有请求都发送到这个文件,通过 POST 方式提交 XML 格式的数据。请求体包含调用的方法名和参数列表,服务器执行后返回 XML 格式的响应。虽然 XML 格式在现代开发中不如 JSON 流行,但 XML-RPC 的协议非常稳定,已经被大量应用验证过。

XML-RPC 最常用的功能是发布文章。通过 metaWeblog.newPost 方法,你可以从外部客户端创建新文章,设置标题、内容、分类、标签、发布时间、自定义字段等。对于需要批量导入内容或者从其他 CMS 迁移数据的场景,XML-RPC 是一个高效的通道。wp.getPosts 方法可以获取文章列表,wp.editPost 更新文章,wp.deletePost 删除文章。

评论管理同样支持远程操作。wp.getComments 获取评论列表,wp.editComment 审核或编辑评论,wp.deleteComment 删除评论。这些功能对于搭建第三方评论管理工具或者将评论同步到其他平台非常有用。

媒体管理方面,metaWeblog.newMediaObject 方法允许远程上传图片或附件,返回媒体文件的 URL 和 ID。这个功能是移动端 APP 发布带图文章的核心接口。

XML-RPC 的认证方式基于用户名和密码,每次请求都要在参数中传递。这种方式虽然简单,但也意味着密码会在每次请求中传输,因此强烈建议使用 HTTPS 加密连接。如果你的网站没有启用 SSL,建议先安装证书再启用 XML-RPC 功能。

安全性是 XML-RPC 的一大关注点。由于它是一个公开入口,经常成为暴力破解攻击的目标。攻击者会尝试大量用户名和密码组合,试图破解管理员账户。WordPress 默认开启了 XML-RPC,如果你不需要这个功能,建议在 functions.php 中禁用它:

add_filter('xmlrpc_enabled', '__return_false');

如果你需要 XML-RPC 但担心安全,可以使用插件限制访问 IP 白名单,或者禁用 system.multicall 方法(该方法允许在一个请求中批量执行多个调用,被攻击者利用时会放大攻击效果):

add_filter('xmlrpc_methods', 'disable_multicall');
function disable_multicall($methods) {
    unset($methods['system.multicall']);
    return $methods;
}

对于使用 XML-RPC 的开发者来说,调试可能比较麻烦,因为错误信息通常以 XML 格式返回。建议使用 Postman 或 curl 发送测试请求,并查看完整的响应内容。如果你在代码中集成 XML-RPC,PHP 的 IXR_Client 类提供了便捷的调用方法:

require_once(ABSPATH . WPINC . '/class-IXR.php');
$client = new IXR_Client('https://你的网站.com/xmlrpc.php');
$client->query('wp.getUsersBlogs', '用户名', '密码');
$blogs = $client->getResponse();

这段代码可以获取用户拥有的站点列表,在多站点网络中特别有用。

XML-RPC 和 REST API 的定位有所不同。REST API 更适合现代前后端分离开发,返回 JSON 格式便于 JavaScript 处理。XML-RPC 则更侧重于传统的远程客户端应用,协议更成熟稳定。如果你的需求只是移动端 APP 发文章,XML-RPC 完全够用。如果是在构建复杂的单页应用,REST API 是更好的选择。

最后,如果你确实需要 XML-RPC 但又担心安全,可以考虑使用 Application Passwords 插件(WordPress 5.6 及以上核心已包含此功能)。它允许为每个应用生成独立的 API 密码,而不是使用用户的登录密码,即使某个应用密码泄露也不会影响主账号的安全。