我有一个名为“客户”的自定义帖子类型,它只是一群个人客户。这些页面是通过其帖子类型结构访问的:
例如。 /客户/姓名-1
这一切都正常工作,并为此帖子类型加载正确的模板(single-customer.php)
现在我需要扩展它并构建将存在于新模板中的新功能。但是,我不想创建新页面,而是利用保存数据的单个客户页面。
例如。 /客户/姓名-1/工作计划
加载任何 /customer/customer-name/workplan 时,它应该:
我已经研究了 add_rewrite_rule 和 add_rewrite_endpoint 但没有得到我想要的(尝试过这个,但不认为它对于这个用例来说是正确的)
function workstreams_rewrite_rules() {
add_rewrite_rule(
'^customer/(.*)/?$',
'index.php?post_type=customer&name=$matches[1]',
'top'
);
} add_action( 'init', 'workstreams_rewrite_rules', 10, 0 );
有人输入了我应该探索的正确设置和重写吗?感谢您的阅读!
使用
add_rewrite_rule()
可能可以实现此目的,但我更喜欢并推荐看似被遗忘的 add_rewrite_endpoint()
函数。
测试:
// Register the endpoint.
add_action( 'init', static function () {
add_rewrite_endpoint( 'workplan', EP_ALL, 'customer_workplan' );
} );
// Register the query var, and if it's present, set it's value to true.
add_filter( 'request', static function ( $vars ) {
if ( isset( $vars['customer_workplan'] ) ) {
$vars['customer_workplan'] = true;
}
return $vars;
} );
// If request is for a customer's work plan, use the template.
add_filter( 'template_include', static function ( $template ) {
if ( ! is_singular( 'customer' ) ) {
return $template;
}
if ( ! get_query_var( 'customer_workplan' ) ) {
return $template;
}
return 'template-customer-workplan.php';
} );
single_template_hierarchy
过滤器:
add_filter( 'single_template_hierarchy', static function ( $templates ) {
if ( ! is_singular( 'customer' ) ) {
return $templates;
}
if ( ! get_query_var( 'customer_workplan' ) ) {
return $templates;
}
$new_templates = array();
foreach ( $templates as $template ) {
if ( ! str_contains( $template, '-customer' ) ) {
$new_templates[] = $template;
continue;
}
$new_templates[] = str_replace( '.php', '-workplan.php', $template );
}
return $new_templates;
} );