如何管理从旧CMS迁移后的约90k 301重定向

时间:2018-04-17 作者:5ulo

我最近将内容从Typo3转移到WP,大约有30000篇文章。每篇文章都有3个或更多URL,我将其存储在自定义文本字段中。。新行中的每个旧url。

我可以通过编程将每个存储的旧typo3链接与wordpress链接配对,但问题是如何管理301重定向而不将一些输出粘贴到。htaccess。

我的想法是:

呼叫http://www.domain.tld/old-link/

  • (通常点击404)wp将请求的旧链接与所有元字段“\\u old\\u url”进行比较,如果找到,则重定向301,wp提供新url,知道如何做吗?

  • 2 个回复
    SO网友:Oleg Butuzov

    这里有一个技巧,WP中的重定向很复杂。你可以得到三种可能发生的情况。

    有与您的url规则匹配的帖子,但在生成的wp\\U查询中没有返回帖子query_string.404.基于thi,可在3个wp点上触发404重定向。

    1. request
    2. wp_headers
    3. template_redirect
    因此您可以将其用作重定向逻辑的模板

    add_filter( \'request\', function( Wp_Query $wp_query ){
        if ( isset( $wp_query[\'error\'] ) && 404 === intval( $wp_query[\'error\'] ) ){
            // redirection logickgoes here...
        }
        return $wp_query;
    });
    
    add_filter( \'wp_headers\', function( $headers, $wp ){
        if ( isset( $wp->query_vars[\'error\'] ) && 404 === intval( $wp->query_vars[\'error\'] ) ) {
            // redirection logic goes here...
        }
        return $headers;
    }, 10, 2);
    
    add_action( \'template_redirect\', function( $params ){
        if ( is_404() ) {
            // redirection logic goes here.
        }  
    });
    
    这些是在404错误时进行重定向的一种有点黑客的方法,但这是我自己在遇到站点迁移时想到的。

    SO网友:5ulo

    我最后勾搭上了404_template. 比较30k篇文章有点慢,但301重定向有效。

    add_filter( \'404_template\', function( $tpl ) {
    
        $request = filter_input( INPUT_SERVER, \'REQUEST_URI\', FILTER_SANITIZE_STRING );
    
        if ( ! $request ) {
            return $tpl;
        }
    
        $args = array(
            \'posts_per_page\'   => 1,
            \'orderby\'          => \'ID\',
            \'order\'            => \'DESC\',
            \'post_status\'      => \'publish\',
            \'meta_query\' => array(
                array(
                    \'key\'     => \'old_urls\',
                    \'value\'   => $request,
                    \'compare\' => \'LIKE\',
                ),
            ),
        );
    
        $posts = get_posts( $args );
        $redir = get_permalink($posts[0]->ID);
    
        if ( $redir ) {
            wp_redirect( $redir, 301 );
            exit;
        }
    
        return $tpl;
    
    }, -4000 );
    

    结束