预期为404,但在帖子标题中重定向到带有url子目录的帖子

时间:2014-05-22 作者:terraling

我看到了一些意想不到的东西,尽管我不确定这是我可以禁用的功能,还是我需要跟踪的自定义主题引入的功能。

如果我为一个不存在的页面输入url,例如mysite。com/london,在抛出404之前,它将搜索标题以“london”开头的帖子,并显示如果找到它,例如mysite。com/活动/伦敦周末派对。

(我有许多不同的CPT,但此重定向与CPT无关,也就是说,它似乎不关心标题中包含“london”的帖子类型。当我注册CPT时,唯一的重写规则是针对slug,例如。\'rewrite\' => array(\'slug\'=>\'events\'.)

我使用插件Debug This查看重写规则,但它没有帮助,因为它似乎显示了重写发生后匹配的规则,即它与mysite.com/london 但针对它发现的帖子,即。events/([^/]+)(/[0-9]+)?/?$.

我之所以发现这个“问题”,是因为我正在研究如何在404模板加载之前拦截404,以便对照白名单检查URL,以便如果我找到匹配的,比如mysite。在重定向之前,我可以做一些伦敦特有的事情。如果有人对从哪里开始这方面有任何建议,我很高兴听到他们。我的第一反应是$\\u迷上wp,但我不是说?name=value 样式参数。

1 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

你所指的魔法发生在redirect_canonical(). 更具体地说,redirect_guess_404_permalink().

你可以提前切入redirect_canonical 通过钩住template_redirect 优先级稍高的操作-在这种情况下,任何低于10.

function wpse_145210_redirect_canonical() {
    if ( is_404() && $name = get_query_var( \'name\' ) ) {
        // The following is straight from redirect_guess_404_permalink(), do whatever you want instead!

        $where = $wpdb->prepare("post_name LIKE %s", like_escape( $name ) . \'%\');

        // if any of post_type, year, monthnum, or day are set, use them to refine the query
        if ( get_query_var(\'post_type\') )
            $where .= $wpdb->prepare(" AND post_type = %s", get_query_var(\'post_type\'));
        else
            $where .= " AND post_type IN (\'" . implode( "\', \'", get_post_types( array( \'public\' => true ) ) ) . "\')";

        if ( get_query_var(\'year\') )
            $where .= $wpdb->prepare(" AND YEAR(post_date) = %d", get_query_var(\'year\'));
        if ( get_query_var(\'monthnum\') )
            $where .= $wpdb->prepare(" AND MONTH(post_date) = %d", get_query_var(\'monthnum\'));
        if ( get_query_var(\'day\') )
            $where .= $wpdb->prepare(" AND DAYOFMONTH(post_date) = %d", get_query_var(\'day\'));

        $post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE $where AND post_status = \'publish\'");
        if ( ! $post_id )
            return false;

        if ( get_query_var( \'feed\' ) )
            $url = get_post_comments_feed_link( $post_id, get_query_var( \'feed\' ) );
        elseif ( get_query_var( \'page\' ) )
            $url = trailingslashit( get_permalink( $post_id ) ) . user_trailingslashit( get_query_var( \'page\' ), \'single_paged\' );
        else
            $url = get_permalink( $post_id );

        wp_redirect( $url, 301 );
        exit;
    }
}

add_action( \'template_redirect\', \'wpse_145210_redirect_canonical\', 5 );

结束

相关推荐

WP_REDIRECT挂起,但返回True

我不知道我做错了什么,但我无法让wp\\u重定向实际重定向页面。我启用了wp\\u调试来检查“header ready sent”错误,但什么都没有。我安装了“更好的HTTP重定向”插件来检查响应,但它说找到了302。如果我像这样检查wp\\u重定向响应,它会显示“重定向成功”。但最终什么都没有发生,也没有出现错误。if ( wp_redirect( admin_url( \'admin.php?page=plugin_test&success=item_saved\' ) ) ) {