add_filter('rest_prepare_manuale_tehnice', function($response, $post, $request) {
$data = $response->get_data();
$custom_fields = get_fields($post->ID);
// Păstrăm doar datele esențiale pentru frontend
$filtered_data = [
'id' => $data['id'],
'title' => $data['title']['rendered'],
'slug' => $data['slug'],
'pdf_url' => $custom_fields['fisier_pdf'] ?? '',
'sku_asociat' => $custom_fields['produs_compatibil'] ?? ''
];
$response->set_data($filtered_data);
return $response;
}, 10, 3);Am lucrat acum jumătate de an la un magazin WooCommerce headless destul de măricel, cu vreo 12.000 de produse și o grămadă de specificații tehnice. Clientul voia un CPT (Custom Post Type) pentru "Manuale Tehnice" și "Garanții", plus câmpuri custom prin ACF conectate direct cu produsele din WooCommerce. Dacă lași WordPress-ul să își facă de cap, API-ul îți scuipă megabytes de date inutile pe care React-ul sau Next.js le descarcă degeaba. Am reușit să reducem payload-ul API-ului cu 55% doar făcând curățenie în ce trimitem pe sârmă.
Opțiunea 1: Curățarea REST API-ului din PHP
Dacă mergi pe REST API clasic (care e mult mai ușor de pus în cache cu Cloudflare sau Varnish), nu lăsa ruta default să trimită tot. WordPress îți pune la dispoziție filtrul rest_prepare_{post_type}.
Am pățit să văd echipe care luau tot JSON-ul gigant și făceau filtrarea în frontend. E o greșeală stupidă. Consumi bandă degeaba și crești timpul de încărcare pe mobile, mai ales pe conexiuni slabe. Mai bine scrii câteva linii de PHP în functions.php sau într-un plugin de customizări și trimiți doar ID-ul, titlul și fix câmpurile din ACF de care ai nevoie.
Opțiunea 2: WPGraphQL și WPGraphQL for ACF
Dacă vrei o arhitectură curată din start, GraphQL e regele. Instalezi WPGraphQL și extensia pentru ACF. Din start elimini problema de over-fetching: frontend-ul cere exact title și acfField.
Dar vine cu un mare trade-off. Pe cât de frumos e GraphQL la scriere, pe atât de nasol e la caching. REST API-ul îl cache-uiești la nivel de URL extrem de simplu. La GraphQL, toate cererile sunt POST pe același endpoint (/graphql). Dacă ai query-uri complexe pe un catalog mare de produse WooCommerce, baza de date o să înceapă să gâfâie fără un plugin serios de cache dedicat pentru GraphQL (cum e WP GraphQL Cache sau un strat de Redis).
Cum filtrăm inteligent în REST
Pentru cei care vor să rămână pe REST (care rămâne preferatul meu pentru proiecte medii datorită simplității), cel mai simplu mod e să interceptăm răspunsul API-ului.
Trade-off-ul aici e că trebuie să menții manual această listă de câmpuri în PHP. Dacă adaugi un câmp nou în ACF, trebuie să îți aduci aminte să îl adaugi și în funcția de filtrare. Dar pentru performanța pe care o câștigi, merită efortul de 5 minute.
Voi cum procedați la proiectele headless? Mergeți direct pe GraphQL pentru flexibilitate sau preferați simplitatea și cache-ul ușor din REST API?