Cum să activezi legături permanente ierarhice pentru taxonomii ierarhice
Dacă ai o categorie numită "termen" și o subcategorie numită "subtermen", poți accesa postările subtermen la /categorie/subcategorie. Dar acest lucru nu funcționează implicit cu taxonomiile personalizate. Ele sunt accesibile la /taxonomie/subtermen, dar nu la /taxonomie/termen/subtermen.
Acest subiect a fost discutat în Wordpress Trac (http://core.trac.wordpress.org/ticket/12659), și pare că există o soluție, dar întrucât nu am folosit niciodată Trac și nu înțeleg pe deplin limbajul său (diferențe, etc.), am nevoie de cineva mai experimentat să-mi explice cum să implementez acest lucru. Există cod acolo pe care trebuie să-l copiez în fișierele de bază ale WordPress? Este deja implementat și pot adăuga ceva în functions.php al temei mele?
Dacă este posibil, aș prefera să nu modific niciun fișier de bază. Ajutor!

Această funcționalitate este implementată în WordPress începând cu versiunea 3.1.
Când înregistrezi taxonomia ta, asigură-te să setezi rewrite hierarchical pe true, la fel ca și pentru taxonomia în sine:
<?php
register_taxonomy('genre',array('book'), array(
'hierarchical' => true, // aceasta o face ierarhică în interfața de utilizare
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'hierarchical' => true ), // aceasta creează URL-uri ierarhice
));

Există o modalitate de a adăuga un parametru la o taxonomie personalizată deja înregistrată? Toate taxonomiile mele au fost create cu un plugin, așa că ar fi util dacă aș putea adăuga ceva în functions.php care să adauge 'rewrite' => array( 'hierarchical' => true ) la acele taxonomii.

Încă caut răspunsul la această întrebare—vezi http://wordpress.stackexchange.com/questions/17444/add-overwrite-a-parameter-on-an-existing-post-type-taxonomy

Probabil este mai simplu să adaugi singur taxonomiile și să nu folosești pluginul.

Problema este că lucrez cu alții care au nevoie de interfața grafică. Parametrul de rescriere ierarhică este singurul lucru pe care multe dintre aceste plugin-uri încă nu îl suportă.

@supertrue - au nevoie să poată înregistra taxonomii prin intermediul unei interfețe grafice? odată ce înregistrezi o taxonomie, ei vor putea folosi interfața grafică pentru a gestiona termenii. doar mă asigur că nu există o confuzie aici - nu am întâlnit niciodată o situație în care noi taxonomii trebuiau adăugate atât de regulat. o întreagă taxonomie, nu doar termeni în taxonomie.

Există vreo modalitate de a adăuga un parametru la o taxonomie personalizată deja înregistrată? Toate taxonomiile mele au fost create cu un plugin, așa că ar fi util dacă aș putea adăuga ceva în functions.php care să adauge 'rewrite' => array( 'hierarchical' => true ) la acele taxonomii.
Ar trebui să poți utiliza register_taxonomy
pentru a reînregistra taxonomia pe care dorești să o modifici.
http://core.trac.wordpress.org/browser/tags/3.4.2/wp-includes/taxonomy.php#L305
ATENȚIE: Cod netestat!
(Doar o idee rapidă. Nu îmi asum responsabilitate pentru site-uri stricate.):
function reregister_taxonomy() {
# tipurile de postări la care este înregistrată taxonomia
$post_types = array('post');
# setează acest lucru la numele taxonomiei
$tax_name = 'TAXONOMY_NAME_TO_CHANGE';
# încarcă taxonomia deja creată ca array pentru a o putea
# transmite înapoi ca $args la register_taxonomy
$tax = (array)get_taxonomy($tax_name);
if ($tax) {
# ajustează necesitățile ierarhice
$tax['hierarchical'] = true;
$tax['rewrite']['hierarchical'] = true;
# ajustează elementele ierarhice (acestea ar putea fi ignorate)
$tax['labels']['parent_item'] = sprintf(__("Părinte %s"),
$tax->labels->singular_name);
$tax['labels']['parent_item_colon'] = sprintf(__("Părinte %s:"),
$tax->labels->singular_name);
# convertește capabilitățile la array, așa cum este așteptat de register_taxonomy
$tax['capabilities'] = (array)$tax['cap'];
# convertește etichetele la array
$tax['labels'] = (array)$tax['labels'];
# înregistrează taxonomia cu noile setări
register_taxonomy($tax_name, array('post'), $tax);
}
}
# acțiune init cu o prioritate târzie pentru a se asigura că alte taxonomii sunt încărcate
# alternativ, poate fi realizată cu hook-ul `registered_taxonomy`
add_action('init', 'reregister_taxonomy', 9999);
Abia după ce am scris acest cod am realizat că întrebarea are un an și jumătate, poate cineva va găsi acest lucru util oricum.

Pentru a face permalink-urile ierarhice să funcționeze, trebuie să adăugați reguli de rescriere. Am reușit să asamblez un cod care face ca un tip de postare personalizat cu o taxonomie personalizată să funcționeze cu termeni părinte/copil reflectați în permalink-uri. Nu este perfect, dar funcționează!
function keha_add_rewrite_rules() {
add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?taxonomy=$matches[1]&taxonomy=$matches[2]&posttype=$matches[3]', 'top' );
add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/$', 'index.php?posttype=$matches[2]', 'top' );
add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?posttype=$matches[3]', 'top' );
add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/?$', 'index.php?taxonomy=$matches[2]', 'top' );
add_rewrite_rule( '^posttype_slug/(.+?)$', 'index.php?taxonomy=$matches[1]', 'top' );
}
add_action('init', 'keha_add_rewrite_rules');
Vizualizați exemplul meu funcțional pe Github:
https://github.com/keha76/WordPress-CPT-Hierarchical-Taxonomy-Permalinks

Mulțumesc @anubhava
Un mic studiu despre API-ul WP Rewrite a dus la găsirea soluției.
1) Am creat o regulă personalizată pentru rescrierea URL-urilor și am adăugat-o în fișierul functions.php
function services_rewrite_basic() {
add_rewrite_rule('^services/.*', 'index.php?page_id=110&level=$matches[1]&level=$matches[1]&level=$matches[1]', 'top');
}
add_action('init', 'services_rewrite_basic');
2) În final, am salvat pagina de permalink-uri fără nicio modificare și asta a funcționat.
