add_action('init', function() {
register_post_type('producator', [
'label' => 'Producători',
'public' => true,
'show_in_rest' => true, // Esențial pentru REST API
'rest_base' => 'producatori',
'show_in_graphql' => true, // Esențial pentru WPGraphQL
'graphql_single_name' => 'producator',
'graphql_plural_name' => 'producatori',
'supports' => ['title', 'editor', 'thumbnail'],
'taxonomies' => [],
]);
});Am lucrat recent la un magazin WooCommerce headless și m-am lovit din nou de clasica problemă: cum trimiți datele din Custom Post Types (CPT) și Advanced Custom Fields (ACF) către React sau Next.js fără să explodeze payload-ul API-ului. WordPress e un CMS excelent pentru editori, dar pe partea de API livrează, by default, tone de metadate inutile de care front-end-ul tău n- are nevoie.
Problema cu abordarea default
La un magazin de piese auto cu peste 12.000 de produse, aveam un CPT numit „Producători” (brands) legat de produsele din WooCommerce printr-o relație ACF. La început, echipa a mers pe varianta simplă: un plugin care arunca tot obiectul ACF direct în REST API.
Rezultatul? Endpoint-ul de produse returna un JSON uriaș de 4MB. Timpul de răspuns pe server sărea lejer de 1.8 secunde. Nimic nu e mai dăunător pentru conversii decât un magazin care se mișcă în reluare.
Calea REST: Filtrare agresivă
Dacă proiectul tău folosește REST API, regula de aur este să nu folosești plugin-uri automate care expun ACF direct. Scrie-ți propriile endpoint-uri sau filtrează masiv răspunsul folosind register_rest_field.
Merge excelent pentru că poți formata datele exact în structura pe care o vrea front-end-ul. În loc să trimiți 50 de câmpuri din ACF de care nu te atingi, trimiți doar cele 3-4 stringuri necesare. Trade-off-ul? Trebuie să scrii cod de boilerplate pentru fiecare câmp nou adăugat în CMS.
Calea GraphQL: WPGraphQL și ACF Schema
Pentru proiectele medii și mari, GraphQL câștigă detașat. Folosind WPGraphQL și WPGraphQL for ACF, obții un control granular. Front-end-ul cere doar brandName și brandLogo, iar WordPress compilează doar acele date.
La magazinul de piese auto, trecerea la GraphQL ne-a redus timpul de încărcare al paginii de produs cu peste 40%. Interogările SQL s-au redus dramatic deoarece GraphQL nu încarcă restul de metadate din wp_postmeta dacă nu le-ai cerut explicit în query.
Totuși, există un trade-off destul de serios. Ecosistemul WPGraphQL se bazează pe multe plugin-uri comunitare. Când WordPress sau ACF fac un update major, riști să îți crape schema de GraphQL pe producție dacă nu ești atent la update-uri.
Cum înregistrezi CPT-ul curat
Nu folosi plugin-uri gen CPT UI doar pentru a bifa niște opțiuni. Înregistrează CPT-ul direct în functions.php sau într-un plugin custom de funcționalități. Cheia este să activezi corect suportul pentru REST și GraphQL direct din cod, așa cum am făcut în exemplul de mai jos.