我正在为一个客户建立一个网站,他们需要几个不同的部分,如:
Regular Site (/)
- Section 1 (/section_1/)
- Section 2 (/section_2/)
...
- Section X
常规站点将包含所有主要内容,但我希望能够覆盖指定部分中存在的某些页面。
假设用户访问domain.com/section_1/features
. 如果a/section_1/features
页面存在,我想显示它;但是,如果该页面不存在,我希望它显示/features
without 重定向或更改地址栏中的URL。它应该是完全无缝的和幕后的。
我think 我需要向parse_request
hook,类似于:
function check_section_page( &$wp ) {
$requested_path = $wp->request;
if ( ! get_page_by_path($requested_path) ) {
$new_requested_path = preg_replace("/^(.*?)\\//", "", $requested_path);
// do something here to make it read $new_requested_path
}
}
add_filter("parse_request", "check_section_page");
它正确运行该函数,并且回显$new\\u requested\\u path表明它确实具有新的必需页面。我已经为此挣扎了大约2个小时,我的脑袋都快晕过去了。帮助
最合适的回答,由SO网友:Rob Williams 整理而成
我设法解决了这个问题。以下是如何做到这一点,以防其他人需要此解决方案。
**美国东部时间3月10日凌晨3:30更新**
我在这里使用的前一个函数正确显示了页面,但返回了404错误代码。我已经用一个不返回404的工作示例替换了错误的代码示例。
function check_section_page( $posts ) {
if (is_admin()) { return $posts; }
global $wp, $wp_query;
$requested_path = $wp->request;
if ( $requested_path == "" ) { return $posts; }
preg_match("/^([a-z\\-]+)\\//", $requested_path, $matches);
if ( count($matches) > 1 ) {
if ( get_page_by_path( $matches[1] ) ) { $section = $matches[1]; }
}
$wp_query->set("saleslink_section", $section);
$this_page = get_page_by_path( $requested_path );
$new_requested_path = preg_replace("/^(.*?)\\//", "", $requested_path);
$requested_page = get_page_by_path($new_requested_path);
if ( $requested_page->ID and ! $this_page->ID ) {
$posts = NULL;
$posts[] = $requested_page;
$wp_query->is_page = true;
$wp_query->is_singular = true;
$wp_query->is_home = false;
$wp_query->is_archive = false;
$wp_query->is_category = false;
unset($wp_query->query["error"]);
$wp_query->query_vars["error"]="";
$wp_query->is_404=false;
}
return $posts;
}
remove_filter(\'template_redirect\',\'redirect_canonical\');
add_filter("the_posts", "check_section_page");
The
remove_filter
当请求的url不存在而类似的url存在并且重定向到类似的url时,line将关闭Wordpress的自动url猜测重定向行为。