我使用 UnderStrap 构建了一个自定义 WordPress 主题。我的网站使用存档页面来显示所有类别/子类别的内容。结构就像
父类别 > 子类别
我的存档页面的 URL 结构是 www.example.com/category/parent-category/subcategory。这工作正常,但现在的问题是,如果我使用以下 URL,它仍然会加载子类别内容
www.example.com/category/subcategory www.example.com/category/any-string/subcategory
有办法阻止它并开始显示 404 错误吗?
我尝试过“redirect_canonical”过滤器,但它根本没有帮助。
你必须做几件事才能实现你想要的。
function theme_custom_rewrites() {
add_rewrite_tag("%parent_category_name%", "([a-z0-9\-_]+)");
add_rewrite_rule('^category/([a-z0-9\-_]+)/([a-z0-9\-_]+)/?', 'index.php?parent_category_name=$matches[1]&category_name=$matches[2]', 'top');
add_rewrite_rule('^category/([a-z0-9\-_]+)/?', 'index.php?category_name=$matches[1]', 'top');
}
add_action('init', 'theme_custom_rewrites');
function load_404_page_for_subcategory_pages() {
global $wp_query;
$category_slug = get_query_var('category_name');
$parent_category_slug = get_query_var('parent_category_name');
$parent_category = get_category_by_slug($parent_category_slug);
$category = get_category_by_slug($category_slug);
if( !$parent_category && $category->parent != 0) {
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
}
}
add_action('wp', 'load_404_page_for_subcategory_pages');
将两个钩子添加到functions.php文件中,然后转到后端的设置页面并保存永久链接。应该可以。
function getParentsLink($category)
{
$parent_category = get_category($category->category_parent);
if ($parent_category->category_parent == 0) {
return $parent_category->slug . '/' . $category->slug;
} else {
return getParentsLink($parent_category) . '/' . $category->slug;
}
}
function redirect_to_correct_link()
{
$category_slug = get_query_var('category_name');
if ($category_slug != '') {
$category = get_category_by_slug($category_slug);
$parent_category = getParentsLink($category);
$redirect = "/category/$parent_category/";
global $wp;
$linkToCheck = "/$wp->request/";
if ($linkToCheck !== $redirect) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: " . $redirect);
exit;
}
}
}
add_action('wp', 'redirect_to_correct_link');