### [使用XML-RPC和PHP将图片上传到WordPress](https://www.prosaas.cn/article/4588) **Published:** 2023-09-03T09:45:24 **Author:** 5201314 **Excerpt:** 假设您熟悉 XML-RPC 协议及其工作原理,甚至在 WordPress 中也是如此,并且您以前使用过它。添加… ![](//zhiqipro.oss-cn-beijing.aliyuncs.com/2023/12/20231212123105320.jpg) 假设您熟悉 XML-RPC 协议及其工作原理,甚至在 WordPress 中也是如此,并且您以前使用过它。添加帖子、删除页面等。对于文本来说一切都很好,但是当您想将图片等文件发送到 WordPress 时会发生什么? 在本教程中,我们将介绍一种将图片发送到 WordPress 的非常简单的方法,以便它显示在管理面板的媒体部分中。我们将使用 PHP 发送这张图片,以便您可以将此代码用于 WordPress 插件、主题,甚至只是简单的 PHP,就像我们的示例中一样。 * * * ## 第 1 步计划 为了大致了解我们将要做什么以及如何做,我将以一个计划开始本教程。基本上,我们将制作一个 PHP 脚本,将文件(更准确地说是 jpeg 图像)上传到本地 WordPress 安装。 我们将使用一个 PHP 库来在 PHP 中创建 XML-RPC 客户端,我们将用它来连接到 WordPress XML-RPC 服务器并发送数据。该客户端是一个名为“The Incutio XML-RPC Library for PHP”的 PHP 库,可以在 script.incutio.com 上找到 > **请注意:**此示例仅用于本教程的演示目的,是一个非常基本且直接的示例 * * * ## 第2步准备环境 对于本教程,您首先需要的是 Apache 服务器上安装了 PHP 和 MySQL 的 WordPress 工作版本。您也可以在本地使用它,这是我推荐的,实际上也是我们将在本教程中使用的示例。 您需要的另一件事是我们在本教程中使用的 XML-RPC 库。该库是免费的,具有 BSD 许可证,可以在 scripts.incutio.com 上找到 该库实际上只是一个名为 **IXR\_Library.php** 的 PHP 文件,我们将在本教程中使用它。您需要做的下一件事是在本地服务器安装的 **htdocs**(或 Web 根)文件夹中创建一个目录,您将在其中复制 **IXR\_Library.php** 文件并还在其旁边创建一个 **index.php** 文件。 **index.php** 文件现在需要为空。 在WordPress安装中我们需要做的最重要的事情是激活XML-RPC服务。 WordPress 默认情况下禁用此功能,因此我们需要进入管理面板中的设置并激活它。为此,请转到**设置** -> **写作**,然后在**远程发布**标题下,您会发现 XML-RPC 旁边有一个复选框默认情况下取消选择它。选择它并单击“保存更改”。 现在,我们可以与 WordPress 内置的 XML-RPC 服务器进行通信。 * * * ## 第 3 步代码解释 有趣的部分来了,让我们开始吧!使用您最喜欢的代码编辑器打开前面提到的 **index.php** 文件。 ### 包括图书馆 我们需要做的第一件事是包含我们刚刚下载的库文件,以便我们以后可以使用它。因此,我们编辑 **index.php** 文件并添加以下代码(不要忘记以 PHP 标记开头,如示例中所示): 这基本上涵盖了我们的脚本工作所需的所有内容。简而言之,我们将使用刚刚包含的库的客户端部分。我们稍后会执行此操作。 ### 读取图像(Jpeg 文件) 因为我们需要将图像(jpg 文件)发送到 WordPress,所以我们需要以某种方式发送它。解决方案是以位格式发送它,就像您稍后将看到的那样,XML-RPC 服务器功能请求它。但是要像这样发送它,我们需要将其内容转换为位,并且为此我们需要获取其内容。该文件(任何 jpg 图片文件,我们将其命名为 test.jpg)将放置在 **index.php** 文件旁边(在同一目录中),在下一部分中,我们将读取其内容并将其存储在变量中以供以后使用。 $myFile = "test.jpg"; $fh = fopen($myFile, 'r'); $fs = filesize($myFile); $theData = fread($fh, $fs); fclose($fh); 上面的代码的作用是,首先,它创建一个名为 `$myfile` 的新变量,其中包含文件名的字符串值,因为它位于同一文件夹中,所以不需要卡住任何其他路径信息对于它,只是名称,在本例中为 **test.php**。 接下来我们需要打开该文件,因此我们使用 PHP 函数 `fopen` 来完成此操作,我们将其与上一个变量的第一个参数 `$myFile` 和第二个参数另一个字符串一起使用,该字符串表示我们要执行的操作将在文件上进行操作。 `r` 的字符串值表示_正在读取_。我们将打开文件的结果添加到变量 `$fh`。 然后,因为我们需要文件内容长度,所以我们将使用 PHP 函数 `$filesize` 返回的值创建变量 `$fs`,该函数使用参数 `$myFile` 最后,我们进入读取部分,我们将执行读取操作的函数返回的值赋予变量 `$theData`,即 `fread`。该函数使用两个参数,第一个是之前打开的文件变量(`$fh`),第二个是之前设置的文件大小(`$fs`)。 最后,我们使用函数 `fclose` 及其参数 `$fh` 关闭打开的文件。此时,我们已经有了 jpg 文件的内容,我们将把它发送到 WordPress 的 XML-RPC 服务器。 ### 创建 XML-RPC 客户端 在下一部分中,我们将使用刚刚导入的库连接到 WordPress 的安装 XML-RPC 服务器。为此,我们需要以下 3 个变量: - `$usr`(管理面板用户名),`$pwd`(管理面板密码)和 - `$xmlrpc`(XML-RPC 服务器路径)。请注意,XML-RPC 服务器路径由基本 WordPress 安装 URL + 斜杠后面的 **xmlprc.php** 文件组成。 $usr = 'admin'; $pwd = 'admin'; $xmlrpc = 'http://localhost/wordpress/xmlrpc.php'; $client = new IXR\_Client($xmlrpc); 接下来我们需要创建对服务器的调用。为此,我们将使用刚刚创建的 URL 字符串和从导入的库文件继承的 `IXR_Client` 类。此时,变量 **$client** 被声明为该链接的新客户端,并且所有操作都将使用它来完成。 下一部分是可选的,但如果您愿意,您可以像这样激活调试: $client->debug = true; 如果您激活它,您将可以更清楚地了解出现问题时发生的情况。 ### 将数据放置在适当的位置 在发送数据之前,我们必须正确组织和格式化数据,并且由于我们需要发送数据的方式,我们必须创建一个包含所有值的数组。我们将此数组命名为 **$params** 并为其指定以下值: $params = array('name' => 'test.jpg', 'type' => 'image/jpg', 'bits' => new IXR\_Base64($theData), 'overwrite' => false); 首先,我们需要为 **name** 的数组索引名称指定 **'test.jpg** 的值,因为这将是文件的名称。之后我们有索引名称 `type`,我们给出 **image/jpg** 的值。这是我们正在上传的文件类型。然后我们就有了名为 **bits** 的索引,它实际上是我们需要发送的文件。现在,WordPress XML-RPC API 要求以 64 位为基础发送该值。为了正确执行此操作,我们将使用变量 `$theData`,但我们需要通过类 `IXR_Base64` 运行它,以便将其相应地编码为 `base64` 位。为了将文件按请求成功发送到服务器,base64 编码的格式正确非常重要。 Base64 编码有多种,如果使用了不正确的编码,将不可避免地出现错误。上面示例中使用的 `IXR_Base64` 类按照服务器的要求转换文件的内容。最后,将索引类型 `overwrite` 设置为 false,将 false 属性赋予覆盖同名现有文件的选项。 ### 通过 XML-RPC 发送数据 要使该脚本正常工作,我们需要做的最后一件事是通过激活来自 `$client` 变量的请求将数据发送到 WordPress,如下所示: $res = $client->query('wp.uploadFile',1, $usr, $pwd, $params); `$res` 变量给出从 `$client` 变量内部调用的 `query` 函数的结果,该变量表示最初声明和启动的 XML-RPC 客户端实现。基本上我们正在向服务器发送请求。服务器将收到带有以下参数的请求: - `wp.uploadFile` - 我们调用并用于上传文件所需的服务函数 - `1` - 博客ID(每个WordPress博客都有一个ID,默认为1 - `$usr` - 先前声明的用户名变量。 - `$pwd` - 先前声明的密码变量。 - `$params` - 我们刚才讨论的参数数组。 ### 完整代码 以上所有代码放在一起看起来像这样: debug = true; $params = array('name' => 'test.jpg', 'type' => 'image/jpg', 'bits' => new IXR\_Base64($theData), 'overwrite' => false); $res = $client->query('wp.uploadFile',1, $usr, $pwd, $params); ?> * * * ## 结论 实现这样的客户端并不难,但是因为有时你要构建的代码是特定的,所以你需要知道你在做什么,这样才能达到预期的效果。 PHP 中针对 WordPress XML-RPC 上传文件服务器请求的 XML-RPC 客户端实现就是这样一个示例。如果您发送的数据格式不正确,则可能不会被接受。这个例子虽然只有几行代码,但是非常具体。相同的客户端可用于制作任何其他类型的 使用带有适当参数的不同 XML-RPC 请求函数向 WordPress 发出请求。 以上就是使用XML-RPC和PHP将图片上传到WordPress的详细内容,更多请关注知企PROSAAS其它相关文章! **Tags:** apache, fclose, fopen, for, mysql, php, rpc, WordPress, xml, 参数数组 **Categories:** WordPress ---