我制作了从特定脚本到wordpress的迁移插件,但在将旧URL重定向到新URL时遇到了问题
旧URL类似book.php?view=12a34b56
我想把它重定向到book/12a34b56
我试着通过这样的add\\u rewrite\\u规则
init function >
add_rewrite_rule(
\'^book.php\\?view=([^&]*)&?\',
\'index.php?name=$matches[1]\',
\'top\'
);
但是重写规则不检测查询参数我不知道为什么,所以我将方法改为
query_vars function >
array_push($vars, \'view\');
pre_get_posts function >
if (!is_admin() && is_main_query() && get_query_var(\'pagename\') === \'book.php\' && get_query_var(\'view\') != \'\') {
$query->set(\'name\', get_query_var(\'view\'));
// after redirect to new url, view arg not removed
// new url be like this book/12a34b56/?view=12a34b56
// i try to remove view arg in url after set query but it\'s still not removed
$query->set(\'view\', false);
set_query_var(\'view\', false);
unset($_GET[\'view\']);
}
这个方法工作得很好,但我仍然有一个问题,就像我在代码注释中所说的新url一样
book/12a34b56/?view=12a34b56
,如何删除
?view=12a34b56
设置帖子名称后,或者在add_rewrite_规则上检测查询参数的方法将非常好。
NOTE : i do not want edit .htaccess directly
最合适的回答,由SO网友:Sally CJ 整理而成
它不适用于add_rewrite_rule()
因为?view=
URL中的部分(它是函数的第一个参数)-即WordPress带出查询字符串部分,因此当WordPress找到匹配的重写规则时,它不包括在内。
如何删除?view=12a34b56
设置职位名称后
你不能(不是在same page), 因为这是请求URL中的一个查询字符串,PHP在加载页面时从中读取,而浏览器已经;“放置”;地址栏中的URL。
但因为我相信您需要301(永久)重定向,从而更改浏览器地址栏中的URL,那么您可以通过parse_request
挂钩-您也可以使用init
挂钩,但带有parse_request
, WordPress已经解析了请求路径(例如。https://example.com/this-path/
), 因此,我们可以简单地从解析的数据中读取,即$wp->request
在下面
所以这应该对你有用,但一定要删除它pre_get_posts
文件中的代码:
add_action( \'parse_request\', \'wpse_375940\' );
function wpse_375940( $wp ) {
if ( \'book.php\' === $wp->request &&
! empty( $_GET[\'view\'] )
) {
$query = new WP_Query( [
\'name\' => $_GET[\'view\'],
\'fields\' => \'ids\',
] );
if ( ! empty( $query->posts ) &&
$url = get_permalink( $query->posts[0] )
) {
// Or use 302. It\'s up to you to decide.
wp_redirect( $url, 301 );
exit;
}
}
}