Make WordPress Core

Ticket #13889: hierarchical-term-links.php

File hierarchical-term-links.php, 1.5 KB (added by dd32, 14 years ago)
Line 
1<?php
2
3add_action('init', '_state_taxonomy');
4function _state_taxonomy() {
5        global $wp_rewrite;
6        register_taxonomy('state', array('note', 'post'), array('hierarchical' => true, 'label' => 'States', 'show_ui' => true, 'query_var' => 'state', 'rewrite' => true) );
7        $wp_rewrite->add_rewrite_tag("%state%", '.*?/?([^/]+)', "state="); // Override the query var, do this directly after registering the taxonomy
8        // Note on the regex above, May look strange, but is to only match the final path item in the url, which is the child slug. WP_Query doesnt reconise hierarchical custom tax slugs
9        // $wp_rewrite->flush_rules(); // Flush them on activation, not init, please?
10}
11
12add_filter('term_link', '_hierarchical_terms_hierarchical_links', 9, 3);
13function _hierarchical_terms_hierarchical_links($termlink, $term, $taxonomy) {
14        global $wp_rewrite;
15
16        if ( 'state' != $taxonomy ) // Change 'state' to your required taxonomy
17                return $termlink;
18
19        $termstruct = $wp_rewrite->get_extra_permastruct($taxonomy);
20        if ( empty($termstruct) ) // If rewrites are disabled, fall back to the current link
21                return $termlink;
22
23        if ( empty($term->parent) ) // Fall back to the current link for parent terms
24                return $termlink;
25       
26        $nicename = $term->slug;
27        while ( !empty($term->parent) ) {
28                $term = get_term($term->parent, $taxonomy);
29                $nicename = $term->slug . '/' . $nicename;
30        }
31
32        $termlink = str_replace("%$taxonomy%", $nicename, $termstruct);
33        $termlink = home_url( user_trailingslashit($termlink, 'category') );
34
35        return $termlink;
36}
37