WP-перенаправление со сменой post_id на postname

Сегодня на одном из популярных форумов был задан вопрос наподобие того, как сделать для 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 многим покажется интересным.

Комментарии: 2

  1. Админ

    Я было уже хотел написать о том, как сделать перенаправление на адреса формата /%category%/%postname%.html, но выяснилось, что WP вполне успешно распознает внутренние перенаправления с указанием идентификатора поста в качестве значения GET-параметра p, выполняя при этом внешние перенаправления самостоятельно, поэтому достаточно написать в файле .htaccess вместо упомянутого в тексте статьи правила примерно такое правило:

    RewriteRule ^(\d+)\.html$ index.php?p=$1 [L]
    

    Тем не менее описанный в статье метод с небольшими изменениями может быть полезен для тех CMS, в которых решение поднятой проблемы осуществляется не столь тривиально, как в WP.

  2. Михаил

    Вчера при обсуждении одной темы на серче возникла задача делать редирект с адресов /blog/%post_id%/левый_или_пустой_слаг (при пустом слаге трейлинг слеш может отсутствовать) на /blog/%post_id%/%postname% и оказалось, что WP при наличии левого слага, корректируя его, делает редирект сам. Для коррекции адреса с пустым слагом я сначала хотел предложить использовать хак, но потом подумал, что можно делать рерайт в index.php?p=$1 (через $1 передается идентификатор поста), тогда WP тоже должен делать редирект сам.

Отправить комментарий

Ваш адрес E-mail не будет опубликован.