我正在尝试重定向用户;如果网址不存在,请website.com/properties/property-title
到website.com/archive_properties/property-title
。
以下代码正在工作,如果它重定向到的URL实际上是一个页面,如果该页面不存在则会出现错误;重定向过多次,网址更改为/archive_archive_archive_archive_archive_archive_archive_archive_archive_archive_archive_properties/property-title
如果页面不存在,我有没有办法显示正常的404页面?
add_filter( '404_template', function( $template ) {
$request = filter_input( INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_STRING );
if ( ! $request ) {
return $template;
}
$regex = [
'/properties/' => 'archive_properties/$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
答案 0 :(得分:0)
我想你可能只是忘记了正则表达式的正斜杠。
'/properties/' => '/archive_properties/$1',
修改强>
所以问题是你的preg_replace
参数。 $pattern
是一个带分隔符的正则表达式模式,如果您希望它与/properties/
匹配,则可以使用#
作为分隔符,使其成为#/properties/#
。 $replacement
应为/archive_properties/
。这是实际的字符串替换(不是正则表达式)。
这是
'#/properties/#' => '/archive_properties/'.
您还需要注意网址以/properties
结尾的情况。我认为你应该对URI进行条件OR检查,如果是真的,只需替换/properties
来处理这两种情况。