Answers:
get_page_template()
可以通过page_template
过滤器覆盖。如果您的插件是一个包含模板作为文件的目录,则只需传递这些文件的名称即可。如果要“即时”创建它们(在管理区域中编辑它们并将它们保存在数据库中?),则可能需要将它们写到缓存目录中并引用它们,或者进入template_redirect
并做一些疯狂的eval()
事情。
一个插件的简单示例,如果满足特定条件,该插件“重定向”到同一插件目录中的文件:
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
if ( is_page( 'my-custom-page-slug' ) ) {
$page_template = dirname( __FILE__ ) . '/custom-page-template.php';
}
return $page_template;
}
覆盖get_page_template()
只是一个快速的技巧。它不允许从“管理”屏幕中选择模板,并且页面标签已硬编码到插件中,因此用户无法知道模板的来源。
首选的解决方案是遵循本教程,该教程使您可以从插件在后端注册页面模板。然后,它就像其他模板一样工作。
/*
* 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(
'goodtobebad-template.php' => 'It\'s Good to Be Bad',
);
}
对的,这是可能的。我发现这个示例插件非常有帮助。
我想到的另一种方法是使用WP Filesystem API创建主题模板文件。我不确定这是否是最好的方法,但是我确定它会起作用!
以前的答案都没有为我工作。在这里您可以在Wordpress管理员中选择模板。只需将其放在您的主要php插件文件中,然后template-configurator.php
按模板名称更改即可
//Load template from specific page
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){
if ( get_page_template_slug() == 'template-configurator.php' ) {
$page_template = dirname( __FILE__ ) . '/template-configurator.php';
}
return $page_template;
}
/**
* Add "Custom" template to page attirbute template section.
*/
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {
// Add custom template named template-custom.php to select dropdown
$post_templates['template-configurator.php'] = __('Configurator');
return $post_templates;
}