Search code examples
hierarchycustom-post-typetaxonomycustom-taxonomy

Wordpress - Get the taxonomy of a post hierarchically


I would like to get all the taxonomy of one post (in a loop), hierarchically. Example I have those taxonomies, and the ID of the tax in bracket.

Tax1(1)
-Tax2(3)
--Tax3(2)

I would like to gather them, in an array maybe, in this order. Right now I manage to get an array of those 3, but the order is wrong. I can't order it by id, since the ID are not ordered at first. I can't also order it by name and slug. (Names of my current taxonomies are not Tax1, Tax2...)

The code I have at the moment is

$args = array('orderby' => 'term_order', 'order' => 'ASC', 'fields' => 'all');
$productcategories = wp_get_object_terms($post->ID, 'guide_type', $args);

Solution

  • Use "Wordpress" Walker class to create a hierarchy of the taxonomy

    <?php
    class Walker_Quickstart extends Walker {
    
        // Tell Walker where to inherit it's parent and id values
        var $db_fields = array(
            'parent' => 'parent', 
            'id'     => 'term_id' 
        );
    
        /**
         * At the start of each element, output a <p> tag structure.
         */
        function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
            $output .= sprintf( "\n<p>%s %s (%s)</p>\n",
                str_repeat('&dash;', $depth),
                $item->name,
                $item->term_id            
            );
        }
    
    }?>
    

    This class will create a hierarchy of elements. Use this class with your returned elements like this :

    $args = array('orderby' => 'term_order', 'order' => 'ASC', 'fields' => 'all');
    $productcategories = wp_get_object_terms($post->ID, 'guide_type', $args);
    $walk = new Walker_Quickstart();
    echo $walk->walk($productcategories, 0);