2010-07-31 2 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 это имя поста. Это все пользовательские типы сообщений. Причина, по которой я столкнулась с этой ситуацией, заключается в том, что я использую несколько языков, но хочу, чтобы клиенту не приходилось создавать более одного сообщения для каждой статьи (у них много вариантов и изображений, их повторное опубликование практически не вопрос). Я изучил создание rewrite_rules в functions.php, а также модифицировал файл .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? –

+0

Я не понимаю, почему это было бы? –

ответ

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 и моими переписываниями. Спасибо за вашу помощь. –

+0

Aw, что несчастливо. Возможно, в один прекрасный день это будет просто прозрение – Anraiki

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 сервера.Таким образом, регулируя переписывания Ruleset немного, мы можем сделать это:

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 (например, в index.php, так как вы не должны, вероятно, необходимо обновить этот файл с последующей WordPress релизы), вы можете сделать следующее:

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

Там вполне может быть способом, чтобы определить свое поведение в WordPress с помощью самих настроек PermaLink, так как он перебрать этот список правил при разборе запроса, но я Я не совсем понимаю подробности этого, поскольку я никогда не использовал его сам. Если это возможно, я бы счел это рекомендуемым способом обработки этой ситуации, но в любом случае мы надеемся, что один из этих вариантов должен заставить вас работать.

+0

Извините, эта проблема оставила. Это слишком большая головоломка для решения смешения между собственными перезаписями WordPress, переписываниями WPML и моими переписываниями. Спасибо за вашу помощь. –

Смежные вопросы