Сегодня на одном из популярных форумов был задан вопрос наподобие того, как сделать для WordPress перенаправление с адресов формата /%post_id%.html на адреса формата /%postname%.html, на который я обратил свое внимание. Конечно, автору темы сразу предложили несколько плагинов, способных решить его проблему. Но так как я не очень хорошо знаком с WP, мне почему-то сразу пришла идея использовать для решения этой проблемы хак на основе G-Drive.
В данной статье я не стану затрагивать вопрос о перенаправлении с адресов формата /?p=%post_id%, потому что тут прослеживается очевидное решение, которое можно реализовать в том числе и на G-Drive, а покажу, как элегантно может быть решена поднятая выше проблема.
Прежде всего мы должны настроить перехват запросов по адресам формата /%post_id%.html и их передачу в основной файл G-Drive, который мы разместим в корне сайта, предварительно переименовав его, например, в redir.php, чтобы не конфликтовать с аналогичным файлом WP. Для этого добавим в относящийся к WP файл .htaccess (файл .htaccess из комплекта G-Drive не потребуется) сразу после строки с директивой RewriteBase примерно такое правило:
RewriteRule ^\d+\.html$ redir.php [L]
Чтобы G-Drive был способен найти в таблице wp_posts запись, соответствующую символьному идентификатору формата %post_id%.html, и выбрать из таблицы значение поля post_name для его дальнейшей обработки, импортируем в базу данных сайта представление site_categories, выполняющее нужные функции:
CREATE ALGORITHM=MERGE VIEW `site_categories` AS SELECT CONCAT(`id`, '.html') `id`, `post_name`, 32 `bits`, 'go' `module` FROM `wp_posts` WHERE `post_status`='publish'
Поля bits и module с указанными значениями были добавлены для корректной работы G-Drive и локализации финальной обработки всех подходящих запросов в файле go.h.php, который может содержать примерно такой код:
<?php // проверяем, не было ли прямого обращения к файлу if (isset($page)) { header('Location: /'.$page['post_name'].'.html', true, 301); exit; } // при прямом обращении к файлу передаем управление в WP include 'index.php';
Разместим данный файл в корне сайта вместе с основным файлом G-Drive и изменим в коде основного файла определение константы PATH на такое:
define('PATH', dirname(__FILE__).'/');
Для не подходящих под формат символьного идентификатора запросов или запросов к несуществующим (или неопубликованным) постам G-Drive будет генерировать ошибку, в конечном итоге отдавая управление файлу index.php, которым в данном случае будет основной файл WP, а не основной шаблон сайта, как это обычно бывает. Необходимо только внутри функции error в основном файле G-Drive отключить указание на необходимость последующего обращения к шаблону страницы ошибки (заменить у поля bits значение 16 на 0) и удалить или закомментировать строку с командой для установки индикатора ошибки, начинающуюся с имени header или http_response_code.
В завершение остается только настроить подключение G-Drive к базе данных сайта. Для этого можно внутри функции mysqli_open в основном файле G-Drive удалить или закомментировать строку
require PATH.'include/dbconfig.php';
А необходимые для подключения данные записать явно в строке
return mysqli_connect($host, $user, $pw, $db);
Например:
return mysqli_connect('localhost', 'wordpress', 'password', 'wordpress');
Крайне не рекомендуется пробовать включать файл wp-config.php в основной файл G-Drive. Просто возьмите из файла wp-config.php необходимые значения и запишите их в основном файле аналогично приведенному выше примеру.
Думаю, такое необычное использование G-Drive многим покажется интересным.
Я было уже хотел написать о том, как сделать перенаправление на адреса формата /%category%/%postname%.html, но выяснилось, что WP вполне успешно распознает внутренние перенаправления с указанием идентификатора поста в качестве значения GET-параметра p, выполняя при этом внешние перенаправления самостоятельно, поэтому достаточно написать в файле .htaccess вместо упомянутого в тексте статьи правила примерно такое правило:
Тем не менее описанный в статье метод с небольшими изменениями может быть полезен для тех CMS, в которых решение поднятой проблемы осуществляется не столь тривиально, как в WP.
Вчера при обсуждении одной темы на серче возникла задача делать редирект с адресов /blog/%post_id%/левый_или_пустой_слаг (при пустом слаге трейлинг слеш может отсутствовать) на /blog/%post_id%/%postname% и оказалось, что WP при наличии левого слага, корректируя его, делает редирект сам. Для коррекции адреса с пустым слагом я сначала хотел предложить использовать хак, но потом подумал, что можно делать рерайт в index.php?p=$1 (через $1 передается идентификатор поста), тогда WP тоже должен делать редирект сам.