WordPress REST API este interfața programatică care permite aplicațiilor externe să interacționeze cu conținutul WordPress prin cereri HTTP standard. Prin REST API puteți crea, citi, actualiza și șterge articole, pagini, comentarii, utilizatori și alte tipuri de conținut fără a accesa panoul admin WordPress. Aceasta deschide posibilități avansate: aplicații mobile care consumă conținut WordPress, integrări cu servicii externe, automatizări de publicare și arhitecturi headless în care WordPress servește exclusiv ca backend de conținut.
REST API a fost integrat în WordPress core începând cu versiunea 4.7 și a devenit fundația pentru editorul de blocuri Gutenberg și pentru Full Site Editing. Înțelegerea modului în care funcționează REST API este valoroasă atât pentru dezvoltatori care construiesc aplicații personalizate, cât și pentru administratori care doresc să automatizeze operațiunile de gestionare a conținutului. Indiferent că lucrați cu Python, JavaScript, PHP sau orice alt limbaj care poate face cereri HTTP, API-ul vă oferă acces complet la datele WordPress.
În acest ghid veți descoperi cum funcționează WordPress REST API în detaliu, cum să accesați și să manipulați datele, cum să securizați accesul, cum să creați integrări cu servicii terțe și exemple practice de automatizare pentru sarcinile comune de administrare WordPress. Vom acoperi atât utilizarea din linia de comandă cu curl, cât și din Python și JavaScript.
Cum utilizați WordPress REST API pentru automatizare și integrări
WordPress REST API funcționează pe principiul endpoint-urilor – URL-uri specifice care acceptă cereri HTTP (GET, POST, PUT, PATCH, DELETE) și returnează date în format JSON. Fiecare tip de conținut WordPress are propriile endpoint-uri cu operațiuni CRUD complete. Răspunsurile JSON sunt standardizate și bine documentate, ceea ce face integrarea cu orice platformă sau limbaj de programare simplă și previzibilă.
Structura API-ului și endpoint-urile disponibile
URL-ul de bază
Toate endpoint-urile REST API sunt accesibile la adresa de bază a website-ului dvs., urmată de prefixul standard:
https://domeniul-dvs.ro/wp-json/wp/v2/Accesarea acestui URL în browser returnează un JSON cu toate endpoint-urile disponibile, metodele HTTP acceptate și structura datelor pentru fiecare resursă. Acesta este punctul de plecare pentru orice explorare a API-ului.
Endpoint-uri principale
WordPress expune implicit următoarele resurse prin REST API:
- /wp/v2/posts – articole de blog (creare, citire, actualizare, ștergere)
- /wp/v2/pages – pagini statice
- /wp/v2/categories – categorii pentru articole
- /wp/v2/tags – etichete pentru articole
- /wp/v2/media – fișiere media (imagini, documente, video)
- /wp/v2/users – utilizatori înregistrați (necesită autentificare)
- /wp/v2/comments – comentarii la articole și pagini
- /wp/v2/search – căutare globală în conținut
- /wp/v2/types – tipuri de conținut înregistrate
- /wp/v2/taxonomies – taxonomii disponibile
Pluginurile WordPress pot înregistra propriile endpoint-uri în același namespace sau în namespace-uri personalizate. De exemplu, WooCommerce expune /wc/v3/products, /wc/v3/orders etc.
Un exemplu de răspuns JSON
Iată cum arată răspunsul pentru un articol individual returnat de API:
{
"id": 123,
"date": "2026-03-01T10:00:00",
"slug": "titlul-articolului",
"status": "publish",
"title": {
"rendered": "Titlul articolului"
},
"content": {
"rendered": "Conținutul articolului.
",
"protected": false
},
"excerpt": {
"rendered": "Rezumatul articolului.
"
},
"author": 1,
"featured_media": 456,
"categories": [5, 12],
"tags": [30, 45],
"link": "https://domeniu.ro/titlul-articolului/"
}Citirea datelor prin cereri GET
Listarea și filtrarea articolelor
Cererile GET nu necesită autentificare pentru conținutul public și pot fi filtrate printr-o gamă extinsă de parametri:
# Primele 10 articole (implicit)
GET /wp-json/wp/v2/posts
# 20 de articole din categoria cu ID 5
GET /wp-json/wp/v2/posts?categories=5&per_page=20
# Articolele publicate după 1 ianuarie 2026
GET /wp-json/wp/v2/posts?after=2026-01-01T00:00:00
# Căutare în articole după cuvânt cheie
GET /wp-json/wp/v2/posts?search=wordpress+securitate
# Articol specific după ID
GET /wp-json/wp/v2/posts/123
# Articol după slug (util când cunoașteți URL-ul)
GET /wp-json/wp/v2/posts?slug=titlul-articolului
# Sortare după dată descrescător, câmpuri specifice
GET /wp-json/wp/v2/posts?orderby=date&order=desc&_fields=id,title,slug,dateParametri de filtrare și paginare
REST API WordPress suportă o serie de parametri standardizați pentru toate endpoint-urile de tip colecție:
- per_page – numărul de rezultate returnate (1-100, implicit 10)
- page – pagina curentă pentru paginare (răspunsul include header-ul
X-WP-TotalPages) - search – termen de căutare în titlu și conținut
- categories – filtrare după ID categorie (mai multe ID-uri separate prin virgulă)
- tags – filtrare după ID etichetă
- orderby – sortare după: date, title, id, modified, slug, relevance
- order – direcție de sortare: asc sau desc
- status – statusul articolului (publish, draft, pending, future) – necesită autentificare pentru draft/pending
- _fields – returnează doar câmpurile specificate (reduce dimensiunea răspunsului)
- _embed – include datele relaționate (autor, imagini, categorii) în același răspuns
Autentificarea în REST API
Operațiunile de citire a conținutului public nu necesită autentificare. Crearea, editarea și ștergerea conținutului necesită autentificare. WordPress suportă mai multe metode de autentificare, fiecare potrivită pentru scenarii diferite.
Application Passwords (recomandat)
Cea mai simplă și mai sigură metodă de autentificare pentru scripturi și aplicații externe, disponibilă nativ din WordPress 5.6:
- Din panoul admin WordPress, navigați la Users – Profile (sau Utilizatori – Profil)
- Derulați până la secțiunea Application Passwords
- Introduceți un nume descriptiv pentru aplicație (ex: „Script automatizare”)
- Apăsați Add New Application Password și copiați parola generată (este afișată o singură dată)
- Folosiți-o cu autentificarea HTTP Basic în toate cererile API
# Cu curl
curl -u "username:xxxx xxxx xxxx xxxx"
https://domeniul-dvs.ro/wp-json/wp/v2/posts
# Cu Python folosind biblioteca requests
import requests
auth = ('username', 'xxxx xxxx xxxx xxxx')
r = requests.get('https://domeniu.ro/wp-json/wp/v2/posts', auth=auth)
print(r.json())
# Cu JavaScript (Node.js)
const response = await fetch('https://domeniu.ro/wp-json/wp/v2/posts', {
headers: {
'Authorization': 'Basic ' + Buffer.from('username:xxxx xxxx xxxx xxxx').toString('base64')
}
});JWT Authentication (pentru aplicații avansate)
Pentru aplicații care necesită autentificare fără a transmite credențialele la fiecare cerere, puteți folosi un plugin JWT (JSON Web Token). Fluxul este: obțineți un token prin login, apoi includeți token-ul în header-ul Authorization: Bearer TOKEN la fiecare cerere. Token-urile au un termen de expirare configurabil, ceea ce le face mai sigure pentru aplicații cu utilizatori multipli.
Crearea conținutului prin cereri POST
Crearea unui articol nou
Pentru a crea un articol, trimiteți o cerere POST la endpoint-ul /wp/v2/posts cu datele articolului în format JSON:
# Cu curl
curl -X POST
-u "username:app-password"
-H "Content-Type: application/json"
-d '{
"title": "Titlul articolului",
"content": "Conținutul articolului.
",
"status": "draft",
"categories": [1, 5],
"tags": [10, 15],
"slug": "titlul-articolului"
}'
https://domeniu.ro/wp-json/wp/v2/postsCrearea unui articol cu Python
Iată un script Python complet pentru crearea unui articol, cu gestionarea erorilor:
import requests
api_url = 'https://domeniu.ro/wp-json/wp/v2/posts'
auth = ('username', 'xxxx xxxx xxxx xxxx')
post_data = {
'title': 'Titlul articolului',
'content': 'Conținutul articolului în HTML.
',
'excerpt': 'Rezumatul scurt al articolului.',
'status': 'draft',
'categories': [1],
'tags': [10],
'slug': 'titlul-articolului',
'meta': {
'_yoast_wpseo_metadesc': 'Meta descriere pentru SEO.'
}
}
response = requests.post(api_url, json=post_data, auth=auth)
if response.status_code == 201:
post = response.json()
print(f"Articol creat cu succes: ID={post['id']}, URL={post['link']}")
else:
print(f"Eroare {response.status_code}: {response.text}")Actualizarea conținutului (PUT și PATCH)
Pentru actualizarea unui articol existent folosiți PUT (înlocuiește complet) sau PATCH (actualizează doar câmpurile specificate). PATCH este recomandat pentru actualizări parțiale deoarece trimite mai puține date:
# Actualizarea titlului și statusului unui articol (PATCH - parțial)
curl -X PATCH
-u "username:app-password"
-H "Content-Type: application/json"
-d '{"title": "Titlu actualizat", "status": "publish"}'
https://domeniu.ro/wp-json/wp/v2/posts/123
# Python - actualizare parțială
response = requests.patch(
f'{api_url}/123',
json={'status': 'publish', 'title': 'Titlu nou'},
auth=auth
)
if response.status_code == 200:
print("Articol actualizat cu succes.")Gestionarea imaginilor prin Media API
Încărcarea imaginilor se face în două etape: mai întâi încărcați fișierul media, apoi asociați ID-ul media cu articolul ca imagine reprezentativă sau în conținut:
import requests
media_url = 'https://domeniu.ro/wp-json/wp/v2/media'
auth = ('username', 'xxxx xxxx xxxx xxxx')
# Etapa 1: Încărcarea imaginii
with open('imagine.jpg', 'rb') as img:
headers = {
'Content-Disposition': 'attachment; filename=imagine-descriptiva.jpg',
'Content-Type': 'image/jpeg'
}
response = requests.post(media_url, headers=headers, data=img, auth=auth)
media = response.json()
media_id = media['id']
print(f"Imagine încărcată: ID={media_id}, URL={media['source_url']}")
# Etapa 2: Setarea ca imagine reprezentativă pe un articol
requests.patch(
f'https://domeniu.ro/wp-json/wp/v2/posts/123',
json={'featured_media': media_id},
auth=auth
)Exemple practice de automatizare
Publicarea articolelor programate în viitor
from datetime import datetime, timedelta
# Programare pentru mâine la ora 10:00
data_publicare = (datetime.now() + timedelta(days=1)).replace(hour=10, minute=0, second=0)
post_data = {
'title': 'Articol programat automat',
'content': 'Conținut publicat automat.
',
'status': 'future',
'date': data_publicare.strftime('%Y-%m-%dT%H:%M:%S')
}
response = requests.post(api_url, json=post_data, auth=auth)
print(f"Articol programat pentru: {data_publicare}")Export complet al conținutului WordPress
import json, requests
api_url = 'https://domeniu.ro/wp-json/wp/v2/posts'
auth = ('username', 'xxxx xxxx xxxx xxxx')
all_posts = []
page = 1
while True:
response = requests.get(
f'{api_url}?per_page=100&page={page}&status=publish',
auth=auth
)
posts = response.json()
if not posts or response.status_code != 200:
break
all_posts.extend(posts)
total_pages = int(response.headers.get('X-WP-TotalPages', 1))
print(f"Pagina {page}/{total_pages} procesată ({len(posts)} articole)")
if page >= total_pages:
break
page += 1
with open('export-wordpress.json', 'w', encoding='utf-8') as f:
json.dump(all_posts, f, ensure_ascii=False, indent=2)
print(f"Export finalizat: {len(all_posts)} articole salvate.")Integrarea cu servicii externe
REST API WordPress facilitează integrarea bidirecțională cu servicii terțe. Câteva scenarii practice frecvente:
- Publicare automată din Google Sheets: un script citește rânduri dintr-un spreadsheet și creează articole draft în WordPress prin API
- Sincronizare cu CRM: la crearea unui formular în WordPress, datele sunt trimise automat în CRM prin webhook + REST API
- Headless WordPress: un frontend Next.js sau Nuxt.js consumă conținutul WordPress prin REST API și îl afișează cu un design personalizat
- Notificări automate: un cron job verifică periodic articolele publicate și trimite notificări prin email sau Slack
- Import din surse externe: un script importă automat știri sau produse dintr-un feed extern în WordPress
Înregistrarea endpoint-urilor personalizate
Puteți extinde REST API WordPress cu endpoint-uri proprii folosind funcția register_rest_route() în tema sau pluginul dvs.:
'GET',
'callback' => 'get_date_custom',
'permission_callback' => '__return_true', // public
]);
});
function get_date_custom(WP_REST_Request $request) {
$data = [
'mesaj' => 'Endpoint personalizat funcționează!',
'versiune' => '1.0',
'data' => current_time('Y-m-d'),
];
return new WP_REST_Response($data, 200);
}
?>Endpoint-ul personalizat va fi accesibil la /wp-json/myplugin/v1/date-custom. Puteți adăuga validare a parametrilor, autentificare și orice logică de business necesară. Pentru endpoint-uri care primesc date, adăugați validarea prin args în array-ul de configurare al rutei.
Depanarea problemelor frecvente cu REST API
La implementarea integrărilor prin REST API puteți întâlni câteva probleme tipice. Iată cum le rezolvați:
- Eroare 401 Unauthorized – autentificarea a eșuat. Verificați că username-ul și parola aplicației sunt corecte și că contul are permisiunile necesare pentru operațiunea solicitată
- Eroare 403 Forbidden – autentificat dar fără permisiuni. Verificați că utilizatorul are rolul corespunzător (Editor sau Administrator pentru crearea articolelor)
- Eroare 404 Not Found – endpoint-ul nu există sau ID-ul resursei este incorect. Verificați URL-ul și că permalink-urile sunt configurate corect în Settings – Permalinks
- REST API dezactivat – unele pluginuri de securitate dezactivează REST API sau îl restricționează. Verificați setările pluginului de securitate activ
- CORS errors în browser – la apelarea API-ului din JavaScript în browser poate apărea eroarea CORS. Adăugați headerele CORS corespunzătoare în WordPress sau folosiți un proxy server-side
- Răspuns gol sau incomplet – folosiți parametrul
_fieldsgreșit sau există un conflict cu un plugin care modifică răspunsurile API
Pentru depanarea detaliată, activați modul debug în wp-config.php (define('WP_DEBUG', true);) și verificați fișierul debug.log pentru erori PHP care pot afecta răspunsurile API.
Securizarea REST API WordPress
Securitatea accesului prin REST API este critică, mai ales când permiteți operațiuni de scriere din aplicații externe:
- Folosiți HTTPS pentru toate cererile API – un certificat SSL activ este obligatoriu
- Generați Application Passwords separate per aplicație pentru revocare ușoară în caz de compromis
- Regenerați parolele periodic sau la schimbarea personalului cu acces
- Restricționați accesul REST API pentru utilizatorii neautentificați dacă nu aveți conținut public de expus
- Implementați rate limiting la nivel de server (Nginx, Apache sau Cloudflare) pentru a preveni abuzul
- Monitorizați jurnalele de acces pentru cereri API neobișnuite sau volume anormale
- Restricționați endpoint-urile sensibile (users, media upload) la IP-uri de încredere dacă este posibil
- Folosiți parametrul
permission_callbackîn endpoint-urile personalizate pentru verificarea permisiunilor
WordPress REST API transformă WordPress dintr-un simplu CMS într-o platformă de conținut versatilă și programabilă. Fie că automatizați publicarea, integrați cu servicii externe, construiți aplicații mobile sau arhitecturi headless, API-ul oferă acces complet și standardizat la toate datele WordPress. Stăpânirea endpoint-urilor, a metodelor de autentificare, a operațiunilor CRUD și a tehnicilor de securizare vă permite să construiți fluxuri de lucru eficiente care economisesc timp considerabil și reduc erorile umane în gestionarea conținutului la scară.


Comments (0)