Get template part based on custom taxonomy term

I have a custom post type and I’m trying to call up different variations of the navigation based on the custom taxonomy slug. I’ve done this fairly easily with normal posts, like so:

<?php 
    if ( is_category( 'mixers' )) {
        include (TEMPLATEPATH.'/nav-mixers.php');
    } elseif ( is_category( 'monitors' )) {
        include (TEMPLATEPATH.'/nav-monitors.php' );
    } elseif ( is_category( 'speakers' )) {
        include (TEMPLATEPATH.'nav-speakers.php');
    }
?>

however this is proving challenging for a custom post type. I feel like I’m close but I need some help now. Here’s where I currently am.

<?php
    $terms = get_the_terms( $post->id, 'prodcat' ); // get an array of all the terms as objects.
    $terms_slugs = array();
        foreach( $terms as $term ) {
            $terms_slugs[] = $term->slug; // save the slugs in an array
        }
    if( $terms ) :
       get_template_part( 'nav', slug );
    else :
       get_template_part( 'nav', 'home' );
    endif;
?>

Any help is much appreciated!

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

To loop through all the slugs of a term list, simply call get_the_terms() and pull only the slugs:

$slugs = wp_list_pluck( get_the_terms( get_the_ID(), 'prodcat' ), 'slug' );

Then you need to check if you got any results:

if ( ! empty( $slugs ) )

The problem I then see arising is that you got a bunch of slugs in return (unless you restricted the admin meta box to allowing only a single term).

You’d then have to decide on some custom criteria which nav menu you want to have and pull that from the list of $slugs:

// Decide which slug fits and then determine the key:
$key = 0;
get_template_part( 'nav', $slugs[ $key ] );

Method 2

The “custom taxonomy slug”, in your case, would be prodcat but based on your code I assume that you mean the individual term slugs.

Now, get_the_terms() will return all terms assigned to the post but you can only load one template so you will have to determine which term slug to use if there are more than one. I don’t know how you intend to decide that but this will load a template based on one of the slugs, anyway.

$terms = get_the_terms( $post->id, 'post_tag' ); // get an array of all the terms as objects.
$terms_slugs = array();
foreach( $terms as $term ) {
    $terms_slugs[] = $term->slug; // save the slugs in an array
}

if( !empty($terms_slugs) ) :
  get_template_part( 'nav', array_pop($terms_slugs) );
else :
  get_template_part( 'nav', 'home' );
endif;

But I am not even sure you need the foreach at all:

// get an array of all the terms as objects.
$terms = get_the_terms( $post->id, 'post_tag' );
if ( ! empty( $terms ) ) :
    $terms = array_pop( $terms );
    get_template_part( 'nav', $terms->slug );
else :
    get_template_part( 'nav', 'home' );
endif;

Method 3

Well, it took a 24 hour work session to get me just loopy enough to figure it out. I had to pass both post id AND taxonomy name. Everything I had tried until this did either one or the other. facepalm

<?php

    $terms = get_the_terms( $post->id, 'prodcat', array( 'parent' => 0 ) ); 
    $terms_slugs = array();
    foreach( $terms as $term ) {
        $terms_slugs[] = $term->slug; 
    }

    if( !empty($terms_slugs) ) :
      get_template_part( 'nav', array_pop($terms_slugs) );
    else :
      get_template_part( 'nav', 'home' );
    endif;
?>

WOO!


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x