Cum să activezi legături permanente ierarhice pentru taxonomii ierarhice

16 mai 2011, 01:08:49
Vizualizări: 18.1K
Voturi: 3

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!

0
Toate răspunsurile la întrebare 4
5
11

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
));
16 mai 2011 01:42:31
Comentarii

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.

supertrue supertrue
16 mai 2011 02:06:17

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

supertrue supertrue
17 mai 2011 18:50:30

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

Milo Milo
17 mai 2011 18:54:08

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 supertrue
17 mai 2011 23:21:33

@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.

Milo Milo
18 mai 2011 01:35:15
0

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.

9 nov. 2012 00:50:42
0

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

22 sept. 2013 20:49:26
2

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.

20 sept. 2016 18:37:59
Comentarii

Pot greși, dar cred că acest lucru nu ia în considerare traducerile, nu-i așa? Cu excepția cazului în care slug-ul taxei este "services" în toate limbile...

wbq wbq
28 nov. 2019 18:19:24

services este numele paginii (numele fișierului, de exemplu services_page.php)

Fury Fury
29 nov. 2019 13:39:11