How to use a custom post type as front page?

The question:

I would like to set a site’s front page to be a single post from a custom post type. I have been able to alter the request for my front page to a Custom Post Type archive with the following code (originally posted here):

function custom_front_page($wp_query){
        $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;


$wp_query->is_archive = true;
$wp_query->is_post_type_archive = true; 


$wp_query->is_single = true;

calls the single-album.php template as I’d like to, but it still returns ALL the posts in the “Albums” category, instead of only one.



has no effect.

What should I be doing instead?

Bonus question: is there a good reference somewhere about how to manipulate the query this way?

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

Easiest way to display single post on front page would be:

global $wp_query;
$wp_query = new WP_Query( array( 'p' => 'POST ID HERE' ) );
include( 'single-POSTTYPE.php' );

Method 2

I had to do the same for a customer and I have found two resources which helped me:

How do you use a CPT as the default home page?

Method 3

This is the solution that worked for me:

function add_<MYTPE>_to_dropdown( $pages, $r )
    if('page_on_front' == $r['name'])
        $args = array(
            'post_type' => '<MYTYPE>'
        $items = get_posts($args);
        $pages = array_merge($pages, $items);

    return $pages;
add_filter( 'get_pages', 'add_<MYTPE>_to_dropdown' );

function enable_front_page_<MYTPE>( $query )
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', '<MYTPE>' );
add_action( 'pre_get_posts', 'enable_front_page_<MYTPE>' );

Just replace <MYTYPE> with your custom post type machine name

Method 4 seems to be implementing the correct logic in a clean manner.


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

Leave a Comment