Собственный Rewriterule в Wordpress
Один раз я столкнулся с казалось бы простой задачей - сделать сайт на wordpress, одна из страниц которого может принимать параметры, в зависимости от которых генерируется содержимое. Я был уверен, что обычный .htaccess решит мои проблемы, но всё оказалось намного сложнее.
Итак вот каков реализуемый алгоритм. На wordpress ставится плагин exec-php - данный плагин позволяет прямо в тексте страницы воспользоваться кодом на php, что зачастую бывает довольно удобно.
Итак, пусть мы хотим, чтобы этой страничке (mypage) можно было передать, к примеру, название животного, а страничка поищет в базе картинку с таким животным. Будь это самодельный сайт - url бы вглядел как-то http://site.ru/mypage/?animal=slon. Для красоты можно привести ссылку к виду http://site.ru/mypage/slon.html - для этого можно сделать rewriterule в htaccess.
Я так и собирался поступить, но wordpress не позволил вступить в силу изменениям в файле htaccess. Если в wordpress делать реврайт на существующую страницу html, которую можно создать и положить в какую-нибудь папку - то проблем нет, но он отказывается делать реврайт из htaccess на страницу, которая создавалась wordpress и url которой формируется лично вордпресом. (обратите внимание, что в файле htaccess wordpress не хранит свои rewrite - они спрятаны в базе). К слову, мне удалось прописать в htaccess нужный реврайт, но он почему-то делал редирект и красивой ссылки я не получал.
Решение
Короче говоря, нужен способ добавления в wordpress своего rewriterule. Вот необходимые шаги:
- Заходим в файл functions.php, который хранится в папке с вашей темой.
- Вставляем в его начало следующий код
function addMyRewrite() { add_rewrite_tag('%animal%', '([^&]+)'); add_rewrite_rule('mypage/([a-zA-Z-_]+)\.html?$', 'index.php?page_id=11&animal=$matches[1]', 'top'); //flush_rewrite_rules(); } add_action('init', 'addMyRewrite');
- Если мы хотим узнать, какое значение было передано в названии животного - на странице (требуется установленный плагин "Allow PHP in Posts and Pages", про этот плагин написано в обзоре полезных wordpress плагинов), вставляем код
global $wp_query; echo $wp_query->query_vars['animal'];
Теперь объясню, что тут происходит. Функция addMyRewrite создает нужное нам правило и добавляет новый для wordpress параметр (тег) - в нашем случае animal - в простивном случае, его просто нельзя будет получить из запроса. В page_id=11 вы подставляете id созданной страницы (той, на которой будет echo $wp_query->query_vars['animal'];)
p.s. данный метод, возможно, не является наилучшим, но он рабочий. Я рекомендую к прочтению данную статью - в ней всё расписано лучше и подробнее.