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.

В завершение остается только настроить подключение 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 не будет опубликован.