使用add_rewrite_rule为WordPress自定义文章类型添加子页面重定向
问题核心
你的重写规则没生效,是因为WordPress查询系统会优先匹配emplacement自定义文章类型的slug——哪怕你在规则里加了page_id=200,WP还是会先把([^/]+)识别为emplacement的slug,优先加载对应的自定义文章类型内容,直接忽略了page_id参数。
解决步骤
注册自定义查询变量
先给WordPress注册一个自定义变量,用来标记当前是子页面请求,避免和默认查询逻辑冲突:function register_emplacement_subpage_var() { global $wp; $wp->add_query_var('emplacement_subpage'); } add_action('init', 'register_emplacement_subpage_var');修改重写规则
调整规则,用自定义变量标识子页面类型,同时保留emplacement的slug参数,让WP不会直接优先匹配自定义文章类型:function custom_rewrite_rules() { // 匹配landingpage子页面 add_rewrite_rule( '^emplacements/([^/]+)/landingpage/?$', 'index.php?emplacement=$matches[1]&emplacement_subpage=landingpage', 'top' ); // 另外3个子页面可以照此添加,比如: // add_rewrite_rule('^emplacements/([^/]+)/subpage2/?$', 'index.php?emplacement=$matches[1]&emplacement_subpage=subpage2', 'top'); } add_action('init', 'custom_rewrite_rules');强制加载指定Elementor模板
用template_include过滤器,检测到自定义子页面变量时,强制加载ID为200的页面模板:function emplacement_subpage_template($template) { $subpage = get_query_var('emplacement_subpage'); $emplacement = get_query_var('emplacement'); // 确认是emplacement的子页面请求 if ($subpage && $emplacement) { // 获取ID200页面的模板路径 $custom_template = get_page_template_path(200); if ($custom_template) { return $custom_template; } } return $template; } add_filter('template_include', 'emplacement_subpage_template', 99);刷新重写规则
代码添加完成后,进入WP后台「设置→固定链接」页面,直接点击「保存更改」(不用修改任何设置),让新的重写规则生效。
补充说明
如果4个子页面需要不同的Elementor模板,只要修改emplacement_subpage_template函数,根据$subpage的值加载对应ID的页面模板即可。另外要确保ID为200的页面确实存在,且Elementor已为其配置好自定义模板。
内容的提问来源于stack exchange,提问作者Lucien Dubois
相关产品推荐
相关产品推荐

