Проблема перемикання сторінок категорій в Wordpress

  1. Рішення проблеми
  2. пояснення того, що відбувається

Вітаю вас, шановні читачі

Вітаю вас, шановні читачі.

Сьогодні я поділюся вирішенням проблеми недоступності сторінок категорії при використанні ЧПУ (хто не знайомий з терміном ЧПУ, корисним виявиться цей відеоурок по 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, працює без проблем.

Послідовність дій

  1. Відкрити на редагування в текстовому редакторі файл index.php кореневої папки WordPress.
  2. Після рядка define ( 'WP_USE_THEMES', true); вставити код виклику додаткової функції myfuckingstub ();
  3. В кінці документа описати функцію 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.

Дякуємо за увагу.

З повагою, Андрій Морковин .