تعديل المقال
تعديل مسودات المقالات وترجماتها
PATCH/api/v1/addons/shopently.blog/posts/{post_id}
- المصادقة
Bearer- متاح بدءًا من
- BASIC
- الوحدة المثبتة المطلوبة
shopently.blog· إصدار عقد الوحدة 1- الصلاحيات المطلوبة
addon.shopently.blog:post_update
أمثلة الكود
مثال على الطلب
cURL
: "${SHOPENTLY_SHOP_URL:?}"
curl --disable --globoff --fail-with-body --silent --show-error \
--proto '=https' --connect-timeout 5 --max-time 30 \
--request PATCH \
--header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
--header 'Idempotency-Key: learn-6486f38921214552949f30311a1f543f' \
--header 'Content-Type: application/json' \
--data-raw '{
"excerpt": "Praktyczny poradnik: porównanie właściwości i wariantów.",
"expected_version": 1,
"locale": "pl"
}' \
--url "${SHOPENTLY_SHOP_URL%/}"/api/v1/addons/shopently.blog/posts/2103ba96-2713-420b-b197-8a008730c851
PHP
<?php
declare(strict_types=1);
$baseUrl = rtrim(getenv('SHOPENTLY_SHOP_URL') ?: '', '/');
$origin = parse_url($baseUrl);
if (!$origin || ($origin['scheme'] ?? '') !== 'https' || empty($origin['host']) ||
isset($origin['user'], $origin['pass']) || isset($origin['user']) || isset($origin['path']) ||
isset($origin['query']) || isset($origin['fragment'])) {
throw new RuntimeException('SHOPENTLY_SHOP_URL must be an HTTPS origin');
}
$credential = getenv('SHOPENTLY_ACCESS_TOKEN') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
throw new RuntimeException('Invalid credential');
}
$headers = ['Idempotency-Key: learn-6486f38921214552949f30311a1f543f', 'Content-Type: application/json'];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/addons/shopently.blog/posts/2103ba96-2713-420b-b197-8a008730c851');
curl_setopt_array($handle, [
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 30,
CURLOPT_HEADERFUNCTION => static function ($handle, string $line) use (&$responseHeaders): int {
if (str_contains($line, ':')) {
[$name, $value] = explode(':', $line, 2);
$responseHeaders[strtolower(trim($name))] = trim($value);
}
return strlen($line);
},
]);
curl_setopt($handle, CURLOPT_POSTFIELDS, '{
"excerpt": "Praktyczny poradnik: porównanie właściwości i wariantów.",
"expected_version": 1,
"locale": "pl"
}');
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false) {
throw new RuntimeException('Transport error: ' . $error);
}
if ($status < 200 || $status >= 300) {
throw new RuntimeException('HTTP ' . $status . '; request_id=' .
($responseHeaders['x-request-id'] ?? '') . '; retry_after=' . ($responseHeaders['retry-after'] ?? ''));
}
$result = $raw === '' ? null : json_decode($raw, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
echo json_encode($result, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), PHP_EOL;
Python
from contextlib import ExitStack
import json
import os
from urllib.parse import urlsplit
import requests # python -m pip install requests
base_url = os.environ["SHOPENTLY_SHOP_URL"].rstrip("/")
origin = urlsplit(base_url)
if origin.scheme != "https" or not origin.hostname or origin.username or origin.password or origin.path or origin.query or origin.fragment:
raise ValueError("SHOPENTLY_SHOP_URL must be an HTTPS origin")
credential = os.environ['SHOPENTLY_ACCESS_TOKEN']
if not credential or "\r" in credential or "\n" in credential:
raise ValueError("Invalid credential")
headers = {'Idempotency-Key': 'learn-6486f38921214552949f30311a1f543f'}
headers["Authorization"] = 'Bearer' + " " + credential
body = '{\n "excerpt": "Praktyczny poradnik: porównanie właściwości i wariantów.",\n "expected_version": 1,\n "locale": "pl"\n}'
if body is not None:
headers["Content-Type"] = "application/json"
with ExitStack() as stack:
session = stack.enter_context(requests.Session())
files = None
if False:
image = stack.enter_context(open(os.environ["SHOPENTLY_IMAGE_FILE"], "rb"))
if os.fstat(image.fileno()).st_size > 5242880:
raise ValueError("Image exceeds 5 MiB")
files = {"file": ("article.png", image, "image/png")}
response = session.request(
'PATCH', base_url + '/api/v1/addons/shopently.blog/posts/2103ba96-2713-420b-b197-8a008730c851', headers=headers,
data=body.encode("utf-8") if body is not None else None, files=files,
timeout=(5, 30), allow_redirects=False,
)
if not 200 <= response.status_code < 300:
raise RuntimeError(f"HTTP {response.status_code}; request_id={response.headers.get('X-Request-ID', '')}; retry_after={response.headers.get('Retry-After', '')}")
if False:
if response.headers.get("Content-Type") != "image/webp" or len(response.content) > 5242880:
raise ValueError("Unexpected image response")
with open(os.environ["SHOPENTLY_OUTPUT_FILE"], "xb") as output:
output.write(response.content)
else:
result = response.json() if response.content else None
print(json.dumps(result, ensure_ascii=False, indent=2))
مثال على الاستجابة 200
{
"data": {
"html_normalized": false,
"id": "2103ba96-2713-420b-b197-8a008730c851",
"public_number": null,
"revision_id": "5745799d-723b-4341-9f6e-1a63e50f1d40",
"status": "draft",
"version": 2
},
"meta": {
"request_id": "bd4bb9ba-0f29-41c0-858d-3581bb03928f"
}
}
نظرة عامة
أدر مدونة متجرك بمقالات HTML وصور وكتّاب وبيانات وصفية لمحركات البحث. احفظ المسودات وأعد الترجمات وانشر فورًا أو في موعد تحدده ضمن منطقة زمنية معينة. أدر التعليقات ومراجعتها من اللوحة، ويمكن لمولّد خارجي استخدام API بالصلاحيات التي تمنحها.
BASIC · api.enabled · addons.use(shopently.blog) · addon.shopently.blog:post_update
المعاملات
معلمات المسار
post_idسلسلة نصيةمطلوبالمقال
format:"uuid"
ترويسات الطلب
Idempotency-Keyسلسلة نصيةمطلوبمعرّف فريد لعملية كتابة منطقية واحدة.
minLength:1maxLength:128القيود
pattern"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
محتوى الطلب
application/json · مطلوب
author_idسلسلة نصية nullاختياريالكاتب
سلسلة نصية:format:"uuid"comments_modeسلسلة نصيةاختياريالتعليقات
القيود
enum["inherit", "open", "closed"]
content_htmlسلسلة نصيةاختياريالمحتوى
maxLength:50000cover_altسلسلة نصيةاختياريالنص البديل
maxLength:250cover_captionسلسلة نصيةاختياريوصف الصورة
maxLength:500cover_media_idسلسلة نصية nullاختياريصورة الغلاف
سلسلة نصية:format:"uuid"excerptسلسلة نصيةاختياريمقدمة
maxLength:1000expected_versionعدد صحيحمطلوبالإصدار المقروء قبل الكتابة؛ يؤدي عدم التطابق إلى رفض التحديث.
minimum:1maximum:9223372036854775807localeسلسلة نصيةمطلوباللغة المحددة لهذا الطلب.
minLength:2maxLength:35القيود
pattern"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
meta_descriptionسلسلة نصيةاختياريوصف محركات البحث باللغة المحددة.
maxLength:160meta_keywordsمصفوفة <سلسلة نصية> اختياريالكلمات المفتاحية لمحركات البحث باللغة المحددة.
maxItems:20مصفوفة:minLength:1maxLength:50meta_titleسلسلة نصيةاختياريعنوان محركات البحث باللغة المحددة.
maxLength:70slugسلسلة نصيةاختياريجزء مسار URL باللغة المحددة.
maxLength:160titleسلسلة نصيةاختياريالعنوان باللغة المحددة.
maxLength:200
الاستجابات
الاستجابة 200
dataكائنحقول إضافية: لامطلوبمحتوى الاستجابة الناجحة.
الحقول ·
datahtml_normalizedقيمة منطقيةمطلوبHTML · category-v1
idسلسلة نصيةمطلوبمعرّف المورد؛ احتفظ به كما أعيد.
format:"uuid"public_numberعدد صحيح nullاختياريالرقم
عدد صحيح:minimum:1revision_idسلسلة نصيةمطلوبالنسخة
format:"uuid"statusسلسلة نصيةمطلوبالحالة التي تقبلها هذه العملية تحديدًا.
القيود
enum["draft", "scheduled", "published", "archived"]
versionعدد صحيحمطلوبإصدار المورد المستخدم للتحكم في التعديلات المتزامنة.
minimum:1maximum:9223372036854775807
metaكائنحقول إضافية: لامطلوبالبيانات الوصفية للاستجابة.
الحقول ·
metarequest_idسلسلة نصيةمطلوبمعرّف الطلب؛ في البيانات الوصفية للاستجابة يحدد طلب HTTP.
minLength:1maxLength:100
حالة HTTP
200- استجابة ناجحة المخطط
400- طلب غير صالح
401- المصادقة مطلوبة
403- الإذن مرفوض
404- المورد غير موجود
409- تعارض الإصدارات
422- فشل التحقق من البيانات
429- تم تجاوز حد الطلبات
حالات HTTP الأخرى (7)
405- الطريقة غير مسموحة
413- الطلب كبير جدًا
415- تنسيق غير مدعوم
500- خطأ في الخادم
502- خطأ في بوابة API
503- الخدمة غير متاحة
504- انتهت مهلة الانتظار
دليل الأخطاء: ErrorResponse
الترويسات
401
WWW-Authenticateسلسلة نصيةاختيارينظام المصادقة الذي يطلبه الخادم.
405
Allowسلسلة نصيةاختياريطرق HTTP التي يدعمها هذا المورد.
429, 503
Retry-Afterعدد صحيحاختياريالحد الأدنى للانتظار قبل إعادة المحاولة، بالثواني.
minimum:0