tpl_meta_key = 'custom_post_template'; // Init hooks and all that $this->register_plugin ( 'post-templates', __FILE__ ); $this->add_meta_box( 'select_post_template', __('Post Template'), 'select_post_template', 'post', 'side', 'default' ); $this->add_action( 'save_post' ); $this->add_filter( 'single_template', 'filter_single_template' ); } /* * FILTERS & ACTIONS * ******************* */ public function select_post_template( $post ) { $this->post_ID = $post->ID; $template_vars = array(); $template_vars[ 'templates' ] = $this->get_post_templates(); $template_vars[ 'custom_template' ] = $this->get_custom_post_template(); // Render the template $this->render_admin ( 'select_post_template', $template_vars ); } public function save_post( $post_ID ) { $action_needed = (bool) @ $_POST[ 'custom_post_template_present' ]; if ( ! $action_needed ) return; $this->post_ID = $post_ID; $template = (string) @ $_POST[ 'custom_post_template' ]; $this->set_custom_post_template( $template ); } public function filter_single_template( $template ) { global $wp_query; $this->post_ID = $wp_query->post->ID; $template_file = $this->get_custom_post_template(); $custom_template = TEMPLATEPATH . "/" . $template_file; // Check both the template file and the full path, otherwise you discover that the theme dir // exists (which is not surprising) if ( $template_file && file_exists( $custom_template ) ) return $custom_template; return $template; } /* * UTILITY METHODS * ***************** */ protected function set_custom_post_template( $template ) { delete_post_meta( $this->post_ID, $this->tpl_meta_key ); if ( ! $template || $template == 'default' ) return; add_post_meta( $this->post_ID, $this->tpl_meta_key, $template ); } protected function get_custom_post_template() { $custom_template = get_post_meta( $this->post_ID, $this->tpl_meta_key ); // Seems to come out as an array. Irritating. if ( is_array( $custom_template ) ) $custom_template = $custom_template[ 0 ]; return $custom_template; } protected function get_post_templates() { $themes = get_themes(); $theme = get_current_theme(); $templates = $themes[ $theme ][ 'Template Files' ]; $page_templates = array(); if ( is_array( $templates ) ) { foreach ( $templates as $template ) { $template_data = implode( '', file( $template ) ); preg_match( '|Template Name Posts:(.*)$|mi', $template_data, $name ); if ( empty( $name ) ) continue; $name = $name[ 1 ]; $page_templates[ trim( $name ) ] = basename( $template ); } } return $page_templates; } } /** * Instantiate the plugin * * @global **/ $CustomPostTemplates = new CustomPostTemplates(); ?>