Загрузить WP API загрузки загрузить
Я пытаюсь загрузить изображение через Wordpress REST api v2. Пока все, что мне удалось, это создать пустые записи в медиатеке WordPress. Это означает, что у них есть имена изображений, но нет реального изображения.
POST запрос:
http://localhost/wordpress/wp-json/wp/v2/media
Authorization: Basic d29yZHByZXNzOndvcmRwcmVzcw==
Content-Type: application/json
Content-Disposition: attachment;filename=map2.jpg
{
"source_url" : "file:///C:/Users/x/Desktop/map2.jpg"
}
Отклик:
{
"id": 127,
"date": "2016-05-25T08:43:30",
"date_gmt": "2016-05-25T08:43:30",
"guid": {
"rendered": "http://localhost/wordpress/wp-content/uploads/2016/05/map2-3.jpg",
"raw": "http://localhost/wordpress/wp-content/uploads/2016/05/map2-3.jpg"
},
"modified": "2016-05-25T08:43:30",
"modified_gmt": "2016-05-25T08:43:30",
"password": "",
"slug": "map2-3",
"status": "inherit",
"type": "attachment",
"link": "http://localhost/wordpress/map2-3/",
"title": {
"raw": "map2-3",
"rendered": "map2-3"
},
"author": 1,
"comment_status": "open",
"ping_status": "closed",
"alt_text": "",
"caption": "",
"description": "",
"media_type": "image",
"mime_type": "image/jpeg",
"media_details": {},
"post": null,
"source_url": "http://localhost/wordpress/wp-content/uploads/2016/05/map2-3.jpg",
"_links": {
"self": [
{
"href": "http://localhost/wordpress/wp-json/wp/v2/media/127"
}
],
"collection": [
{
"href": "http://localhost/wordpress/wp-json/wp/v2/media"
}
],
"about": [
{
"href": "http://localhost/wordpress/wp-json/wp/v2/types/attachment"
}
],
"author": [
{
"embeddable": true,
"href": "http://localhost/wordpress/wp-json/wp/v2/users/1"
}
],
"replies": [
{
"embeddable": true,
"href": "http://localhost/wordpress/wp-json/wp/v2/comments?post=127"
}
]
}
}
Я не получаю ошибок, все, кажется, работает, за исключением response-> post и response-> media_details, либо null, либо пусто. Конечно, само изображение не загружается.
Основываясь на этом билете GitHub WP-API Adding Media, я должен отправить 2 запроса. Первый запрос POST
должен вернуть данные с пост-объектом. Я бы отправил этот объект сообщения через метод PUT
, и изображение должно быть загружено..., так как у меня нет объекта сообщения, это невозможно.
Есть идеи, что я делаю не так?
Ответы
Ответ 1
Изображения с боковой загрузкой не поддерживаются wordpress api, поэтому вам нужно будет внести некоторые изменения.
Во-первых, content-type должен быть image/jpeg, а не application/json, помните, что тип содержимого должен отражать данные, которые вы передаете, и запрос СМИ POST ожидает изображение.
Еще одно изменение, которое вы должны внести, чтобы разместить контент-тип, - это способ передачи данных. Вместо отправки его с помощью параметра source_url попробуйте передать его как двоичный файл.
Последнее, что я хотел бы упомянуть, это то, что вызовы wp/v2 возвращают статус 3XX несколько раз. Было бы полезно следовать этим перенаправлениям и повторять эти запросы к этим новым URL-адресам.
У меня были некоторые проблемы с передачей изображений JPEG, но изображения PNG хорошо работали. Вот пример скручивания, который я использую для загрузки png-медиа:
curl --request POST \
--url http://www.yoursite.com/wp-json/wp/v2/media \
--header "cache-control: no-cache" \
--header "content-disposition: attachment; filename=tmp" \
--header "authorization: Basic d29yZHByZXNzOndvcmRwcmVzcw==" \
--header "content-type: image/png" \
--data-binary "@/home/web/tmp.png" \
--location
Ответ 2
Мой рабочий ответ с использованием PHP cUrl
<?php
$curl = curl_init();
$data = file_get_contents('C:\test.png');
curl_setopt_array($curl, array(
CURLOPT_URL => "http://woo.dev/wp-json/wp/v2/media",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => array(
"authorization: Basic XxxxxxxXxxxxXx=",
"cache-control: no-cache",
"content-disposition: attachment; filename=test.png",
"content-type: image/png",
),
CURLOPT_POSTFIELDS => $data,
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
Ответ 3
После попытки запустить загрузку изображений с помощью wp_remote_post (я не хочу использовать curl по нескольким причинам) я нашел следующее рабочее решение:
// Upload image to wordpress media library
$file = @fopen( 'image.jpg', 'r' );
$file_size = filesize( 'image.jpg' );
$file_data = fread( $file, $file_size );
$args = array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode( 'USERNAME:PASSWORD' ),
'accept' => 'application/json', // The API returns JSON
'content-type' => 'application/binary', // Set content type to binary
'Content-Disposition' => 'attachment; filename=nameoffileonserver.jpg'
),
'body' => $file_data
);
$api_response = wp_remote_post( 'http://myserver.com/wp-json/wp/v2/media', $args);