Как заставить WordPress изменять файл .htaccess определенным образом?
Я немного разобрался с 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

Если вы не хотите, чтобы WordPress перезаписывал ваши изменения в файле .htaccess, убедитесь, что вы вносите свои изменения вне блока комментариев WordPress, то есть до или после этого:
# BEGIN WordPress
...
# END WordPress
Думайте об этой области как о территории WordPress. Все, что находится внутри этого блока, будет перезаписано WordPress, если ему потребуется внести изменения в .htaccess.
Вот что вы можете сделать после блока комментариев WordPress:
# BEGIN WordPress
...
# END WordPress
<IfModule mod_rewrite.c>
# Напишите ваши правила перезаписи здесь.
</IfModule>

Вы можете использовать функцию add_rewrite_rule() для добавления правил в файл .htaccess
. Если вы добавите эти правила в хуке init
(или непосредственно перед сбросом правил), то при каждом сбросе правил (например, при сохранении настроек постоянных ссылок), эти правила будут сохранены.
Обратите внимание, что обычно правило перезаписи, передаваемое в add_query_arg
, имеет следующий формат:
'index.php?p=12&food=$matches[1]&variety=$matches[2]'
WordPress обрабатывает такие правила внутренне и не добавляет их в файл .htaccess
. Но если первая часть правила не начинается с index.php?
, то оно рассматривается как внешнее правило перезаписи и добавляется в .htaccess
. Смотрите исходный код.
