2015-09-08 246 views
1

我每天與WordPress的工作,並沒有看到過這個問題。也許SO社區有一些洞察力。WordPress的永久鏈接和重定向

我有一個標準的wordpress安裝v4.3,這是當前版本。我沒有活動的重寫模塊。沒有設置基本類別或標籤。固定鏈接被設置爲「發佈名稱」爲乾淨的URL,這適用於整個網站除了/博客以外的所有內容

我試圖重寫/ blog/*到index.php?page_id = xxx並寫了一個自定義分析器來處理似乎在本地工作的URI段。然而,在服務器上,所有/ blog/xxx只是重定向到/ blog /即使我沒有專門告訴它這樣做。

我曾嘗試在.htaccess中設置這樣的:

RewriteRule blog/(category|tag|page|search)/(.+)/?$ index.php?page_id=123 

這不,即使自定義文章類型正則表達式檢查出來和所有其他重寫規則,我有工作的工作。

當失敗我試着寫一個重寫規則掛鉤:

// pathetic hack to fix wp permalink horror for blogs 
add_filter('rewrite_rules_array','my_insert_rewrite_rules'); 
add_action('wp_loaded','my_flush_rules'); 

// flush_rules() if our rules are not yet included 
function my_flush_rules(){ 
    $rules = get_option('rewrite_rules'); 

    if(isset($_GET['rules'])) 
    { 
     echo '<pre>'; 
     print_r($rules); 
     echo '</pre>'; 
    } 

    if (! isset($rules['blog/(category|tag|page|search)/(.+)/?$'])) { 
     global $wp_rewrite; 
     $wp_rewrite->flush_rules(); 
    } 
} 

// Adding a new rule 
function my_insert_rewrite_rules($rules) 
{ 
    $newrules = array(); 
    $newrules['blog/(category|tag|page|search)/(.+)/?$'] = 'index.php?page_id=123'; 
    return $newrules + $rules; 
} 

在瀏覽器,如果您運行的規則顯示當前重寫陣列,它確實將它添加到陣列?然而由於某些原因,WP正在採取的行動是重定向到index.php?page_id = 123,而不是加載它,讓我自己解析URI。就像「博客」這個詞在某種程度上是保留的一樣。

有沒有其他人看過類似的東西?我能想象的唯一相關插件可能會擾亂CCTM,但博客不是自定義內容類型。/blog只是一個普通的頁面,像其他任何根據URI段獲取帖子的普通頁面。

我建議嘗試爲這些頁面使用標準WP體系結構,但客戶端堅持一切都在/ blog/category/category_name/page/x下。他們不想爲此付出代價,而且我明白,因爲它在當地按預期運作。是的,服務器設置有細微的差異,但常見的核心元素是相同的 - htaccess啓用,wp是根目錄,並沒有安裝在一個目錄等。

我試過禁用所有插件,切換到2015主題,潮流固定鏈接,清除緩存等等。非常奇怪。

任何輸入或類似的故事可能會導致解決方案,所以我歡迎你有什麼。

回答

1

我回答我自己的問題,因爲它看起來像很多其他人有類似的問題,並接受答案是稀缺的。因此,對於我的具體情況,這是答案:

首先,在huksley's answer之後,我在web根目錄中編寫了備用index_pass.php文件。該文件僅包含:

<?php $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URI"]; include("index.php"); 

接下來,我在wordpress默認值之前添加了htaccess規則。 E = URI:部分是這裏的關鍵:

RewriteEngine On 
RewriteBase/

RewriteRule ^blog/(category|tag|page|search)/(.+)/?$ index_pass.php?page_id=123 [NC,L,E=URI:somedomain.com/blog/$1/$2/$3/$4] 

#wordpress defaults below 

然後在函數中。PHP的主題我添加此,以防止新的哈克垃圾的解決方案,從投擲404:在那裏

add_filter('template_redirect', 'my_404_override'); 
function my_404_override() { 
    global $wp_query; 

    if (strpos($_SERVER['REQUEST_URI'], "blog/category") > -1 || strpos($_SERVER['REQUEST_URI'], "blog/tag") > -1 || strpos($_SERVER['REQUEST_URI'], "blog/search") > -1) { 
     status_header(200); 
     $wp_query->is_404=false; 
     $bypass = true; 
     include('page-blog-index.php'); 
     exit; 
    } 
} 

流氓$旁路只是告訴我,以填補在頁面blog-造成這種失衡的解決方案的空隙index.php

所以我們有它。有用。我不完全肯定爲什麼,我對此有點不舒服,但最終我不在乎,只要它有效。我更願意有一個實際的解決方案,它不會違反任何理智的程序員的思想的每一個邏輯碎片,並且不會違背多個PhD衍生CMS的實際骨架,但是,嘿,我們不能一直贏,對嗎?

希望它可以幫助別人。