WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am creating a Custom Post Type using a custom plugin. One of the requirement of the custom post type is to be presented in a table layout for print / email purpose.

It seems that the logical solution for this situation is to include a specific template file in the plugin which will be used on single Custom Post Type query instead of the single.php / index.php provided in the theme.

How can I use a file in my plugin as a replacement for single.php / index.php on single custom-post-type query?

Thank you in advance.

share|improve this question
up vote 3 down vote accepted

The way I handle these is to store to use template_include to conditionally pass my plug-in template. One of these conditions is that the corresponding file hasn't already been found by WordPress (i.e. isn't present in the theme folder).

This means that users can over-ride the plug-in template with a theme-specific one by simply creating the appropriate template in their theme. As such they can make alterations and not worry about plug-in updates:

The following uses single-event.php instead of single.php when viewing a single post of 'event' post type.

 * Checks to see if appropriate templates are present in active template directory.
 * Otherwises uses templates present in plugin's template directory.
add_filter('template_include', 'wpse72544_set_template');
function wpse72544_set_template( $template ){

     * Optional: Have a plug-in option to disable template handling
     * if( get_option('wpse72544_disable_template_handling') )
     *     return $template;

    if(is_singular('event') && 'single-event.php' != $template ){
        //WordPress couldn't find an 'event' template. Use plug-in instead:
        $template = 'absolute/path/to/plugin/template/single-event.php';

    return $template;

Note that all the main query conditionals (is_* functions) are available to you at this point.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.