WordPress不同分类使用不同的single.php文章模板

本文由清尘发表于2020-04-16 13:56最后修改于2020-06-11属于WordPress分类

相关文章:WordPress不同分类列表采用不同模板

方法一:根据模板文件名进行判断

修改当前主题的 functions.php 文件增加以下代码:

// 不同分类使用不同的文章模板
// 定义模板目录为主题目录下的singleTemp文件夹
define(SINGLE_PATH, TEMPLATEPATH . '/singleTemp');
function ips_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(TEMPLATEPATH . '/single.php')){
            return TEMPLATEPATH . '/single.php';
        }
    endforeach;
}
add_filter('single_template', 'ips_single_template');

高版本的php,比如php7.4 需要把变量SINGLE_PATH加上双引号,不然会报错:Warning: Use of undefined constant SINGLE_PATH – assumed ‘SINGLE_PATH’ (this will throw an Error in a future version of PHP)

// 不同分类使用不同的文章模板
// 定义模板目录为主题目录下的singleTemp文件夹
define("SINGLE_PATH", TEMPLATEPATH . '/singleTemp');
function ips_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(TEMPLATEPATH . '/single.php')){
            return TEMPLATEPATH . '/single.php';
        }
    endforeach;
}
add_filter('single_template', 'ips_single_template');

在当前主题的根目录创建一个名为 singleTemp 的文件夹,然后根据不同分类创建不同的文件,命名格式为 single-cat-[分类别名或ID].php。 如没有创建单独的分类文章模板文件则默认使用主题根目录下的single.php模板

方法二:使用 in_category() 进行判断

in_category() 函数可以通过分类别名或ID判断当前文章所属的分类,而且可以直接在循环(Loop)内部和外部使用。

如果是单个分类 ID ,比如ID 为 2 ,可以这样写

in_category(2)

如果是单个分类别名,比如别名为 themes,可以这样写

in_category('themes') 

如果是多个ID,可以这样写

in_category( array( 2,3,7) )

如果是多个别名,可以这样写

 in_category( array( 'themes','plugins','develop') ) 

然后我们结合 if 语句就可以很好地实现模板的选择。比如我们可以在主题的根目录创建3个文章模板文件,分别命名为 single001.php , single002.php 和 single003.php,然后我们希望 ID 为 2 和 3 的分类使用 single001.php,ID为 7 的分类使用 single002.php ,其他分类使用 single003.php,那么,我们可以在 single.php 文件写入下面的代码:

<?php 
if ( in_category(array( 2,3 )) ) {
	get_template_part('single001' );
} elseif ( in_category( 7 )) {
	get_template_part('single002' );
} else {
	get_template_part('single003' );
}
?>