在过去的几个小时里,我一直在寻找一种从插件中创建自定义页面模板的方法,但还没有找到任何运气。
我特别想做的是在编辑页面时向可用页面模板列表中添加一个选项,以及not 使用其他方法,如if( is_page( \'page-slug\' ) ) { /* etc */ }
是否可以修改全局变量来执行此操作?
Edit:
根据@m0r7if3r在评论中给我的链接,我目前正在使用此代码,问题是它在查看页面时会运行此功能,但在编辑页面时不会运行此功能(用页面模板填充下拉列表):
class JW_SiteGrader {
private static $instance;
private function __construct() {
add_action( \'template_redirect\', array( &$this, \'sitegrader_template_redirect\' ), 20 );
}
public static function getInstance() {
// Return the class data in a Singleton fashion
if (self::$instance == null)
self::$instance = new JW_SiteGrader();
return self::$instance;
}
public function sitegrader_template_redirect() {
add_filter( \'page_template\', array( &$this, \'sitegrader_page_template\' ), 10, 1 );
}
public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {
if ( !is_array( $template_names ) )
return \'\';
$located = \'\';
$this_plugin_dir = WP_PLUGIN_DIR . \'/\' . str_replace( basename( __FILE__ ), \'\', plugin_basename( __FILE__ ) );
foreach ( $template_names as $template_name ) {
if ( !$template_name )
continue;
if ( file_exists( STYLESHEETPATH . \'/\' . $template_name ) ) {
$located = STYLESHEETPATH . \'/\' . $template_name;
break;
} else if ( file_exists( TEMPLATEPATH . \'/\' . $template_name ) ) {
$located = TEMPLATEPATH . \'/\' . $template_name;
break;
} else if ( file_exists( $this_plugin_dir . $template_name ) ) {
$located = $this_plugin_dir . $template_name;
break;
}
}
if ( $load && \'\' != $located )
load_template( $located, $require_once );
return $located;
}
public function sitegrader_page_template( $template ) {
$object = get_queried_object();
if ( \'page\' == $object->post_type ) {
// New
$templates[] = "page-sitegrader.php";
// Like in core
$templates[] = "page-{$object->post_type}.php";
$templates[] = "page.php";
return locate_template( $templates );
}
// return apply_filters(\'page_template\', $template);
return $template;
}
}
Edit 2:
这项功能似乎将在未来的更新中发布,我读了不少关于这方面的trac票证,并进行了一些讨论,但没有真正的答案(希望是3.4)。稍后将在此处列出trac票证URL。
Edit 3:
上面的代码可以工作,但是,目前我唯一的问题是,在编辑/添加新页面时,没有将模板添加到下拉列表中。我正在尝试一些事情,并将很快更新我的问题。
最合适的回答,由SO网友:kaiser 整理而成
过滤器?有人吗
那里没有过滤器来帮助:
page_template_dropdown($template);
用于构建下拉列表,它不可筛选。
潜入模板阵列
为了构建下拉列表内容,核心元框使用
get_page_templates()
. 从内部看,函数如下所示:
$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme][\'Template Files\'];
但是当我们调查
get_themes();
那么就不可能截取模板列表。此外,我们还有一个问题,即没有机会从主题目录之外获取模板…
。。。假装主题理论及其缺陷
您可以使用register_theme_directory()
添加一个额外的主题目录,您可以在其中放置模板。因此,最简单的方法是将插件也注册为主题文件夹:
// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).\'templates\' );
注意:这就是我不确定它是否会起作用的地方。
During plugin activation: 那么你应该style.css.php
在您的templates
文件夹这将允许您向文件中添加变量。然后,此变量将成为父主题。父主题应该是当前活动的主题。然后将活动主题更新到插件。
Drawback #2: 关于»外观«UI&hellip也许可以加一条注释,说明这个“主题”并不打算用作实际的主题。我将剩下的部分留给你,避免激活这个主题,让你想象一下。不管怎样,它应该会起作用。
Drawback #2: 这个技巧将成功避免子主题。您可以有一个父主题。没什么了。