커스텀 페이지 템플릿을 플러그인으로 제작

플러그인을 이용한 커스텀 페이지 템플릿 제작이 필요한 이유

앞선 강좌에서 자식 테마를 이용한 커스텀 페이지 템플릿 제작을 다루었습니다.
(#3. 테마 적용, 자식 테마 제작, #4. 페이지 제작, 커스텀 테마 적용)

이러한 방식은 간편하다는 장점이 있으나 부모 테마에 의존하므로, 테마 종류를 변경하기가 어렵다는 단점이 있습니다.
테마를 바꾸더라도 커스텀 페이지 템플릿은 바뀌지 않도록 하려면 플러그인을 사용해야 합니다.

워드프레스 플러그인 검색에는 나오지 않아, 구글링을 통해 해당 플러그인을 찾았습니다.

플러그인 소스 링크

GitHub

플러그인 소스

아래 소스를 wp-content/plugins/(플러그인명)/(플러그인명).php 파일에 작성합니다.

<?php
/*
Plugin Name: Page Template Plugin : 'Good To Be Bad'
Plugin URI: http://www.wpexplorer.com/wordpress-page-templates-plugin/
Version: 1.1.0
Author: WPExplorer
Author URI: http://www.wpexplorer.com/
*/
class PageTemplater {
 /**
 * A reference to an instance of this class.
 */
 private static $instance;
 /**
 * The array of templates that this plugin tracks.
 */
 protected $templates;
 /**
 * Returns an instance of this class. 
 */
 public static function get_instance() {
 if ( null == self::$instance ) {
 self::$instance = new PageTemplater();
 } 
 return self::$instance;
 } 
 /**
 * Initializes the plugin by setting filters and administration functions.
 */
 private function __construct() {
 $this->templates = array();
 // Add a filter to the attributes metabox to inject template into the cache.
 if ( version_compare( floatval( get_bloginfo( 'version' ) ), '4.7', '<' ) ) {
 // 4.6 and older
 add_filter(
 'page_attributes_dropdown_pages_args',
 array( $this, 'register_project_templates' )
 );
 } else {
 // Add a filter to the wp 4.7 version attributes metabox
 add_filter(
 'theme_page_templates', array( $this, 'add_new_template' )
 );
 }
 // Add a filter to the save post to inject out template into the page cache
 add_filter(
 'wp_insert_post_data', 
 array( $this, 'register_project_templates' ) 
 );
 // Add a filter to the template include to determine if the page has our 
 // template assigned and return it's path
 add_filter(
 'template_include', 
 array( $this, 'view_project_template') 
 );
 // Add your templates to this array.
 $this->templates = array(
 'goodtobebad-template.php' => 'It\'s Good to Be Bad',
 );
 
 } 
 /**
 * Adds our template to the page dropdown for v4.7+
 *
 */
 public function add_new_template( $posts_templates ) {
 $posts_templates = array_merge( $posts_templates, $this->templates );
 return $posts_templates;
 }
 /**
 * Adds our template to the pages cache in order to trick WordPress
 * into thinking the template file exists where it doens't really exist.
 */
 public function register_project_templates( $atts ) {
 // Create the key used for the themes cache
 $cache_key = 'page_templates-' . md5( get_theme_root() . '/' . get_stylesheet() );
 // Retrieve the cache list. 
 // If it doesn't exist, or it's empty prepare an array
 $templates = wp_get_theme()->get_page_templates();
 if ( empty( $templates ) ) {
 $templates = array();
 } 
 // New cache, therefore remove the old one
 wp_cache_delete( $cache_key , 'themes');
 // Now add our template to the list of templates by merging our templates
 // with the existing templates array from the cache.
 $templates = array_merge( $templates, $this->templates );
 // Add the modified cache to allow WordPress to pick it up for listing
 // available templates
 wp_cache_add( $cache_key, $templates, 'themes', 1800 );
 return $atts;
 } 
 /**
 * Checks if the template is assigned to the page
 */
 public function view_project_template( $template ) {
 // Return the search template if we're searching (instead of the template for the first result)
 if ( is_search() ) {
 return $template;
 }
 
 // Get global post
 global $post;
 // Return template if post is empty
 if ( ! $post ) {
 return $template;
 }
 // Return default template if we don't have a custom one defined
 if ( ! isset( $this->templates[get_post_meta( 
 $post->ID, '_wp_page_template', true 
 )] ) ) {
 return $template;
 } 
 $file = plugin_dir_path( __FILE__ ). get_post_meta( 
 $post->ID, '_wp_page_template', true
 );
 // Just to be safe, we check if the file exist first
 if ( file_exists( $file ) ) {
 return $file;
 } else {
 echo $file;
 }
 // Return template
 return $template;
 }
} 
add_action( 'plugins_loaded', array( 'PageTemplater', 'get_instance' ) );
?>

위 소스의 58번 행을 적절히 수정하고, 커스텀 페이지 템플릿 파일을 wp-content/plugins/(플러그인명)/ 디렉토리 안에 생성합니다.

관리자 페이지 – 플러그인 – Page Template Plugin : ‘Good To Be Bad’ – 활성화를 합니다.
그러면 페이지 편집 화면의 페이지 속성 – 템플릿에서 커스텀 템플릿을 볼 수 있습니다.

관련 포스트