Ce face register_post_type
Un tip de conținut personalizat (custom post type) se comportă ca articolele și paginile, dar cu propriul meniu, propriile adrese și propriile șabloane (single-produs.php, archive-produs.php). Înregistrarea se face pe hook-ul init, la fiecare încărcare a site-ului, nu o singură dată.
Cheia ($post_type) are maximum 20 de caractere: litere mici, cifre, cratimă și underscore. public este implicit false, iar show_in_rest trebuie pus pe true ca tipul să apară în API-ul REST și să folosească editorul de blocuri.
După ce adaugi un tip public sau schimbi rewrite, regulile de adrese trebuie regenerate: salvează o dată Setări → Legături permanente, rulează wp rewrite flush sau cheamă flush_rewrite_rules() la activarea pluginului (nu la fiecare încărcare).
Parametri
| Parametru | Descriere |
|---|---|
$post_type |
Cheia tipului: maximum 20 de caractere, litere mici, cifre, - și _. |
labels |
Etichetele din administrare (name, singular_name, add_new_item…). |
public |
Dacă tipul e vizibil public și în administrare. Implicit false; alte opțiuni (show_ui, publicly_queryable) îi moștenesc valoarea. |
has_archive |
true sau un slug pentru pagina de arhivă a tipului. Implicit false. |
show_in_rest |
Include tipul în API-ul REST; necesar pentru editorul de blocuri. |
supports |
Funcțiile din editor: 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'… Implicit title și editor. |
rewrite |
false sau un tablou, de exemplu array( 'slug' => 'produse' ). Implicit slug-ul este cheia tipului. |
menu_icon |
Iconița din meniu: o clasă Dashicons ('dashicons-cart') sau un SVG în base64. |
hierarchical |
true pentru tipuri ierarhice ca paginile. Implicit false. |
Ce returnează
Obiectul WP_Post_Type înregistrat sau WP_Error la eșec.
Exemple
Exemplul 1: Tipul „Produse” pentru Cafenea Iași
Arhiva va fi la https://exemplu.ro/produse/, iar fiecare produs la /produse/slug-produs/.
<?php
add_action( 'init', 'dex_inregistreaza_produs' );
function dex_inregistreaza_produs() {
register_post_type( 'produs', array(
'labels' => array(
'name' => 'Produse',
'singular_name' => 'Produs',
'add_new_item' => 'Adaugă produs',
),
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'menu_icon' => 'dashicons-cart',
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
'rewrite' => array( 'slug' => 'produse' ),
) );
}
Exemplul 2: Regenerezi adresele la activarea pluginului
Tipul se înregistrează întâi, apoi se regenerează regulile, o singură dată, la activare.
<?php
register_activation_hook( __FILE__, 'dex_activare' );
function dex_activare() {
dex_inregistreaza_produs();
flush_rewrite_rules();
}
Exemplul 3: Verifici din terminal că tipul există
post_type_exists() confirmă că înregistrarea pe init a rulat.
wp eval 'var_dump( post_type_exists( "produs" ) );'
Ieșire în terminal
bool(true)
Greșeli frecvente
- Paginile tipului nou dau 404: regulile de adrese nu au fost regenerate. Salvează Legături permanente sau rulează
wp rewrite flush. - Chemi
flush_rewrite_rules()la fiecare încărcare, peinit: operația e costisitoare; fă-o doar la activare. - Uiți
'show_in_rest' => trueși tipul se deschide în editorul clasic, nu în editorul de blocuri. - Folosești o cheie mai lungă de 20 de caractere sau cu majuscule (
ProduseCafenea): înregistrarea eșuează.
Comenzi înrudite
register_taxonomy: Creează o taxonomie proprie (ca Categorii sau Etichete), de exemplu „Oraș” pentru produse sau evenimente.init: Acțiunea care rulează după ce WordPress s-a încărcat, înainte de trimiterea antetelor; locul pentru tipuri de conținut, taxonomii și formulare.wp rewrite flush: Regenerează regulile de rescriere a adreselor (permalinks), de exemplu după înregistrarea unui tip de conținut nou.WP_Query: Clasa care interoghează articole, pagini și tipuri personalizate după criterii: tip, categorie, câmpuri, ordine, paginare.get_template_part: Încarcă o bucată de șablon din temă (de exemplu template-parts/card-produs.php), cu prioritate pentru tema copil.