Загрузить картинку
Положить картинку в медиатеку сайта по адресу или в base64 и использовать её на странице и как иконку сайта. Загрузку можно спокойно повторять.
POST /media кладёт файл в медиатеку ровно так, как это сделал бы сам WordPress: нарезаются все зарегистрированные размеры, рядом с каждым JPEG и PNG пишется копия в WebP, сохраняется alt, вложение получает язык. Один запрос — один файл; пакетной формы нет.
1. Загрузить по адресу
Проще всего отдать публичный адрес. Тип определяется по содержимому, а не по расширению: принимаются JPEG, PNG, WebP, GIF и SVG до 15 МБ.
curl -s -X POST -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
"$BASE/media" -d '{
"blog_id": 235,
"url": "https://example.onpress.pro/wp-content/uploads/sites/56/2026/07/pomelli-hub-t1.png",
"alt": "Pomelli hub",
"lang": "en"
}'
{
"success": true,
"blog_id": 235,
"id": 6349,
"url": "https://example.onpress.pro/wp-content/uploads/sites/235/2026/09/pomelli-hub-t1.png",
"path": "/wp-content/uploads/sites/235/2026/09/pomelli-hub-t1.png",
"mime": "image/png",
"width": 1376,
"height": 768,
"filesize": 188374,
"webp": "/wp-content/uploads/sites/235/2026/09/pomelli-hub-t1.webp",
"sizes": {
"medium": { "path": "/wp-content/uploads/sites/235/2026/09/pomelli-hub-t1-300x167.png", "width": 300, "height": 167, "mime": "image/png", "webp": "/wp-content/uploads/sites/235/2026/09/pomelli-hub-t1-300x167.webp" },
"…": "…"
},
"alt": "Pomelli hub",
"title": "pomelli-hub-t1",
"lang": "en",
"source_urls": ["https://example.onpress.pro/wp-content/uploads/sites/56/2026/07/pomelli-hub-t1.png"],
"sha256": "a115d5ec15baf3a4b44987f69eb8b538baabfd15e8982227f62367778845fba8",
"deduped": false
}
Сохраните id (для иконки сайта, картинки записи и всего, что принимает вложение) и path (для содержимого).
2. Или загрузить сами байты
Файл без публичного адреса отправляется в base64 в поле data (подойдёт и data: URI) вместе с filename — здесь оно обязательно, а расширение будет исправлено под настоящий тип.
curl -s -X POST -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
"$BASE/media" -d "$(jq -n --arg data "$(base64 < hero.png)" \
'{blog_id: 235, data: $data, filename: "hero.png", alt: "Hero", lang: "en"}')"
Ответ той же формы, что выше, только source_urls пустой. Тело запроса ограничено 10 МБ, а base64 раздувает файл на треть, поэтому файлы больше примерно 7 МБ отправляйте через url. url и data вместе — 400 source_ambiguous, data без filename — 400 filename_required.
3. Повторять без опаски
Каждое вложение помнит адреса, с которых его загружали, и SHA-256 своего содержимого. Тот же url находится повторно без скачивания; те же байты под другим адресом или в data находятся по хешу. В обоих случаях возвращается уже существующее вложение:
{
"success": true,
"blog_id": 235,
"id": 6349,
"path": "/wp-content/uploads/sites/235/2026/09/pomelli-hub-t1.png",
"…": "…",
"deduped": true,
"deduped_by": "source_url"
}
deduped_by — это source_url или sha256. Найденное вложение не меняется: alt, title и lang применяются только при создании. Поэтому скрипт, который заливает все картинки статьи, после сбоя можно просто запустить ещё раз.
4. Вставить на страницу
В markdown картинка — отдельная строка: alt в квадратных скобках, path как адрес и необязательная подпись в кавычках, которая становится figcaption.
---
name: "Pomelli hub"
slug: "pomelli-hub"
url: "/pomelli-hub/"
lang: "en"
frame: "article"
---
The hub collects every campaign in one place.

В содержимое идёт path, не url. url собран под домен, который обслужил загрузку: стендовая копия сети делит базу с продом, но пишет файлы на свой диск, поэтому абсолютный адрес в тексте указывает то на один хост, то на другой. path работает на любом домене, который отдаёт сайт.
5. Найти загруженное потом
GET /media?source_url=… находит вложение, загруженное с этого адреса, ?sha256= — по содержимому, а GET /media/{id} описывает любое вложение сайта, в том числе загруженное не через API: у таких source_urls пустой, а sha256 равен null.
curl -s -H "Authorization: Bearer $OP_TOKEN" "$BASE/media/6425?blog_id=235"
{
"success": true,
"blog_id": 235,
"id": 6425,
"url": "https://example.onpress.pro/wp-content/uploads/sites/235/2026/09/cropped-993838e9_1771708768.png",
"path": "/wp-content/uploads/sites/235/2026/09/cropped-993838e9_1771708768.png",
"mime": "image/png",
"width": 512,
"height": 512,
"filesize": 4043,
"webp": "/wp-content/uploads/sites/235/2026/09/cropped-993838e9_1771708768.webp",
"sizes": { "medium": { "…": "…" }, "thumbnail": { "…": "…" } },
"alt": "Pomelli",
"title": "site-icon",
"lang": "en",
"source_urls": ["https://example.onpress.pro/wp-content/uploads/sites/56/2026/02/cropped-993838e9_1771708768.png"],
"sha256": "07273749f6d7cfa42c4ae5113dafb344af5f883254cd1afb775883e5ccdfe6b5",
"deduped": false
}
Ничего не нашлось — 404 media_not_found.
6. Сделать иконкой сайта
Иконка сайта — это id вложения в настройках сайта. Загрузите квадратную картинку (WordPress ждёт 512×512) и передайте её id:
curl -s -X PATCH -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
"$BASE/site/settings" -d '{"blog_id": 235, "site_icon": 6425}'
{
"success": true,
"blog_id": 235,
"changed": ["site_icon"],
"settings": {
"blogname": "Pomelli",
"site_icon": 6425,
"site_icon_url": "https://example.onpress.pro/wp-content/uploads/sites/235/2026/09/cropped-993838e9_1771708768.png",
"…": "…"
},
"…": "…"
}
"site_icon": 0 убирает иконку. Запись, которая что-то поменяла, сбрасывает страничный кэш сайта.
Проверка
GET /media/{id} отвечает с тем же path, у JPEG и PNG webp не null, а повторный POST /media с тем же источником возвращает deduped: true и тот же id. На странице картинка показывается с подписью. GET /site/settings возвращает новый site_icon и site_icon_url.
См. также
- Медиа — все поля, правила для SVG и коды ошибок.
- Сайты и настройки —
PATCH /site/settings. - Синтаксис markdown — картинки и остальной синтаксис.