用wordpress做网站时经常会需要子分类使用父分类模板,子分类文章页使用父分类文章页模板,不同分类使对应分类模板,或者多个分类共用一个模板,多个单页共用一个模板或者不同单页使用不同的模板,又或者让文章页和分类页一样,可以根据分类别名自动识别对应的文章模板。
虽然wordpress给了我们默认模板文件,但现实使用中却是远远无法满足我们的使用要求的!那么如何实现上面的提到的模板对应方法呢?具体方法如下!
1、wordpress分类栏目指定自定义模板
a、category.php 默认分类模板
b、category-别名.php
分类别名实现不同分类使用不同模板,后台分类目录名称后有一个别名 ,系统会根据分类别名自动调用对应的模板(例:category-news.php )
c、category-id.php
分类id实现自定义模板 系统会根据分类id 自动获取与之对应的模板 。如果没有对应模板会调用默认模板 (例:category-2.php )
d、子分类页面使用父分类模板 ,在function.php中添加如下代码(例:新闻中:行业新闻,公司新闻公共一个模板)结合上面的 b方法 或者c方法 使用
add_filter('category_template', 'f_category_template');
function f_category_template($template){
$category = get_queried_object();
if($category->parent !='0'){
while($category->parent !='0'){
$category = get_category($category->parent);
}
}
$templates = array();
if ( $category ) {
$templates[] = "category-{$category->slug}.php";
$templates[] = "category-{$category->term_id}.php";
}
$templates[] = 'category.php';
return locate_template( $templates );
}
2、wordpress多个分类共用一个模板与不同分类使用不同模板
根据分类别名或id判断实现,在默认分类文件category.php顶部添加如下代码
//如果分类别名为solution就调用category-case.php模板
<?php
if ( is_category('solution') ) {
include(TEMPLATEPATH . '/category-case.php');
}
?>
//如果默认模板本来就有内容会同时输出category-case.php与默认模板的内容 解决方法如下
<?php
if ( is_category('solution') ) {
include(TEMPLATEPATH . '/category-cases.php');
}else{
?>
默认模板的内容
<? } ?>
page.php 默认单页模板
page-about.php 根据单页别名判断不同单页使用不同模板 (例:关于我们,单页别名:about)
page-id.php 根据id 联系我们模板 (联系单页别名:contact)
3、多个单页使用同一个模板与不同单页使用不同模板
把我们自定义的单页模板顶部加如下代码, 之后我们可以在后台单页编辑的右侧,模板一栏选择我们的自定义单页模板了(任何单页都可以选择该模板了)
<?php /* Template Name: 关于我们模板 */ ?>
4、不同分类下的文章使用不同的文章页模板,多分类下文章使用同一文章页模板
4.1、根据分类别名判断在默认文章内容页模板single.php 添加如下代码
<?php
//多个分类别名共用一个模板
if (in_category(array('themes','plugins','develop') ) ) {
get_template_part('single-product' );
//不同分类名使用不同模板
}elseif ( in_category('themes')) {
get_template_part('single-case' );
//其他调用默认模板
}else {
get_template_part('single-default' );
}
?>
如果有子分类使用下面方法:子分类文章使用父分类文章模板
<?
//获取该文章父分类id
$typeid=(get_the_category())[0]->category_parent;
//获取该文章父分类数据
$category = get_category($typeid);
//该文章父分类别名
$category = $category->slug;
//如果分类别名,或者父分类别名是product就选择single-product.php模板
if (in_category(array('product')|| $category == "product" ) ) {
get_template_part('single-product' );
//如果分类别名是news就选择single-news.php模板
}elseif ( in_category('news')) {
get_template_part('single-news' );
}else {
//其他文章调用默认模板
get_template_part('single-default' );
}
?>
4.2、根据分类ID判断在默认文章内容页模板single.php 添加如下代码 (方法和上面一样,只是把分类别名改为了id)
//根据分类id判断
<?php
if ( in_category(array( 2,3 )) ) {//多个分类id
get_template_part('single-product' );
}elseif ( in_category( 7 )) {//单个分类id
get_template_part('single-case' );
}else {//其他调用默认模板
get_template_part('single-default' );
}
?>
如果有子分类使用下面方法:子分类文章使用父分类文章页模板
<?php
//获取父分类id
$typeid=get_the_category();
$typeid=$typeid[0]->category_parent;
if ( in_category(array(1)) || $typeid==1 ){
get_template_part('single-product');
}elseif ( in_category(3) || $typeid==3){
get_template_part('single-news' );
}else {
get_template_part('single-news' );
}
?>
4.3、让文章页和分类页一样,可以根据分类别名自动识别对应的模板(分类别名为 new 内容页会自动使用 content-new.php 做为文章页模板)
<?
$cat=get_the_category(get_the_id());
$name=$cat[0]->slug;
//自动识别文章页别名 content-别名.php
//如果没有对应的就调用content.php
get_template_part( 'content', $name );
?>
5、文章根据文章别名调用不同的模板
将下面的代码添加到当前主题的 functions.php 文件
/**
* 不同分类使用不同的文章模板
*
*/
//定义模板文件所在目录为 single 文件夹
define("SINGLE_PATH", TEMPLATEPATH . '/single');
//自动选择模板的函数
function wpdaxue_single_template($single) {
global $wp_query, $post;
//通过分类别名或ID选择模板文件
foreach((array)get_the_category() as $cat) :
if(file_exists(SINGLE_PATH . '/single-cat-' . $cat->slug . '.php')) {
return SINGLE_PATH . '/single-cat-' . $cat->slug . '.php';
}elseif(file_exists(SINGLE_PATH . '/single-cat-' . $cat->term_id . '.php')){
return SINGLE_PATH . '/single-cat-' . $cat->term_id . '.php';
}elseif(file_exists(SINGLE_PATH . '/single.php')){
return SINGLE_PATH . '/single.php';
}
endforeach;
}
//通过 single_template 钩子挂载函数
add_filter('single_template', 'wpdaxue_single_template');