Combinare strutture rewrite di custom post type e tassonomie?
Fondamentalmente voglio creare un glossario utilizzando i custom post type ma ho alcuni problemi nell'impostare i rewrite nel modo in cui li desidero. Voglio ottenere questo risultato:
L'URL principale del glossario:
http://example.com/glossary/
Termini del glossario che iniziano con la lettera A:
http://example.com/glossary/a/
L'URL per un singolo termine del glossario:
http://example.com/glossary/a/atomic/
In realtà ho ottenuto questo risultato utilizzando il codice qui sotto, ma sono sicuro che sia un modo molto macchinoso per farlo e so che non funziona correttamente da qualche parte poiché vengono richiamati i template sbagliati durante la visualizzazione delle pagine. Ad eccezione di http://example.com/glossary/, dove archive-sumo-glossary-term.php viene richiamato come previsto, gli altri due attivano semplicemente index.php nel mio tema.
Ecco il codice (functions.php
nel tema):
add_action('init', 'create_glossary');
function create_glossary()
{
register_post_type
(
'sumo-glossary-term',
array
(
'labels' => array
(
'name' => _x('Termini Glossario', 'nome generale tipo post'),
'singular_name' => _x('Termine Glossario', 'nome singolare tipo post')
# E così via...
),
'supports' => array('title', 'editor', 'thumbnail'),
'public' => true,
'rewrite' => array
(
'slug' => 'glossary',
'with_front' => false
),
'query_var' => 'glossary-term',
'has_archive' => true
)
);
register_taxonomy
(
'sumo-glossary-letter',
'sumo-glossary-term',
array
(
'hierarchical' => true,
'labels' => array
(
'name' => _x('Lettere', 'nome generale tassonomia'),
'singular_name' => _x('Lettera', 'nome singolare tassonomia')
# E così via...
),
'show_ui' => true,
'query_var' => 'glossary-letter',
'rewrite' => false
)
);
}
add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
if ($post->post_type == 'sumo-glossary-term')
{
$permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
}
return $permalink;
}
add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');
Puoi sempre sovrascrivere il template che verrà chiamato con il filtro template_include
o un filtro correlato, ma questo potrebbe nascondere problemi più profondi con gli archivi personalizzati.
Come ho capito, vuoi utilizzare la seguente struttura:
/glossary/
dovrebbe essere una pagina di archivio per tutti i post di tiposumo-glossary-term
/glossary/[lettera]/
dovrebbe essere una pagina di archivio per i post con il termine di tassonomia[lettera]
nella tassonomiasumo-glossary-letter
/glossary/[lettera]/[nome-termine]/
dovrebbe essere un singolo post di tiposumo-glossary-term
Ciò significa che il primo caricherà il template archive-sumo-glossary-term.php
, il secondo caricherà taxonomy-sumo-glossary-letter.php
e il terzo caricherà single-sumo-glossary-term.php
.
Ho ottenuto questo risultato in WordPress 3.2 impostando esplicitamente lo slug di riscrittura della tassonomia, sia lo slug di riscrittura che lo slug dell'archivio per il tipo di post, senza altre regole di riscrittura. Inoltre, ho registrato prima la tassonomia e poi il tipo di post, per assicurarmi che le priorità fossero corrette (altrimenti un URL come /glossary/f/page/2
porta al termine del glossario page
invece della pagina 2 della lettera del glossario f
).
add_action('init', 'create_glossary');
function create_glossary()
{
register_taxonomy
(
'sumo-glossary-letter',
array(),
array
(
'hierarchical' => true,
'labels' => array
(
'name' => _x('Lettere', 'nome generale tassonomia'), // Lettere
'singular_name' => _x('Lettera', 'nome singolare tassonomia') // Lettera
# E così via...
),
'show_ui' => true,
'query_var' => 'glossary-letter',
'rewrite' => array(
'slug' => 'glossary',
),
)
);
register_post_type
(
'sumo-glossary-term',
array
(
'labels' => array
(
'name' => _x('Termini del Glossario', 'nome generale tipo di post'), // Termini del Glossario
'singular_name' => _x('Termine del Glossario', 'nome singolare tipo di post') // Termine del Glossario
# E così via...
),
'supports' => array('title', 'editor', 'thumbnail'),
'public' => true,
'rewrite' => array
(
'slug' => 'glossary/%sumo-glossary-letter%',
'with_front' => false
),
'query_var' => 'glossary-term',
'has_archive' => 'glossary',
'taxonomies' => array( 'sumo-glossary-letter' ),
)
);
}
add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
$glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
$post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
}
return $post_link;
}

Ok, non esattamente domani... Ha funzionato, quasi perfettamente! Grazie!
Quello che non funziona è /glossary/
. Mi dà un 404 (archive-sumo-glossary-term.php
è configurato). Qualche idea? Devo dire che sono bloccato su WP 3.0.1 e forse è un problema di versione. Dovrò testare di nuovo quando potrò aggiornare.
Comunque, per la maggior parte funziona e per ora non mi serve necessariamente /glossary/
e posso semplicemente reindirizzare alla lettera A. Grazie ancora!

hey @maryisdead, ho avuto esattamente lo stesso problema e sono arrivato alla tua stessa soluzione, ma mi sono trovato con il tuo stesso problema - come fai a far sì che /glossary utilizzi il template archive-glossery.php?
Ho appena trovato la risposta - usa 'has_archive' => 'glossary'
, invece di has_archive => true
Ho appena notato che Jan lo ha scritto così nella sua risposta, ma tu non lo hai nel tuo codice originale - l'hai aggiornato? Per me ha iniziato a funzionare non appena ho fatto questa modifica

Ciao Jeff! Sì, ho aggiornato quella parte. Ho ricontrollato, ma ancora non funziona. L'installazione di WordPress in questione non è ancora aggiornata (3.0.1) quindi forse è ancora quello il problema alla radice.

Codice ancora rilevante - lo uso ancora come soluzione principale per ottenere questa struttura.
Una domanda: se c'è un post creato a cui non è assegnato alcun termine di tassonomia (quindi l'URL sarebbe tipo customposttypeslug/postslug) - ricevo un errore 404. C'è un modo (probabilmente tramite le regole dei permalink) per far sì che funzioni anche in questo caso?

FUNZIONA PERFETTAMENTE! L'ordine di registrazione della tassonomia e del CPT era la chiave nel mio caso.

Non l'ho utilizzato personalmente, ma potresti voler dare un'occhiata a "add_rewrite_rule"
http://codex.wordpress.org/Rewrite_API/add_rewrite_rule
inoltre non dimenticare di salvare i permalink una volta che li hai modificati.
