How to set a fall back template for a custom post type in a plugin?

My custom plugin creates a custom post type, and I want to theme my own "single-my_custom_cpt.php" file. However, I want to store it in my plugin folder, and allow that it be over-written in the websites’ active theme folder.

For example, single-my_custom_cpt.php exists in /plugins/my-plugin/ folder, and someone creates /themes/site-theme/single-my_custom_cpt.php. I want the theme file to come up first, and if it’s deleted, the plugin file to come up.

Related posts

Leave a Reply

1 comment

  1. To provide a default template that can be overwritten by a theme hook into template_include like the linked questions suggest. You get the template WordPress wants to use as a parameter. If that is not the file you want – replace it with your plugin’s file:

    add_filter( 'template_include', 'wpse_57232_render_cpt', 100 );
    
    /**
     * Provide fall back template file for a custom post type single view.
     *
     * @return void
     */
    function wpse_57232_render_cpt( $template )
    {
        // Our custom post type.
        $post_type = 'my_custom_cpt';
    
        // WordPress has already found the correct template in the theme.
        if ( FALSE !== strpos( $template, "/single-$post_type.php" ) )
        {
            // return the template in theme  
            return $template;
        }
    
        // Send our plugin file.
        if ( is_singular() && $post_type === get_post_type( $GLOBALS['post'] ) )
        {
            // return plugin file
            return dirname( __FILE__ ) . "/single-$post_type.php";
        }
    
        // Not our post type single view.
        return $template;
    }