Search code examples
wordpresswordpress-themingcustom-post-type

Wordpress Custom Post Type category used as homepage


I have a Custom Post Type called portfolio and a custom taxonomy portfolio_category that has a term called narrative.

I'm able to access the archive page using the URL /portfolio-category/narrative/.

I want the homepage to display all the items the same as on the narrative archive page without using a redirect.

I've added the following to functions.php

function custom_front_page($wp_query){
    if($wp_query->get('page_id')==get_option('page_on_front')){
        $wp_query->set('post_type','portfolio');
        $wp_query->set('page_id',''); // empty
        // fix conditional functions
        $wp_query->is_page = false;
        $wp_query->is_archive = true;
        $wp_query->is_post_type_archive = true;
    }
}
add_action('pre_get_posts','custom_front_page');

This is displaying all of the portfolio items on my homepage, but I would like it to be just showing the narrative items.

I've tried this in the php template file, but it isn't working either

<?php
    $custom_query_args = array(
    'post_type'  => 'portfolio',
    'portfolio_category' => 'narrative',
    );

    $custom_query = new WP_Query( $custom_query_args ); 
?>

How can I get just the narrative items for to show on the homepage?


Solution

  • You're on the right lines but you are not searching by custom taxonomy correctly. Searching by custom taxonomy is different than searching by categories.

    If you take a look at the WP_Query documentation for searching by taxomony, you will see that you need to use tax_query to search posts for a custom taxonomy term.

    You can use the code below in the template file you use for your homepage. The comments explain what each part does:

    $args = array(
        'post_type' => 'portfolio',
        'posts_per_page' => 5, // number of results to get, or -1  to get all of them
        'tax_query' => array(  
            array(           // important note, this is an array inside the tax_query arrays
                'taxonomy' => 'portfolio_category', // your custom taxonomy
                'field' => 'slug', // what to search, e.g. slug, term_id, name
                'terms' => 'portfolio' // the term(s) to search for. If you want to search for multiple terms, you can use an array
            )
        )
    )
    
    // do a new query with your arguments
    $portfolio_query = new WP_Query($args);
    
    // if the query returns any results, loop through them and process them as required
    if( $portfolio_query->have_posts() ):
        while ( $portfolio_query->have_posts() ) :
            $portfolio_query->the_post();
            // do stuff with the post here, e.g. display the post...
        endwhile;
    endif;
    
    // IMPORTANT! The custom query will overwrite the $post values that are used in the the_post etc.
    // This restores the the current post in the main query - i.e. your homepage post.
    wp_reset_postdata();