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

实现
在第37行加入自定义的页面模板。
//定义页面模板
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(
$this,
'register_project_templates'
));
// 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(
//此处添加页面模板,可多个
'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(
'PageTemplater',
'get_instance'
));
此方法定义的页面模板使用上和主题定义的没什么区别。

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


最新评论