register_taxonomy în WordPress

Creează o taxonomie proprie (ca Categorii sau Etichete), de exemplu „Oraș” pentru produse sau evenimente.

Sintaxă
register_taxonomy( string $taxonomy, array|string $object_type, array|string $args = array() ): WP_Taxonomy|WP_Error

Ce face register_taxonomy

O taxonomie grupează conținutul: Categoriile și Etichetele sunt taxonomiile implicite ale articolelor. Cu register_taxonomy() creezi una proprie (de exemplu oras, cu termenii Iași și Cluj) și o legi de unul sau mai multe tipuri de conținut prin $object_type.

Cu hierarchical = true taxonomia se comportă ca categoriile (termeni cu părinți, bife în editor); cu false (implicit) se comportă ca etichetele. Înregistrarea se face pe init; pentru a apărea în editorul de blocuri ai nevoie de show_in_rest = true.

Cheia are maximum 32 de caractere (litere mici, cifre, -, _) și nu trebuie să fie un termen rezervat de WordPress (de exemplu author, year, type). Ca la tipurile de conținut, după ce adaugi taxonomia regenerezi regulile de adrese.

Parametri

Parametru Descriere
$taxonomy Cheia taxonomiei: maximum 32 de caractere, litere mici, cifre, - și _.
$object_type Tipul (sau tabloul de tipuri) de conținut legat, de exemplu 'produs' sau array( 'post', 'produs' ).
labels Etichetele din administrare (name, singular_name…).
hierarchical true ca la categorii, false (implicit) ca la etichete.
show_admin_column Adaugă o coloană cu termenii în lista din administrare. Implicit false.
show_in_rest Include taxonomia în API-ul REST și în editorul de blocuri.
rewrite false sau un tablou cu slug, with_front, hierarchical. Implicit slug-ul este cheia.
default_term Termen implicit al taxonomiei (din WordPress 5.5).

Ce returnează

Obiectul WP_Taxonomy (din WordPress 5.4) sau WP_Error la eșec.

Exemple

Exemplul 1: Taxonomia „Oraș” pentru produse

Ierarhică, cu coloană în listă și disponibilă în editorul de blocuri. Arhiva unui termen: https://exemplu.ro/oras/iasi/.

<?php
add_action( 'init', 'dex_inregistreaza_oras' );

function dex_inregistreaza_oras() {
    register_taxonomy( 'oras', array( 'produs' ), array(
        'labels'            => array(
            'name'          => 'Orașe',
            'singular_name' => 'Oraș',
        ),
        'hierarchical'      => true,
        'show_admin_column' => true,
        'show_in_rest'      => true,
        'rewrite'           => array( 'slug' => 'oras' ),
    ) );
}

Exemplul 2: Produsele dintr-un oraș, cu tax_query

field = 'slug' înseamnă că terms conține slug-uri, nu ID-uri.

<?php
$din_iasi = get_posts( array(
    'post_type' => 'produs',
    'tax_query' => array(
        array(
            'taxonomy' => 'oras',
            'field'    => 'slug',
            'terms'    => 'iasi',
        ),
    ),
) );

foreach ( $din_iasi as $p ) {
    echo '<li>' . esc_html( get_the_title( $p ) ) . '</li>';
}

Ce afișează pagina

<li>Cană ceramică</li><li>Cafea boabe 250 g</li>

Greșeli frecvente

  • Alegi o cheie rezervată (author, year, type): WordPress poate răspunde cu 404 fără altă explicație. Folosește un nume propriu, eventual cu prefix.
  • Înregistrezi taxonomia înainte de init (direct în functions.php, în afara unui hook).
  • Taxonomia nu apare în panoul din editorul de blocuri: lipsește 'show_in_rest' => true.
  • Arhiva termenului dă 404 până regenerezi regulile de adrese.

Comenzi înrudite

  • register_post_type: Înregistrează un tip de conținut personalizat (produse, evenimente, rețete), cu meniu propriu în administrare.
  • 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_Query: Clasa care interoghează articole, pagini și tipuri personalizate după criterii: tip, categorie, câmpuri, ordine, paginare.
  • wp rewrite flush: Regenerează regulile de rescriere a adreselor (permalinks), de exemplu după înregistrarea unui tip de conținut nou.