Combinarea structurilor de rescriere pentru tipuri de postări personalizate și taxonomii?
În principiu vreau să creez un glosar folosind tipuri de postări personalizate și am probleme cu configurarea rescrierii URL-urilor în modul dorit. Vreau să obțin următoarea structură:
URL-ul principal al glosarului:
http://example.com/glossary/
Termenii din glosar care încep cu litera A:
http://example.com/glossary/a/
URL-ul pentru un termen individual din glosar:
http://example.com/glossary/a/atomic/
Am reușit de fapt să obțin acest lucru folosind codul de mai jos, dar sunt sigur că este o modalitate foarte stângace de a face acest lucru și știu că undeva nu funcționează corect deoarece sunt apelate șabloanele greșite la vizualizarea paginilor. Cu excepția http://example.com/glossary/, unde archive-sumo-glossary-term.php este apelat conform așteptărilor, celelalte două activează doar index.php în tema mea.
Iată codul (în functions.php
din temă):
add_action('init', 'create_glossary');
function create_glossary()
{
register_post_type
(
'sumo-glossary-term',
array
(
'labels' => array
(
'name' => _x('Termeni Glosar', 'nume general tip postare'),
'singular_name' => _x('Termen Glosar', 'nume singular tip postare')
# Și așa mai departe ...
),
'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('Litere', 'nume general taxonomie'),
'singular_name' => _x('Literă', 'nume singular taxonomie')
# Și așa mai departe
),
'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');
Puteți întotdeauna să suprascrieți șablonul care va fi apelat cu filtrul template_include
sau un filtru similar, dar acest lucru ar putea ascunde probleme mai profunde cu arhivele personalizate.
După cum am înțeles, doriți să utilizați următoarea structură:
/glossary/
ar trebui să fie o pagină de arhivă pentru toate articolele de tipsumo-glossary-term
/glossary/[litera]/
ar trebui să fie o pagină de arhivă pentru articolele cu termenul de taxonomie[litera]
în taxonomiasumo-glossary-letter
/glossary/[litera]/[nume-termen]/
ar trebui să fie un articol individual de tipsumo-glossary-term
Aceasta înseamnă că prima va încărca șablonul archive-sumo-glossary-term.php
, a doua va încărca taxonomy-sumo-glossary-letter.php
, iar a treia va încărca single-sumo-glossary-term.php
.
Am realizat acest lucru în WordPress 3.2 prin setarea explicită a slug-ului de rescriere pentru taxonomie și atât a slug-ului de rescriere cât și a slug-ului de arhivă pentru tipul de postare, fără alte reguli de rescriere. De asemenea, am înregistrat mai întâi taxonomia și apoi tipul de postare, pentru a mă asigura că prioritățile sunt corecte (în caz contrar, un URL precum /glossary/f/page/2
ar merge la termenul de glosar page
în loc de pagina 2 a literei de glosar f
).
add_action('init', 'create_glossary');
function create_glossary()
{
register_taxonomy
(
'sumo-glossary-letter',
array(),
array
(
'hierarchical' => true,
'labels' => array
(
'name' => _x('Litere', 'nume general taxonomie'),
'singular_name' => _x('Literă', 'nume singular taxonomie')
# Și așa mai departe
),
'show_ui' => true,
'query_var' => 'glossary-letter',
'rewrite' => array(
'slug' => 'glossary',
),
)
);
register_post_type
(
'sumo-glossary-term',
array
(
'labels' => array
(
'name' => _x('Termeni Glosar', 'nume general tip postare'),
'singular_name' => _x('Termen Glosar', 'nume singular tip postare')
# Și așa mai departe …
),
'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;
}

Voi încerca asta mâine și voi vedea dacă funcționează, apoi revin cu feedback. Mulțumesc!

Ok, nu chiar mâine... A funcționat, aproape perfect! Mulțumesc!
Ceea ce nu funcționează este /glossary/
. Îmi dă eroare 404 (archive-sumo-glossary-term.php
este configurat). Aveți idei? Trebuie să menționez că sunt blocat pe WP 3.0.1 și poate fi o problemă de versiune. Va trebui să testez din nou când voi putea face upgrade.
Oricum, în mare parte funcționează și pentru moment nu am nevoie neapărat de /glossary/
, ci doar de redirecționare către litera A. Mulțumesc din nou!

hei @maryisdead, am avut exact aceeași problemă și am ajuns la exact aceeași soluție, dar am rămas cu exact aceeași dilemă - cum faci ca /glossary să folosească template-ul archive-glossery.php?
Tocmai am găsit răspunsul - folosește 'has_archive' => 'glossary'
, în loc de has_archive => true
Abia acum am observat că Jan are asta în răspunsul său, dar tu nu ai implementat partea asta în codul tău original - ai actualizat-o? La mine a început să funcționeze imediat ce am făcut modificarea

Hei Jeff! Da, am actualizat acea parte. Am verificat din nou, încă nu funcționează. Instalarea WordPress în cauză nu este încă la zi (versiunea 3.0.1), deci probabil că aceasta este în continuare cauza problemei.

Cod încă relevant - încă îl folosesc ca soluție principală pentru a obține această structură.
O întrebare: dacă există un articol creat care nu are niciun termen de taxonomie atribuit (astfel încât URL-ul ar arăta ca customposttypeslug/postslug) - primesc o eroare 404. Există vreo metodă (probabil prin reguli de permalink) pentru a face ca acest lucru să funcționeze și în acest caz?

FUNCȚIONEAZĂ PERFECT! Ordinea înregistrării taxonomiei și CPT a fost cheia în cazul meu.

Nu am folosit personal acest lucru, dar poate doriți să vă uitați la "add_rewrite_rule"
http://codex.wordpress.org/Rewrite_API/add_rewrite_rule
de asemenea, nu uitați să salvați permalink-urile după ce le-ați modificat.
