您只能使用WordPress检测不存在的页面。普通URL不指向物理资源,它们的路径在内部映射到数据库内容。
这意味着您需要一个WP挂钩,该挂钩仅在找不到URL的内容时触发。那个钩子是404_template
. 当WP尝试从您的主题(或index.php
如果没有404.php
).
您可以将其用于重定向,因为此时尚未发送任何输出。
创建一个自定义插件,并在其中添加重定向规则。
以下是一个示例:
<?php # -*- coding: utf-8 -*-
/**
* Plugin Name: Custom Redirects
*/
add_filter( \'404_template\', function( $template ) {
$request = filter_input( INPUT_SERVER, \'REQUEST_URI\', FILTER_SANITIZE_STRING );
if ( ! $request ) {
return $template;
}
$static = [
\'/old/path/1/\' => \'new/path/1/\',
\'/old/path/2/\' => \'new/path/2/\',
\'/old/path/3/\' => \'new/path/3/\',
];
if ( isset ( $static[ $request ] ) ) {
wp_redirect( $static[ $request ], 301 );
exit;
}
$regex = [
\'/pattern/1/(\\d+)/\' => \'/target/1/$1/\',
\'/pattern/2/([a-z]+)/\' => \'/target/2/$1/\',
];
foreach( $regex as $pattern => $replacement ) {
if ( ! preg_match( $pattern, $request ) ) {
continue;
}
$url = preg_replace( $pattern, $replacement, $request );
wp_redirect( $url, 301 );
exit;
}
// not our business, let WP do the rest.
return $template;
}, -4000 ); // hook in quite early
你当然不局限于一张简单的地图。我有一些版本的插件,对于某些客户端来说非常复杂,你甚至可以构建一个UI来在管理后端创建地图……但在大多数情况下,这种简单的方法可以满足你的需要。