Perché un custom post type necessita dell'impostazione 'hierarchical' negli args?
Sto avendo difficoltà a capire alcuni aspetti dei CPT e avrei bisogno di aiuto. Vedo che spesso le tassonomie devono essere gerarchiche, ma non capisco come/quando un custom post type dovrebbe esserlo?
Ad esempio, ho un CPT chiamato 'projects'. C'è una tassonomia registrata per questo post type chiamata 'fields'. Sotto 'fields' ho molti sotto-elementi come:
- 'Documentari'
- 'Documentari' > 'Auto-commissionati'
- 'Documentari' > 'Classici'
- 'Corporate'
- 'Corporate' > 'Digital Marketing'
- etc...
Quindi per visualizzare un progetto in 'Documentari' > 'Classici' uso questo URL: mydomain.com/field/classic/
Qui avrei circa 30 domande :) ma farò solo le due più urgenti:
- Perché e come il CPT 'projects' potrebbe mai essere gerarchico?
- È possibile visualizzare gli elementi nel campo 'classic' così: mydomain.com/projects/classic (mydomain.com/projects mostra tutti gli elementi, ma andare oltre non funziona)
Qualsiasi aiuto è apprezzato, ho passato circa 3 ore a sperimentare e leggere senza riuscire a capire!
Grazie!
Di seguito il mio codice (ridotto) per riferimento:
function register_cpt_projects() {
$labels = array(
'name' => _x('Projects', 'projects'),
// tutte le altre labels etc..
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'supports' => array('title', 'editor', 'author', 'thumbnail'),
'taxonomies' => array('field'),
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'has_archive' => true,
'query_var' => true,
'can_export' => true,
'rewrite' => true,
'capability_type' => 'post'
);
register_post_type('projects', $args);
}
add_action('init', 'register_cpt_projects');
function create_projects_tax(){
register_taxonomy('field', 'projects', array(
'hierarchical' => true,
'label' => 'Fields'
));
}
add_action('init', 'create_projects_tax');

Quando hai due oggetti di contenuto con un'interfaccia simile o proprietà condivise, hai un buon candidato per i tipi di post gerarchici.
Prendiamo come esempio i luoghi (vedi questa risposta):
- Asia
- Europa
- Germania
- Berlino
- Austria
- Vienna
- Germania
Ogni luogo ha metadati simili: popolazione, coordinate geografiche, lingue parlate. Puoi semplicemente riutilizzare la stessa interfaccia.
Inoltre, se crei un tipo di post personalizzato separato per ogni tipo di luogo, incorrerai nel problema della mancanza di una tabella di relazioni tra post in WordPress.

Grazie, questo potrebbe essere utile allora. Ho letto l'altro post e ho provato a capire come impostare un cpt come genitore ma non ci sono riuscito. Non vedo il menu a discesa del genitore da nessuna parte nella pagina di modifica del cpt 'projects'. Ha importanza qual è il 'capability_type' del mio cpt? Era 'post' ma l'ho cambiato in 'page' e ho testato, ma ancora nessun menu a discesa. Ho diversi post di 'projects' aggiunti quindi dovrebbe esserci qualcosa che possa essere un genitore lì dentro. Grazie mille finora :)

Un custom post type richiede l'impostazione gerarchica solo se vuoi che si comporti come le pagine.
Se desideri poter scegliere un genitore e avere il metabox per l'ordine del menu, devi anche aggiungere 'page-attributes' all'array supports.
L'argomento hierarchical ti permette anche di trattare i post type gerarchici in modo diverso dagli altri utilizzando il tag condizionale is_post_type_hierarchical()
. Supporta come parametro un oggetto post, il nome del post type o l'ID del post.
È possibile visualizzare gli elementi nel campo 'classic' in questo modo: mydomain.com/projects/classic (mydomain.com/projects mostra tutti gli elementi, ma navigare più in profondità non funziona)
Puoi usare l'argomento rewrite per definire come appaiono gli URL dei singoli post type:
slug: Lo slug che vuoi usare come prefisso per i tuoi post.
with_front: Se il tuo post type deve usare la base frontale dalle impostazioni dei permalink.
'rewrite' => array( 'slug' => 'classic', 'with_front' => false ),
farebbe apparire i tuoi URL per i singoli post di progetto così:
yoursite.com/classic/nome-post
Se vuoi che i tuoi URL di archivio siano: mydomain.com/projects/classic
dovrai applicare regole di rewrite simili agli argomenti di register_taxonomy.
Dovresti impostare lo slug di rewrite a projects e with_front a false. Da notare anche che l'array rewrite di register_taxonomy supporta: 'hierarchical' - true o false permette URL gerarchici
Questo ti permette di usare la gerarchia completa sui termini della tassonomia nei tuoi URL:
