2017-04-04 37 views
1

几千个网址,我将网站迁移,这将需要约5000重定向,在格式如重定向使用PHP

http://www.acme.org/content/item.aspx?id=123重定向到 http://www.acme.org/resources/articles/why-acme-is-great

通常我会通过的.htaccess或实现这一点nginx模块。然而,我在一个WordPress的特定主机,万神殿,它不允许访问。

因此,我能想到的唯一解决方案就是使用PHP。以下工作。有一些WordPress的具体代码在那里,以防止WordPress只是扔4​​04。

add_filter('template_redirect', 'my_404_override'); 
function my_404_override() 
{ 
    global $wp_query; 
    if (strpos($_SERVER['REQUEST_URI'], 'issues') !== false) { 
    $redirectURL = "/resources"; 
    if (strpos($_SERVER['REQUEST_URI'], '123') !== false) { 
     $redirectURL .= "/articles/why-acme-is-great/"; 
    } 
    } 

    if (!empty($redirectURL)) { 
    status_header(200); 
    $wp_query->is_404 = false; 
    header('HTTP/1.0 301 Moved Permanently'); 
    header('Location: http://www.acme.org' . $redirectURL); 
    } 
} 

这工作正常。然而,我有两个问题:

  1. 对于5000的列表,这对性能有什么影响?我打算使用一些更大的条件,然后缩小范围(在上面的例子中,我首先检查/resources,然后再查看特定的ID
  2. 虽然这个列表理论上永远不需要修改,但它感觉像一个丑陋的解决方案在语法和逻辑方面有没有更好的方法我没有想到
+0

不太清楚,如果我理解你正在尝试做的,但你可以使用'get_permalink($ ID)'和通过每'ID'。例如'get_permalink(123)'='mysite.com/articles/why-acme-is-great /'。另外 - 如果是这样的话 - 它将用于多语言网站。 –

+0

我看到一些插件(安装数量少,过时),声称允许在您无法直接访问的网站上管理.htaccess。值得一看,例如:https://wordpress.org/plugins/wp-htaccess-control/ – markdwhite

回答

2

你的问题是,你将需要制作一个旧的内容映射到新的。发布内容到“old_url = 123”的效果,然后为post-slug做一个wp_query,我会假设你的旧ID(即123)不一定与新的ID相匹配。网址不可行,难以维护。

当你添加一个字段为具有“老内容”,那么你的代码可以是这样的每一个新的职位/页:

add_filter('template_redirect', 'my_404_override'); 
function my_404_override() 
{ 
    global $wp_query; 
    $old_url = $_SERVER['REQUEST_URI']; 
    $results = $wpdb->get_results(
     $wpdb->prepare("SELECT wp_posts.guid, redirect_url FROM wp_posts LEFT JOIN wp_post_meta ON wp_posts.ID = wp_post_meta.post_id WHERE wp_post_meta.old_url = %s LIMIT 1", $old_url)); 
    $redirectURL = $results[0]['guid']; 
    } 

if (!empty($redirectURL)) { 
    status_header(200); 
    $wp_query->is_404 = false; 
    header('HTTP/1.0 301 Moved Permanently'); 
    header('Location: ' . $redirectURL); 
    } 
} 

这是伪代码;但总的想法是,无论如何你都要查询一行;并且对性能的影响可以忽略不计,因为只有在404的情况下,才会检查是否存在重定向,并且该查询只返回一行。

这种方法存在问题,即如果有人在两个帖子中输入相同的数字,则没有优先选择哪个是最重要的重定向的方法。你也可以考虑使用插件来解决这个问题。

https://wordpress.org/plugins/redirection/

+1

这似乎是一个非常可靠的想法 - 我喜欢能够在WordPress中存储/维护重定向信息,然后只是使用原始SQL查询进行查找(可能由Redis缓存?)。 – Jon