2010-07-31 109 views
2

我要瘋了。我想這樣做的唯一的事情就是添加這些規則的網站,我發展:WordPress:自定義重寫規則 - .htaccess或functions.php?

fastigheter-spanien/x property/X&lang=sv 
fastigheter-usa/x property/X&lang=sv 
properties-spain/X property/X&lang=en 
properties-usa/X property/X&lang=en 

其中X是該職位的名稱。這些都是自定義帖子類型。我最終遇到這種情況的原因是,我使用多種語言,但希望客戶不必爲每篇文章創建多個帖子(他們有很多選項和圖像,必須重新發布它們實際上超出了題)。 我已經研究過在functions.php中創建rewrite_rules,並修改.htaccess文件,但一直未能得到它的工作。這些重寫非常簡單,不需要使用任何功能。我無法適應.htaccess文件嗎?

試圖

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_URI} !^/fastigheter-spanien/([^\./]+) 
RewriteCond %{REQUEST_URI} !^/fastigheter-usa/([^\./]+) 
RewriteCond %{REQUEST_URI} !^/properties-spain/([^\./]+) 
RewriteCond %{REQUEST_URI} !^/properties-usa/([^\./]+) 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 

RewriteRule ^fastigheter-spanien/([^\./]+)$ property/$1 [L] 
RewriteRule ^fastigheter-usa/([^\./]+)$ property/$1 [L] 
RewriteRule ^properties-spain/([^\./]+)$ property/$1&lang=sv [L] 
RewriteRule ^properties-usa/([^\./]+)$ property/$1&lang=sv [L] 

這只是給了我一個404的任何想法?

+0

也許這個問題會更好地通過superuser.com問過? – 2010-07-31 15:54:26

+0

我不明白爲什麼會這樣? – 2010-07-31 16:09:54

回答

3

如果一切都失敗與.htaccess文件則有一個替代的解決方案「由插件」

這裏是我的插件中的一個片段來掛鉤英寸

<?php 
function fancy_url_hook($var='REQUEST_URI') 
{ 
    if (!in_array($var, array('REQUEST_URI', 'PATH_INFO'))) $var = 'REQUEST_URI'; 
    $req = $_SERVER[$var]; 

    if (($var != 'PATH_INFO') && isset($_SERVER['PATH_INFO'])) { 
     fancy_url_hook('PATH_INFO'); 
    } 
    $explodeURL = array_slice(explode('/',$req),1,5); 

    global $language; 

    switch($explodeURL) { 
     case 'fastigheter-spanien': $url = 'sv'; break; 
     case 'fastigheter-usa': $url = 'sv'; break; 
     case 'properties-spain': $url = 'en'; break; 
     case 'properties-usa': $url = 'en'; break; 
    } 

    $language = $url; 

} 

function source_function() 
{ 
    global $language; 
    $_GET['lang'] = $language; 

} 

add_action('init', 'fancy_url_hook'); 
add_action('init', 'source_function'); 
?> 

雖然,它需要一些編輯,它必須直接從「插件」掛鉤。所以插件可能是必要的。

雖然,您是否嘗試過編輯.htaccess文件後禁用了所有插件?

+0

對不起,放棄了這個問題。解決WordPress自己的重寫,WPML的重寫和我的重寫之間的混淆是值得的,這太難以解決了。謝謝你的幫助。 – 2010-08-01 15:43:01

+0

唉,那是不幸的。有一天,它只會成爲一個頓悟 – Anraiki 2010-08-02 14:00:56

6

您的重寫應該正常工作,但WordPress沒有看到您的修改。原因是WordPress從$_SERVER['REQUEST_URI']中讀取,它總是包含原始的請求URI,而不是從mod_rewrite操作產生的結果。

我對實際使用WordPress並不熟悉,但我已經查看了一些其他問題的源代碼,看起來它也會嘗試使用$_SERVER['PATH_INFO'](如果提供)。因此,你可以試試這個:

AcceptPathInfo On 
RewriteEngine On 
RewriteBase/

RewriteRule ^fastigheter-(spanien|usa)/([^\./]+)$ property/$2&lang=sv 
RewriteRule ^properties-(spain|usa)/([^\./]+)$ property/$2&lang=en 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* /index.php/$0 [L] 

我發現,使用PATH_INFO是有問題的,雖然(和通常不會在每個目錄範圍內的工作,但我不認爲我已經確定爲什麼還沒有做) ,並且通常建議不要這樣做。

您的其他選項還涉及到PHP方面的工作。你可以做類似於Anraiki suggested的事情,或者你可以告訴$_SERVER['REQUEST_URI']是你所期望的。

如果mod_rewrite執行重定向,則REQUEST_URI作爲模塊將看到它存儲在服務器的REDIRECT_URL變量中。在WordPress的處理(如index.php

RewriteEngine On 
RewriteBase/

# Force L on these rules to cause the REQUEST_URI to be changed (so that 
# REDIRECT_URL will end up with the rewritten value we want) 
RewriteRule ^fastigheter-(spanien|usa)/([^\./]+)$ property/$2&lang=sv [L] 
RewriteRule ^properties-(spain|usa)/([^\./]+)$ property/$2&lang=en [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 

然後,冥冥中早,因爲你不應該有可能需要更新,隨後WordPress的那個文件:那麼,調整重寫規則集一點,我們可以這樣做版本),你可以做到以下幾點:

if (!empty($_SERVER['REDIRECT_URL'])) 
    $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_URL']; 

有很可能的方式使用永久設置自己的WordPress來定義自己的行爲,因爲它遍歷該規則列表中解析請求,但我因爲我從來沒有用過它,所以對這些細節並不完全清楚。如果這是可能的話,我會認爲這是處理這種情況的推薦方式,但希望這兩種方法中的任何一種都能爲你工作。

+0

對不起,放棄了這個問題。解決WordPress自己的重寫,WPML的重寫和我的重寫之間的混淆是值得的,這太難以解決了。謝謝你的幫助。 – 2010-08-01 15:44:22