我需要您的帮助,通过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 OAuth2\\Client(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(OAuth2\\Client::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
)
有什么想法吗?非常感谢
最合适的回答,由SO网友:MikeNGarrett 整理而成
所以这很有趣。
请记住,WP-API仍在进行中。
创建媒体端点的目的首先,让我们后退一步。API假定此时您已将新文件上载到正确的目录。此终结点正在数据库中创建引用此文件的媒体内容。
解决方案是,您必须指定要与新内容关联的媒体文件的文件名。这不能是远程url。正如您从v2 documentation, source_url
和link
是只读的。要成功提交新内容,只需在标题中添加以下内容:
\'Content-Disposition\' => \'filename=name-of-file.jpg\',
如票证中所述,您不能添加引号或指定发送文件的方法。信息技术
must 采用上述格式。至少,在他们彻底改变之前,情况是这样的。
确保文件类型是accepted file types 您正在将文件的扩展名包含在请求中。幸亏Dr Deo 在评论中。
为了记录在案,当我最终弄明白这一点时,我欣喜若狂地笑了起来。。。把我妻子吓坏了。
SO网友:minhhq
PHP CURL的答案是:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => \'EndPoint\',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => \'\',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => \'POST\',
CURLOPT_POSTFIELDS => array(\'file\'=> new CURLFILE(\'LocalFilePathHere\')),
CURLOPT_HTTPHEADER => array(
\'Content-Disposition: attachment; filename=abc.jpg\',
\'Content-Type: image/jpeg\',
\'Authorization: XXX YYY\'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
如果您仍然面临问题”;抱歉,出于安全原因,不允许使用此文件类型“;,您必须添加到wp配置。php为管理员用户禁用Fiter
define(\'ALLOW_UNFILTERED_UPLOADS\', true);