Проблема перемикання сторінок категорій в Wordpress
Вітаю вас, шановні читачі.
Сьогодні я поділюся вирішенням проблеми недоступності сторінок категорії при використанні ЧПУ (хто не знайомий з терміном ЧПУ, корисним виявиться цей відеоурок по PHP ) І плагіна WP- PageNavi в движку WordPress.
Суть проблеми:
Помилка виникає в блогах на движку WordPress з таким форматом URL статей:
http://name.ru/cat_name/post_name.
Користувач запросто може прибрати ім'я поста post_name з URL з бажанням переглянути вміст всієї категорії cat_name і перейти по посиланню http://name.ru/cat_name.
При цьому перша сторінка постів з категорії cat_name відобразиться без проблем, а наступні сторінки цієї категорії, перехід на які здійснюється за допомогою плагіна WP-PageNavi (посилання, для перегляду наступних сторінок категорії матиме вигляд http://name.ru/cat_name/page/ 2) відобразять помилки: Сторінку не знайдено.
Вирішити дану проблему, зазвичай, пропонують додаванням хвостика .html після post_name в налаштуваннях формату посилань WordPress (http://name.ru/cat_name/post_name.html). Дане рішення підходить тільки для нових блогів. У разі давно працюють сайтів, з великою кількістю проіндесірованних пошуковими системами статей за старими URL, запропоноване рішення призведе до необхідності переиндексации, що дуже небажано з точки зору SEO.
Виникла необхідність змусити нормально функціонувати перемикання сторінок в категоріях, зберігши при цьому формат посилань без зміни.
Рішення проблеми
Вирішити дану проблему можна підміною полів REQUEST_URI і REDIRECT_URL суперглобального масиву $ _SERVER для посилань виду http://name.ru/cat_name/page/N, де N - натуральне число.
В результаті підміни поле повинно мати такий вигляд: http://name.ru/category/cat_name/page/N
Посторінкова навігація категорій з URL, що містить кодове слово category, працює без проблем.
Послідовність дій
- Відкрити на редагування в текстовому редакторі файл index.php кореневої папки WordPress.
- Після рядка define ( 'WP_USE_THEMES', true); вставити код виклику додаткової функції myfuckingstub ();
- В кінці документа описати функцію myfuckingstub ();
function myfuckingstub () {$ uri = $ _SERVER [ 'REQUEST_URI']; preg_match ( '/ ^ \ / ([a-z0-9 \ -_] +) \ / page \ / ([0-9] +) $ / i', $ uri, $ matches); if (count ($ matches) == 0) return; $ Uri = '/category/'.$matches[1].'/page/'.$matches[2]; $ _SERVER [ 'REQUEST_URI'] = $ uri; $ _SERVER [ 'REDIRECT_URL'] = $ uri; }
Ось, власне і все.
Повний код файлу index.php після змін:
define ( 'WP_USE_THEMES', true); myfuckingstub (); / ** Loads the WordPress Environment and Template * / require ( './ wp-blog-header.php'); function myfuckingstub () {$ uri = $ _SERVER [ 'REQUEST_URI']; preg_match ( '/ ^ \ / ([a-z0-9 \ -_] +) \ / page \ / ([0-9] +) $ / i', $ uri, $ matches); if (count ($ matches) == 0) return; $ Uri = '/category/'.$matches[1].'/page/'.$matches[2]; $ _SERVER [ 'REQUEST_URI'] = $ uri; $ _SERVER [ 'REDIRECT_URL'] = $ uri; }
пояснення того, що відбувається
суперглобальний масив $ _SERVER містить багато службової інформації, подивитися яку можна шляхом впровадження в файл index.php коду print_r ($ _ SERVER);
Серед різноманітних полів масиву будуть присутні цікаві для нас записи:
- $ _SERVER [ 'REQUEST_URI'] - зберігає інформацію про ім'я скрипта, який займається обробкою формування відкритої сторінки, починаючи від кореневої директорії віртуального хоста і параметри.
- $ _SERVER [ 'REDIRECT_URL'] - зберігає адресу редиректу.
Зміна вмісту даних полів призведе до ініціалізації завантаження сторінки по насильно впровадженої туди посиланням.
У наведеному коді функції myfuckingstub (); 3-й рядок отримує вміст поля REQUEST_URI в змінну $ uri. Тепер в змінній $ uri буде міститися значуща частина URL, запитаного користувачем.
4-й рядок, за допомогою PHP-функції preg_match (), перевіряючи, чи збігається між вмістом змінної $ uri і регулярним виразом / ^ \ / ([a-z0-9 \ -_] +) \ / page \ / ([0-9] +) $ / i. Наведене регулярний вираз кодує вид посилань типу http://name.ru/cat_name/page/N (даний вид посилань зустрічається тільки в посторінковою навігації категорій, тому його можна сміливо замінити на потрібний нам вигляд http://name.ru/category/ cat_name / page / N).
У разі збігу $ uri і регулярного виразу, функція preg_match () поверне масив, що складається з збіглися частин регулярного виразу (масиву буде присвоєно ім'я $ matches).
6-й рядок перевіряє збіг по регулярному виразу. Якщо збігу немає - count ($ matches) буде дорівнює нулю і функція myfuckingstub () завершить свою роботу.
У разі збігу по регулярному виразу в 8-й рядок змінить вміст змінної $ uri, додавши потрібну нам частину / category /.
9 і 10 рядки здійснять заміну вмісту відповідних полів суперглобального масиву $ _ SERVER, що призведе до завантаження сторінки по потрібної нам посиланням виду http://name.ru/category/cat_name/page/N.
Дякуємо за увагу.
З повагою, Андрій Морковин .