How to display categories of my Custom Post Type?

  • I have a custom post type. What I'd like to do is to display the project categories just on top of the projects so visitors could then filter projects accordingly.

    In my functions.php I have:

    <?php
    
    require_once('portfolio-type.php');
    add_filter('excerpt_length', 'my_excerpt_length');
    
    function my_excerpt_length($length) {
    return 25; 
    }
    
    add_filter('excerpt_more', 'new_excerpt_more');  
    function new_excerpt_more($text){  
    
    return ' ';  
    }  
    
    function portfolio_thumbnail_url($pid){
    $image_id = get_post_thumbnail_id($pid);  
    $image_url = wp_get_attachment_image_src($image_id,'screen-shot');  
    return  $image_url[0];  
    }
    ?>
    

    In portfolio-type.php:

     <?php
    
     if ( function_exists( 'add_theme_support' ) ) { 
    add_theme_support( 'post-thumbnails' );
    set_post_thumbnail_size( 270, 170, true ); // Normal post thumbnails
    add_image_size( 'screen-shot', 720, 540 ); // Full size screen
     }
    
     add_action('init', 'portfolio_register');  
    
     function portfolio_register() {  
     $args = array(  
        'label' => __('Portfolio'),  
        'singular_label' => __('Project'),  
        'public' => true,  
        'show_ui' => true,  
        'capability_type' => 'post',  
        'hierarchical' => false,  
        'rewrite' => true,  
        'supports' => array('title', 'editor', 'thumbnail')  
       );  
    
    register_post_type( 'portfolio' , $args );  
     }  
    
    register_taxonomy("project-type", array("portfolio"), array("hierarchical"  =>  true, "label" => "Project Types", "singular_label" => "Project Type",   "rewrite" => true));
     ?>
    

    And finally in my index.php I have:

    <!-- Start Projects -->
    
                        <div id="posts" class="row isotope">
    
                          <?php if (have_posts()) : while (have_posts()) : the_post(); ?>  
    
                              <?php  
                                  $title= str_ireplace('"', '', trim(get_the_title()));  
                                  $desc= str_ireplace('"', '', trim(get_the_content()));  
                              ?>     
    
                              <div class="item post item span4 isotope-item">
    
                                <a class="project-wrp fancybox" title="<?=$title?>" rel="lightbox[work]" href="<?php print portfolio_thumbnail_url($post->ID) ?>"><div class="profile-photo"><div class="profile-icon">&#0102;</div><?php the_post_thumbnail(array('230','170'),array('alt' => '')); ?> </div>  
                                <div class="project-name"><?php echo $title; ?></div>
                                <div class="project-client"><?php echo $desc; ?></div>
                                </a>
                              </div>  
                          <?php endwhile; endif; ?>  
    
    
                        </div>
    
  • Rahul Verma

    Rahul Verma Correct answer

    7 years ago

    Remove your code from portfolio-type.php that registers post type and taxonomy (line 9 onwards).

    Use the following code (in portfolio-type.php) to register the post type "portfolio"

    function portfolio_register() {
        $labels = array(
            'name' => _x('Portfolio', 'post type general name'),
            'singular_name' => _x('Portfolio Item', 'post type singular name'),
            'add_new' => _x('Add New', 'portfolio item'),
            'add_new_item' => __('Add New Portfolio Item'),
            'edit_item' => __('Edit Portfolio Item'),
            'new_item' => __('New Portfolio Item'),
            'view_item' => __('View Portfolio Item'),
            'search_items' => __('Search Portfolio Items'),
            'not_found' =>  __('Nothing found'),
            'not_found_in_trash' => __('Nothing found in Trash'),
            'parent_item_colon' => ''
        );
        $args = array(
            'labels' => $labels,
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true,
            'query_var' => true,
            'rewrite' => true,
            'capability_type' => 'post',
            'hierarchical' => false,
            'menu_position' => 8,
            'supports' => array('title','editor','thumbnail')
        ); 
        register_post_type( 'portfolio' , $args );
    }
    add_action('init', 'portfolio_register');
    

    Use the following code (in portfolio-type.php) to register a taxonomy "portfolio_categories" for the post type "portfolio", make it hierarchical (like categories)

    function create_portfolio_taxonomies() {
        $labels = array(
            'name'              => _x( 'Categories', 'taxonomy general name' ),
            'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
            'search_items'      => __( 'Search Categories' ),
            'all_items'         => __( 'All Categories' ),
            'parent_item'       => __( 'Parent Category' ),
            'parent_item_colon' => __( 'Parent Category:' ),
            'edit_item'         => __( 'Edit Category' ),
            'update_item'       => __( 'Update Category' ),
            'add_new_item'      => __( 'Add New Category' ),
            'new_item_name'     => __( 'New Category Name' ),
            'menu_name'         => __( 'Categories' ),
        );
    
        $args = array(
            'hierarchical'      => true, // Set this to 'false' for non-hierarchical taxonomy (like tags)
            'labels'            => $labels,
            'show_ui'           => true,
            'show_admin_column' => true,
            'query_var'         => true,
            'rewrite'           => array( 'slug' => 'categories' ),
        );
    
        register_taxonomy( 'portfolio_categories', array( 'portfolio' ), $args );
    }
    add_action( 'init', 'create_portfolio_taxonomies', 0 );
    

    Then use the following code to retrieve taxonomy terms in template files (like index.php)

    <?php
    
    $taxonomy = 'portfolio_categories';
    $terms = get_terms($taxonomy); // Get all terms of a taxonomy
    
    if ( $terms && !is_wp_error( $terms ) ) :
    ?>
        <ul>
            <?php foreach ( $terms as $term ) { ?>
                <li><a href="<?php echo get_term_link($term->slug, $taxonomy); ?>"><?php echo $term->name; ?></a></li>
            <?php } ?>
        </ul>
    <?php endif;?>
    
    ?>
    

    Let me know if you need any clarification.

    I replaced the code in my portfolio-type.php with the code you provided and I got the categories to show up but they're not filtering the projects for some reason.

    The first two code snippets I provided was for the back-end functionality. The third snippet I provided allows you to retrieve the category names. Let me go through your website again and see what you are missing now.

    Would it be possible for you to post the php code (for the whole portfolio section) you have now?

    I've committed the code here.

    I will start a new thread regarding the categories filtering.

    This might be a better way to load the categories after setting up the custom taxonomy `function displayCategories($post_type_name) { $customPostTaxonomies = get_object_taxonomies($post_type_name); if(count($customPostTaxonomies) > 0) { foreach($customPostTaxonomies as $tax) { $args = array( 'orderby' => 'name', 'show_count' => 1, 'pad_counts' => 0, 'hierarchical' => 1, 'taxonomy' => $tax, 'title_li' => '' ); wp_list_categories( $args ); } } }`

    Should be `$args = array( 'hide_empty' => false, );` `$terms = get_terms($taxonomy, $args)` to see list even when categories do not have posts.

License under CC-BY-SA with attribution


Content dated before 6/26/2020 9:53 AM