WordPress страницы переписывают адрес - PullRequest
4 голосов
/ 13 марта 2010

UPDATE

Я попытался использовать внутреннюю переписку WordPress. Что мне нужно сделать, так это адрес:

http://example.com/galleria/artist-name

отправлено на страницу gallery.php с переменной, содержащей artist-name.

Я использовал эти правила согласно документации Wordpress:

// REWRITE RULES (per gallery) {{{
add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(galleria)/(.*)$'] = 'index.php?pagename=gallery&galleryname=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'galleryname');
    return $vars;
}

Что сейчас странно, так это то, что при моей локальной установке WordPress тест работает нормально: вызывается страница галереи и передается переменная galleryname. На реальном сайте, с другой стороны, исходный URL-адрес принимается (поскольку он не входит в 404), НО он изменяется на http://example.com/gallery (я имею в виду, что он фактически изменяется в адресной строке браузера), и переменная не определено в gallery.php.

Есть идеи, что может вызвать это другое поведение?

В качестве альтернативы, любой другой способ, которым я не мог придумать, который мог бы достичь того же эффекта, который описан в первых трех строках, вполне подойдет.


Старый вопрос

Что мне нужно сделать, это переписать этот адрес:

(1) http://localhost/wordpress/fake/text-value

до

(2) http://localhost/wordpress/gallery?somevar=text-value

Примечания:

  • переназначение должно быть прозрачным: пользователь всегда должен видеть адрес (1)
  • gallery - это постоянная ссылка на страницу WordPress, а не реальный адрес

Мне в основном нужно сначала переписать адрес (чтобы изменить его), а затем снова передать его в перезапись мода (чтобы позволить wordpress разобрать его по-своему).

Проблемы

если я просто сделаю

RewriteRule ^fake$ http://localhost/wordpress/gallery [L]

это работает, но адрес в браузере изменяется, что не хорошо, если я делаю

RewriteRule ^fake$ /wordpress/gallery [L]

Я получаю 404. Я пробовал другие флаги вместо [L], но безрезультатно. Как я могу заставить это работать?

РЕДАКТИРОВАТЬ: полный .htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteRule ^fake$ /wordpress/gallery [R]

RewriteBase /wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress

Ответы [ 4 ]

1 голос
/ 15 апреля 2010

Решено, это был плагин Permalink Redirect , который нужно было настроить для пропуска нужных "виртуальных" URL, иначе он выдаст 301 Permanently Move.

1 голос
/ 13 марта 2010

Попробуйте это правило:

RewriteRule ^fake/([^/]+)$ gallery?somevar=$1 [L]
0 голосов
/ 24 декабря 2010
  1. Используя ваш любимый редактор HTML / PHP, откройте wp-admin/includes/misc.php

  2. Найти функцию функции got_mod_rewrite Это около строки 18 или около того.

  3. Закомментируйте существующую функцию: /* this is commented out */ - Вы можете удалить эту функцию, если уверены, что решение работает, но для безопасности просто закомментируйте ее на случай, если вам нужно будет вернуть ее обратно.

  4. Добавить вместо этого следующее:

    function got_mod_rewrite() {
        $got_rewrite = true;
        return apply_filters(‘got_rewrite’, $got_rewrite);
    }
    
  5. Сохраните и загрузите.

0 голосов
/ 26 марта 2010

Извиняюсь за очень запоздалый ответ, но я считаю, что вам нужно сделать то, что предложил Гамбо, но с добавлением флага passthrough / PT :

Этот флаг заставляет механизм перезаписи установить в поле uri внутренней структуры request_rec значение поля имени файла.
...
Вы должны использовать этот флаг, если хотите смешать директивы из разных модулей, которые допускают трансляторы URL-адресов в имена файлов.

Хотя Wordpress (через mod_php) запускается после завершения mod_rewrite, он обычно получает исходный (предварительно переписанный) uri и использует его для своей внутренней перезаписи, а не перезаписанного значения имени файла.

Так попробуйте:

RewriteRule ^fake/([^/]+)$ gallery?somevar=$1 [QSA,PT]

Я добавил QSA, чтобы на тот случай, если кто-нибудь зайдет в / wordpress / fake / что-то? Page = 3, он будет правильно передан. Дайте мне знать, как это работает.

...