2017-04-04 40 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