WordPress从文件头读取模板,然后在缓存中设置它们。使用wp_cache_set()
nad从md5 has的样式表文件夹派生的键。
因此,只要覆盖该缓存,我们就可以显示所需的模板。要覆盖该缓存,我们需要调用wp_cache_set()
再次使用相同的键。
首先,让我们编写一个函数来检索要显示的模板。我们可以通过多种方式设置模板:选项、配置文件、过滤器或它们的组合:
function get_custom_page_templates() {
$templates = array();
// maybe by options? --> $templates = get_option( \'custom_page_templates\' );
// maybe by conf file? --> $templates = include \'custom_page_templates.php\';
return apply_filters( \'custom_page_templates\', $templates );
}
之后,我们需要在WordPress保存缓存之后检索页面编辑中的模板。此外,我们需要在发布编辑表单以允许保存时再次获取它们。
我们可以使用\'edit_form_after_editor\'
第一个范围的挂钩,\'load-post.php\'
和\'load-post.new\'
对于第二个:
add_action( \'edit_form_after_editor\', \'custom_page_templates_init\' );
add_action( \'load-post.php\', \'custom_page_templates_init_post\' );
add_action( \'load-post-new.php\', \'custom_page_templates_init_post\' );
function custom_page_templates_init() {
remove_action( current_filter(), __FUNCTION__ );
if ( is_admin() && get_current_screen()->post_type === \'page\' ) {
$templates = get_custom_page_templates(); // the function above
if ( ! empty( $templates ) ) {
set_custom_page_templates( $templates );
}
}
}
function custom_page_templates_init_post() {
remove_action( current_filter(), __FUNCTION__ );
$method = filter_input( INPUT_SERVER, \'REQUEST_METHOD\', FILTER_SANITIZE_STRING );
if ( empty( $method ) || strtoupper( $method ) !== \'POST\' ) return;
if ( get_current_screen()->post_type === \'page\' ) {
custom_page_templates_init();
}
}
我们必须做的最后一件事是
set_custom_page_templates()
编辑缓存以包含模板的函数,确保合并由文件头定义的任何模板:
function set_custom_page_templates( $templates = array() ) {
if ( ! is_array( $templates ) || empty( $templates ) ) return;
$core = array_flip( (array) get_page_templates() ); // templates defined by file
$data = array_filter( array_merge( $core, $templates ) );
ksort( $data );
$stylesheet = get_stylesheet();
$hash = md5( get_theme_root( $stylesheet ) . \'/\' . $stylesheet );
$persistently = apply_filters( \'wp_cache_themes_persistently\', false, \'WP_Theme\' );
$exp = is_int( $persistently ) ? $persistently : 1800;
wp_cache_set( \'page_templates-\' . $hash, $data, \'themes\', $exp );
}
运行此代码后,只需使用中使用的方法即可设置自定义模板
get_custom_page_templates()
函数,这里我使用过滤器:
add_filter( \'custom_page_templates\', function( $now_templates ) {
$templates = array(
\'some-custom-page-template\' => \'Some Custom Page Template\',
\'another-custom-page-template\' => \'Another Custom Page Template\' ,
);
return array_merge( $now_templates, $templates );
} );
你就完了。