问题描述

我需要您的帮助,通过 Wp-rest-api v2 和 Oauth2 认证在我的 wordpress 博客上上传媒体图像。

我没有在 REST API 文档中找到发送我的图像数据 (字段名称,发送模式…?) 的方式。

require('OAuth2/Client.php');
require('OAuth2/GrantType/IGrantType.php');
require('OAuth2/GrantType/AuthorizationCode.php');

const CLIENT_ID     = 'XXX';
const CLIENT_SECRET = 'XX';

const REDIRECT_URI           = 'http://127.0.0.1/test_api_wp/test.php';

const AUTHORIZATION_ENDPOINT = 'http://wordpress.local/oauth/authorize';
const TOKEN_ENDPOINT         = 'http://wordpress.local/oauth/token';

$client = new OAuth2Client(CLIENT_ID, CLIENT_SECRET);

if (!isset($_GET['code']))
{
    $auth_url = $client->getAuthenticationUrl(AUTHORIZATION_ENDPOINT, REDIRECT_URI);
    header('Location: ' . $auth_url);
    die('Redirect');
}
else
{
    $params = array('code' => $_GET['code'], 'redirect_uri' => REDIRECT_URI);
    $response = $client->getAccessToken(TOKEN_ENDPOINT, 'authorization_code', $params); //authorization_code
    $token = $response['result']['access_token'];
    $client->setAccessToken($token);
    $client->setAccessTokenType(OAuth2Client::ACCESS_TOKEN_BEARER);

}

$values = array(
    "date" => "2015-11-26 10:00:00",
    "date_gmt" => "2015-11-26 09:00:00",
    "modified" => "2015-11-26 10:00:00",
    "modified_gmt" => "2015-11-26 09:00:00",
    "status" => "future",
    "title" => "Titre media",
    "description" => "description media",
    "media_type" => "image",
    "source_url" => "https://www.base64-image.de/build/img/mr-base64-482fa1f767.png"
);

$data = $client->fetch("wordpress.local/wp-json/wp/v2/media", $values, "POST");
echo "<pre>";print_r($data);echo "</pre>";

响应 :

Array
(
    [result] => Array
        (
            [code] => rest_upload_no_data
            [message] => No data supplied
            [data] => Array
                (
                    [status] => 400
                )

        )

    [code] => 400
    [content_type] => application/json; charset=UTF-8
)

任何想法?非常感谢

最佳解决方案

所以!这个很有趣。

请记住,WP-API 还是非常非常非常 work-in-progress 。

Content-Disposition

我发现 an issue reported on the WP-API issue queue 关于 Content-Disposition 。这是发布新媒体内容所需的标题,而在以正确格式提供这些内容时,有一些非常非常严格的要求。

创建媒体端点的目的

首先,让我们退一步。该 API 假定您已经将新文件上传到正确的目录。此端点正在数据库中创建引用此文件的媒体内容。

解决方案

您必须指定要与新内容关联的媒体文件的文件名。这不能是远程 URL 。从 v2 documentation 可以看出,source_urllink 是 read-only 。所有您要做的成功提交您的新内容,请将以下内容添加到标题中:

'Content-Disposition' => 'filename=name-of-file.jpg',

如票中所述,您不能添加引号或指定您用于发送文件的方法。它必须是上面的格式。至少,直到他们改变它才是这种情况。

为了纪录,当我终于想到这一个出来的时候,我笑了起来,吓得我的妻子感到害怕。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。