首先:这根本不是网站的行为方式。标准是在根URL上有某种主页/
.
现在WordPress是可定制的,我可以实现你想要的-至少在大多数方面。
// used to generate the link
add_filter(\'page_link\', \'WPSE_1805_page_link\', 10, 3);
function WPSE_1805_page_link($link, $post_id, $sample) {
// if link for any page other than home was requested, return early
if ($link !== home_url(\'/\'))
return $link;
// otherwise, return page link with slug
return _get_page_link($post_id);
}
// don\'t redirect /slug to / for homepage
add_filter(\'redirect_canonical\', \'WPSE_1805_redirect_canonical\', 10, 2);
function WPSE_1805_redirect_canonical($redirect_url, $requested_url) {
$home = get_page_link(get_option(\'page_on_front\'));
// if home was requested, return requested URL
if ($requested_url === $home)
return $requested_url;
return $redirect_url;
}
最必要的功能包括
wp-includes/link-template.php 我在那里找到了这些钩子。
page_link
是必要的,所以/foo
不会被重写为/
仅仅因为它是首页(当创建/获取页面链接时,例如通过get_permalink()
).
redirect_canonical
你需要,所以当一个来访者/foo
, 它们不会重定向到/
.
有了这个,访客仍然可以/
并将看到所选静态首页的内容(尽管规范链接将设置为/foo
, 因此搜索引擎应该列出该链接)。
要禁用此功能,或者更好地说重定向访问者,可以使用以下命令
add_action(\'template_redirect\', \'WPSE_1805_template_redirect\');
function WPSE_1805_template_redirect() {
global $wp;
// get requested URL
$current_url = home_url( $wp->request );
// if requested URL is root or root with ending slash
if ($current_url === home_url(\'\') || $current_url === home_url(\'/\')) {
wp_redirect( get_page_link(get_option(\'page_on_front\')), 301 );
exit;
}
}
即使这样,你仍然可以链接到
/
, 只是因为主题作者可能使用
home_url(\'/\')
在他们的代码中。您可以过滤它,但我的其他代码需要重写,因为它也使用此函数。