近期在开发 前端会员中心插件:ExiangUC 遇到了这个问题,在 WordPress 主题中我们只需要在头部声明就可以很容易地,但在插件里这个方法是无效的。在百度了一番无果后,翻了个墙,终于在国外的大牛手里找到了方法。现在将完整代码分享给大家,具体代码解说到原文中查看(英语渣就不翻译了)。



class PageTemplater {
     //A Unique Identifier
     protected $plugin_slug;
	 //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.
          add_filter('page_attributes_dropdown_pages_args', array(
          // Add a filter to the save post to inject out template into the page cache
          add_filter('wp_insert_post_data', array(
          // 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(
          // Add your templates to this array.
          $this->templates = array(
               'user-center-page.php' => 'EUC:用户中心页面',
			   'Test.php' => 'Test'
      * 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) {
          global $post;
          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;
add_action('plugins_loaded', array(


代码来自 WPEXPLORER ,地址:www.wpexplorer.com/wordpress-page-templates-plugin/