WordPress不同的分类_单页_文章页指定自定义不同的模板

用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');
QR:WordPress不同的分类_单页_文章页指定自定义不同的模板