另一种解决方案是,如果您担心稍后会更改页面slug,那么可以使用add_rewrite_endpoint()
, 但这意味着URL需要一个额外的路径,例如。/sector
如中所示example.com/products/imports/sector/filters
.
因此,步骤是相同的,只是不再需要手动挂接query_vars
因为add_rewrite_endpoint()
默认情况下,将自动为您执行此操作:
注册sector
所有页面的端点:
add_action( \'init\', \'my_sector_init\' );
function my_sector_init() {
add_rewrite_endpoint( \'sector\', EP_PAGES );
}
请记住删除
add_action(\'init\', \'sector_rewrite_rule\', 10, 0);
在代码中。。正如我之前说过的,刷新重写规则!:)
加载sector.php
这些自定义端点页面上的模板:
add_filter( \'page_template\', \'my_sector_page_template\' );
function my_sector_page_template( $template ) {
if ( get_query_var( \'sector\' ) ) {
$template = locate_template( \'sector.php\' );
}
return $template;
}
使用时的其他选项add_rewrite_rule()
使用特定的页面段塞或路径,将页面ID存储在变量(或数据库选项,如果需要)中,并将上一个路径存储在post元数据中,并且每当更新页面或其父级时,特别是如果更改段塞,则可以通过编程刷新重写规则。
因此,根据我最初的回答,在步骤1中,我们将调用flush_rewrite_rules()
only if applicable:
function sector_rewrite_rule() {
$page_id = 123;
// Ensure that the post exists.
if ( ! get_post( $page_id ) ) {
return;
}
$post_ancestors = get_post_ancestors( $page_id );
$previous_slug = get_post_meta( $page_id, \'_prev_path\', true );
// Build the hierarchical path.
$post_ancestors[] = $page_id;
$current_slug = implode( \'/\', array_map( function ( $id ) {
return get_post_field( \'post_name\', $id );
}, $post_ancestors ) );
add_rewrite_rule(
\'^\' . preg_quote( $current_slug ) . \'/([^/]+)/?$\',
\'index.php?page_id=\' . $page_id . \'§or=$matches[1]\',
\'top\'
);
global $pagenow; // this is defined on admin pages
if ( \'options-permalink.php\' !== $pagenow && $current_slug !== $previous_slug ) {
update_post_meta( $page_id, \'_prev_path\', $current_slug );
flush_rewrite_rules();
}
}
步骤2保持不变,但步骤3将保持不变(注意
$page_id
):
add_filter( \'page_template\', \'my_sector_page_template\' );
function my_sector_page_template( $template ) {
$page_id = 123;
if ( is_page( $page_id ) && get_query_var( \'sector\' ) ) {
$template = locate_template( \'sector.php\' );
}
return $template;
}
因此,您可以尝试这些,只需替换
$page_id
使用正确的ID。