我的答案有点像@allenericr 回答点+一些缓存。
我建议仅当这3个模板在内容上不同,而不仅仅是在方面不同时,才实现这一点,否则CSS+JS解决方案应该是最佳选择。
创建主页模板\'multi-template-page.php\'
仅包含开关按钮和get_template_part
调用以包括3个不同模板文件(名为。my-template-1.php
, my-template-2.php
和my-template-3.php
) 您必须为每个模板编写。
在主模板中输入如下内容:
<?php
/*
Template Name: Multi Template Page
*/
get_header(); ?>
<ul id="template_switches">
<li><a href="#template-1" data-template="1" class="active">Template 1</a></li>
<li><a href="#template-2" data-template="2">Template 2</a></li>
<li><a href="#template-2" data-template="3">Template 3</a></li>
</ul>
<div id="template-target"><?php get_template_part(\'my-template\', \'1\'); ?></div>
<?php get_footer(); ?>
因此,默认情况下,您将激活并显示第一个模板。
然后,在functions.php
将此模板的脚本排入队列:
add_action(\'wp_enqueue_scripts\', \'template_switch_script\');
function template_switch_script() {
if ( is_page_template(\'multi-template-page.php\') ) {
wp_enqueue_script(\'multi-template\', get_template_directory_uri() . \'/js/multi-template.js\', array(\'jquery\'));
$data = array(
\'url\' => admin_url(\'admin-ajax.php\'),
\'id\' => get_queried_object()->ID
);
wp_localize_script(\'multi-template\', \'multiTemplateData\', $data );
}
}
现在必须创建jsvascript文件
multi-template.js
在主题的js子文件夹中:
window.multiTemplateCache = {} // prepare a cache object
jQuery().ready( function($) {
// cache the 1st template on load
window.multiTemplateCache.template_1 = $(\'#template-target\').html();
$(\'#template_switches li a\').click( function(e) {
e.preventDefault();
if ( $(this).hasClass(\'active\') ) return false; // do nothing if click active link
var template = $(this).data(\'template\');
if ( window.multiTemplateCache[\'template_\' + template ] ) { // look in cache
// in cache, just output to page
$(\'#template-target\').html( window.multiTemplateCache[\'template_\' + template] );
} else { // not in cache, retrieve via ajax
// remove current template and put a loading message
$(\'#template-target\').html( \'loading...\' );
// css stuff
$(\'#template_switches li a\').removeClass(\'active\');
$(this).addClass(\'active\');
$.get(
multiTemplateData.url,
{
postId: multiTemplateData.id,
action: \'multi_template_template\',
which: template
},
function( data ) {
// cache the template
window.multiTemplateCache[\'template_\' + template ] = data;
// output the template to page
$(\'#template-target\').html( data );
}
);
} // end if
}); // end on click event
}); // on ready event
此脚本单击其中一个开关链接,检查缓存对象中是否已加载模板,如果已加载,则将其输出。如果没有,则发送一个通过所需模板的ajax请求。
在将内容放入页面之前,它会被缓存,因此每个模板都会触发一次ajax调用。但仅适用于模板2和3,因为加载时缓存了模板1:)
那么,现在在你的function.php
您必须添加ajax操作和相关函数。
add_action(\'wp_ajax_multi_template_template\', \'multi_template_template\');
add_action(\'wp_ajax_nopriv_multi_template_template\', \'multi_template_template\');
function multi_template_template() {
$template = isset($_REQUEST[\'which\']) ? $_REQUEST[\'which\'] : false;
if ( ! $template ) die(\'Sorry, impossible to load content\');
$postid = isset($_REQUEST[\'postId\']) ? $_REQUEST[\'postId\'] : false;
if ( $postid ) {
global $post; // I\'m setting global $post just-in-case the template make use of it
$post = get_post($postid);
}
get_template_part(\'my-template\', $template);
die();
}
您可以改进我的代码,添加
#
功能,即当您指向以下地址时
http://example.com/multi-template-page/#template2
模板2被设置为活动的,并为第一个加载。。。