Как заставить WordPress изменять файл .htaccess определенным образом?

27 нояб. 2012 г., 13:19:10
Просмотры: 425
Голосов: 0

Я немного разобрался с WordPress Rewrite API — достаточно, чтобы добавить новое правило перезаписи для плагина. Плагин работает при установке в корень, но если WordPress установлен в поддиректорию, мне нужно внести следующие изменения в файл .htaccess. Хотелось бы узнать, как автоматизировать эти изменения. Кроме того, есть вторая проблема: при переходе в настройки постоянных ссылок WordPress мои изменения перезаписываются (за исключением специального правила, созданного через WP Rewrite API). Мне нужно решение, использующее WordPress Rewrite API, чтобы изменения не перезаписывались.

Исходный файл .htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /mysubdir/
RewriteRule ^index\.php$ - [L]
# мое специальное правило через WP Rewrite API
RewriteRule ^special(.*)$ /mysubdir/wp-content/plugins/special/app/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /mysubdir/index.php [L]
</IfModule>
# END WordPress

Изменения, которые я внес для работы плагина в поддиректории

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

#RewriteBase /mysubdir/

RewriteRule ^index\.php$ - [L]
# мое специальное правило через WP Rewrite API
RewriteRule ^special(.*)$ /mysubdir/wp-content/plugins/special/app/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#RewriteRule . /mysubdir/index.php [L]

RewriteRule . index.php [L]
</IfModule>
# END WordPress
2
Комментарии

Правила перезаписи должны работать корректно независимо от того, где установлен сайт (в подкаталоге или нет). Как вы добавили свою перезапись? Похоже, ваш вопрос должен звучать так: "Почему моя пользовательская перезапись не работает с WordPress в подкаталоге?"

chrisguitarguy chrisguitarguy
27 нояб. 2012 г. 14:03:24

@chrisguitarguy Я реализую защищенный контент в своем плагине. Я перехватываю /my-post (потому что он помечен в моем плагине как защищенный) и перенаправляю на /special/secured/my-post (не физический путь, а логический путь перезаписи), где мой плагин перехватывает и показывает его только вошедшим пользователям.

Volomike Volomike
28 нояб. 2012 г. 00:03:11
Все ответы на вопрос 2
0

Если вы не хотите, чтобы WordPress перезаписывал ваши изменения в файле .htaccess, убедитесь, что вы вносите свои изменения вне блока комментариев WordPress, то есть до или после этого:

# BEGIN WordPress
...
# END WordPress

Думайте об этой области как о территории WordPress. Все, что находится внутри этого блока, будет перезаписано WordPress, если ему потребуется внести изменения в .htaccess.

Вот что вы можете сделать после блока комментариев WordPress:

# BEGIN WordPress
...
# END WordPress

<IfModule mod_rewrite.c>
# Напишите ваши правила перезаписи здесь.
</IfModule>
27 нояб. 2012 г. 14:00:40
0

Вы можете использовать функцию add_rewrite_rule() для добавления правил в файл .htaccess. Если вы добавите эти правила в хуке init (или непосредственно перед сбросом правил), то при каждом сбросе правил (например, при сохранении настроек постоянных ссылок), эти правила будут сохранены.

Обратите внимание, что обычно правило перезаписи, передаваемое в add_query_arg, имеет следующий формат:

'index.php?p=12&food=$matches[1]&variety=$matches[2]'

WordPress обрабатывает такие правила внутренне и не добавляет их в файл .htaccess. Но если первая часть правила не начинается с index.php?, то оно рассматривается как внешнее правило перезаписи и добавляется в .htaccess. Смотрите исходный код.

27 нояб. 2012 г. 14:24:03