下列的this answer, 我最近更改了一个名为“文学”的自定义帖子类型的permalink结构,以包含分类术语:
旧结构:mysite.com/literature/books/post_name
新结构:mysite.com/literature/fiction/post_name
然而,当访问原始的permalink时,Wordpress不会自动重定向它,两个页面在Google搜索中显示为单独的条目。
我应该重新定位旧文学吗?如果是这样,最好的方法是什么?
更新
谢谢Brian,我已经对您的代码进行了如下修改,现在一切正常:
add_action(\'parse_request\', \'redirect_books_to_fiction\', 0);
function redirect_books_to_fiction(){
global $wp;
if(preg_match(\'/literature\\/books/\', $wp->request)){
$redirect = get_bloginfo(\'siteurl\').\'/\'.str_replace(\'books\', get_the_term_list( $ID, \'literature_category\', \'\', \' / \', \'\' ), $wp->request);
wp_redirect($redirect, 301);
exit;
}
}
但是,如何重定向
everything 而不仅仅是“书”?
在我的文学永久链接上,我可以在线索中键入任何单词,它不会重定向。
e、 g。mysite.com/literature/any_random_word/post_name
就这样一直保持着。
然而,如果我访问我网站上的其他页面并更改任何通向帖子的线索,它会自动重定向到正确的永久链接。
e、 g.如果我改变:mysite.com/food/recipes/post_name
收件人:mysite.com/a_random_word/another_random_word/post_name
它重定向到正确的永久链接。
我想这是因为我在this answer
Here is the site.
SO网友:Brian Fegter
我同意您需要添加重定向。使用以下函数可以轻松完成此操作。我相信你将不得不调整它,但这是一个很好的概念证明。
add_action(\'parse_request\', \'redirect_books_to_fiction\', 0);
function redirect_books_to_fiction(){
global $wp;
if(preg_match_all(\'~literature\\/(.+)/(.+)?~\', $wp->request, $matches)){
$redirect = get_bloginfo(\'siteurl\').\'/\'.str_replace(\'books\', \'fiction\', $wp->request);
wp_redirect($redirect, 301);
exit;
}
}
要进一步回答有关匹配分段的问题,请执行以下操作:
add_action(\'parse_request\', \'redirect_cpts\', 0);
function redirect_cpts(){
$one_to_one = array(
\'literature\' => \'books\',
\'food\' => \'foo\',
\'bar\' => \'food\'
);
$request = $_SERVER[\'REQUEST_URI\'];
//We limit the scope of the regex to our specified CPTs so we don\'t hammer every request
if(preg_match_all(\'~(literature|food|bar)/(.+)/(.+)?~\', $request, $matches)){
if(!$one_to_one[$matches[1][0]])
return;
$post_type = $one_to_one[$matches[1][0]]; //Do proper escaping
$post_name = $matches[3][0]; //Do proper escaping
if($post_name && $post_type){
global $wpdb;
$post = $wpdb->get_row("SELECT * ID FROM $wpdb->posts WHERE post_type = \'$post_type\' AND post_name = \'$post_name\'");
$redirect = get_permalink($post);
if($redirect){
wp_redirect($redirect, 301);
exit;
}
}
}
}