title: Create template for custom post types in Wordpress
body: <p>I know how to create a custom template for a specific page. However I would like to create a template for a specific custom post type. Is that possible and if true how can I do that?</p>
  
  <p>If I create a new template it will show in admin only when I'm adding a page, but when I'm adding a new post type I don't have the option to select a certain template.</p>
  
  <p>Problem resolved:</p>
  
  <pre><code>/* 
  Show the list of available custom templates templates in the Custom Post Type admin section
  */
  
  /**
   * Post_type
   */
  define( 'MY_THEME_POST_TYPE', 'cases' );
  /**
   * Load the page template for any post object
   * having the appropriate meta key set.
   */
  add_action( 'template_redirect', 'mytheme_template_redirect' );
  function mytheme_template_redirect() {
      global $wp_query;
      $id = (int) $wp_query-&gt;get_queried_object_id();
      $template = get_post_meta( $id, '_wp_page_template', true );
      if ( $template &amp;&amp; 'default' !== $template ) {
          $file = STYLESHEETPATH . '/' . $template;
          if( is_file( $file ) ) {
              require_once $file;
              exit;
          }
      }
  
  }
  /**
   * Process the Meta Box
   * @todo Permissions check.
   * @todo Filter input.
   * @todo Nonces.
   */
  add_action( 'save_post', 'mytheme_process_resource_template' );
  function mytheme_process_resource_template() {
      global $post;
  
      /* Sanitize $_POST array. */
      $clean_id = ( isset( $_POST['ID'] ) ) ? intval( $_POST['ID'] ) : 0;
  
      if ( !empty( $_POST['page_template'] ) &amp;&amp; MY_THEME_POST_TYPE == $post-&gt;post_type ) {
          $page_templates = get_page_templates();
          if ( 'default' != $page_template &amp;&amp; !in_array( $_POST['page_template'], $page_templates ) ) {
              if ( $wp_error )
                  return new WP_Error('invalid_page_template', __('The page template is invalid.'));
              else
                  return 0;
          }
          update_post_meta( $clean_id, '_wp_page_template',  $_POST['page_template'] );
      }
  }
  /**
   * Registers the Meta Box
   * @uses mytheme_page_attributes_meta_box()
   */
  add_action( 'admin_init', 'mytheme_register_meta_boxes', 10 );
  function mytheme_register_meta_boxes()  {
      add_meta_box(
          'mytheme_post_type_template',
          'Template',
          'mytheme_page_attributes_meta_box',
          MY_THEME_POST_TYPE,
          'side',
          'low'
          );
  }
  /**
   * Creates the Meta Box
   */
  function mytheme_page_attributes_meta_box() {
      global $post;
      $post_type_object = get_post_type_object($post-&gt;post_type);    
      if ( 0 != count( get_page_templates() ) ) {
          $template = get_post_meta( $post-&gt;ID, '_wp_page_template',  true );
          ?&gt;
  &lt;p&gt;&lt;strong&gt;&lt;?php _e('Template') ?&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;label class="screen-reader-text" for="page_template"&gt;&lt;?php _e('Page Template') ?&gt;&lt;/label&gt;&lt;select name="page_template" id="page_template"&gt;
  &lt;option value='default'&gt;&lt;?php _e('Default Template'); ?&gt;&lt;/option&gt;
  &lt;?php page_template_dropdown( $template ); ?&gt;
  &lt;/select&gt;
  &lt;?php
      }
  }
  </code></pre>