Wordpress - 如果页面不存在,则重定向页面

时间:2017-09-21 16:03:41

标签: wordpress

我正在尝试重定向用户;如果网址不存在,请website.com/properties/property-titlewebsite.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

1 个答案:

答案 0 :(得分:0)

我想你可能只是忘记了正则表达式的正斜杠。

'/properties/'    => '/archive_properties/$1',

修改

所以问题是你的preg_replace参数。 $pattern是一个带分隔符的正则表达式模式,如果您希望它与/properties/匹配,则可以使用#作为分隔符,使其成为#/properties/#$replacement应为/archive_properties/。这是实际的字符串替换(不是正则表达式)。

这是

'#/properties/#'    => '/archive_properties/'.

您还需要注意网址以/properties结尾的情况。我认为你应该对URI进行条件OR检查,如果是真的,只需替换/properties来处理这两种情况。