register_post_type în WordPress

Înregistrează un tip de conținut personalizat (produse, evenimente, rețete), cu meniu propriu în administrare.

Sintaxă
register_post_type( string $post_type, array|string $args = array() ): WP_Post_Type|WP_Error

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, pe init: 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.