WordPress钩子:template_include 为WordPress模板树添加新节点

追格官方小助手/ 2023年02月22日/ WordPress/ 浏览 2005

在 WordPress 主题中,理论上可以通过自定义文章类型,来解决绝大部分需求。因此,也会出现 “文章” 的属性非常复杂的情况。这时候 WordPress 原本的模板树往往显得力不从心。


WordPress主题模板路由


如何为 WordPress 主题添加新的模板文件呢?


WordPress钩子 template_include ,这个过滤器钩子在WordPress包含预定模板文件之前立即执行。这可以用来覆盖WordPress的默认模板行为。


$template = apply_filters( 'template_include', $template );


触发时机,在包含当前模板之前过滤当前模板的路径。


举例一、


add_filter( 'template_include', 'portfolio_page_template', 99 );
function portfolio_page_template( $template ) {
    if ( is_page( 'portfolio' )  ) {
        $new_template = locate_template( array( 'portfolio-page-template.php' ) );
	if ( '' != $new_template ) {
	    return $new_template ;
	}
    }
    return $template;
}


这个例子中为页面:portfolio 指定了新的模板文件。这属于修改默认模板行为。但是这个例子,貌似直接建立模板文件:page-portfolio.php ,也可以解决相同的问题。


举例二、


/**
* multiple custom routing with one page
*/
add_filter( 'template_include', 'wpdocs_include_template_files_on_page' );

function wpdocs_include_template_files_on_page( $template ) {

	$action = isset( $_GET['action'] ) ? $_GET['action'] : 'list';

	switch ( $action ) {

		case 'add-list' :
			$template = __DIR__ . 'views/address-new.php';
			break;

		case 'edit-list' :
			$template = __DIR__ . 'views/address-edit.php';
			break;

		case 'view-list' :
			$template = __DIR__ . 'views/address-view.php';
			break;

		default :
			$template = __DIR__ . 'views/address-list.php';
			break;			
	}

	return $template;
}


这个例子中,根据 $action 参数,包含不同的模板。但这个例子中,这些功能也完全可以在一个页面中通过判断 $action ,继而 include 不同的模板来实现。貌似仍未体现出 include_template 的特殊之处。


举例三、


例子三,可以参见:《WordPress 中使用 add_rewrite_rule 添加自定义重写规则完整示例》


这个例子中,是添加了一个全新的路由及全新的模板文件。这是其他 WordPress 功能难以完成的。


发表评论

暂无评论,抢个沙发...

客服 工单