It’s weird what I don’t notice. In this case, I hadn’t noticed I couldn’t choose a custom post type as the homepage for WordPress. I could certainly make a page template or do some work arounds but I didn’t want to. There is an existing plugin out there called Front Type but I’m really trying to use the fewest possible plugins. Consider it a point of honor? Stupidity? Amusement?
Since I was already using Advanced Custom Fields Pro, I thought I could figure out a path.
I made an ACF options page and made a single post object field that I set to return the ID only. That lets me browse any post type and returns the ID.
The acf/save_post action lets me run the function whenever ACF saves. To keep that under control, I check to see if we’re on the options page by calling WP’s get_current_screen. I also make sure that it’s not already set correctly by comparing my ACF ID value to the get_option(‘page_on_front’) ID value.
//enable you to set the home page to be a custom post type via the ACF options page function dlinq_set_home(){ $screen = get_current_screen(); if ($screen->id === "toplevel_page_dlinq-basics") {//the name of my acf option screen $post_id = get_field('choose_the_homepage', 'option'); if($post_id != get_option('page_on_front')){//already the same? update_option( 'page_on_front', $post_id ); update_option( 'show_on_front', 'page' ); } } } add_action('acf/save_post', 'dlinq_set_home', 20);
Update 1
This path led to the homepage redirecting to the longer URL rather than staying on the base URL. I found a fix for that on good ol’ Stackoverflow.
//from https://wordpress.stackexchange.com/questions/18013/how-do-you-use-a-cpt-as-the-default-home-page/126271#126271 function dlqin_enable_front_page_cpt( $query ){ if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id']) $query->query_vars['post_type'] = array( 'page', 'topic' ); } add_action( 'pre_get_posts', 'dlqin_enable_front_page_cpt' );
Update 2
I then realized that messing with the reading preferences in the normal way had the chance to mess stuff up and I now had some non-standard behavior. That’s a bad move on my part. Solving problems to create problems.
So I went back to find a way to add custom post types to the normal WP front page drop down. I found this from back in 2013 . . . on Stackoverflow and it still works.
function dlinq_add_topics_to_dropdown( $pages ){ $args = array( 'post_type' => 'topic'//add your post type ); $items = get_posts($args); $pages = array_merge($pages, $items); return $pages; } add_filter( 'get_pages', 'dlinq_add_topics_to_dropdown' ); function dlinq_enable_front_page_topics( $query ){ if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id']) $query->query_vars['post_type'] = array( 'page', 'topic' );//add your post type here } add_action( 'pre_get_posts', 'dlinq_enable_front_page_topics' );
Now the real question is whether any of this work was sensible.