Бумажная иконка WordPressДумаю каждый вордпрессовод сталкивался с плагином WP-PageNavi, который производит красивую постраничную навигацию. Однако существует проблема совместимости его с плагином Seo-Without Category, который убирает из URL слово category. Всё бы ничего, если бы не одно но. При переходе по страницам внутри категории возникает ошибка 404. Если переход осуществляется на главной странице – всё работает превосходно.

В блогосфере и на форумах неоднократно поднимался вопрос несовместимости этих плагинов. Пару раз я встречал и решение. Оказывается роутер WP неправильно воспринимает ссылку вида http://youdomain.com/category_name/page/N/, где N-номер страницы, category_name – имя категории. Он думает, что это пост, а не страница навигации. Есть очень простой метод решения – добавить расширение .html в настройки постоянных ссылок: /%category%/%postname%.html. В этом случае, роутер WordPress не будет путаться и всё будет отображаться, как положено.

Вышеизложенное решение данной проблемы меня не устроило, т.к. у меня было достаточное количество страниц в индексе Яндекса, а как показала практика, он не очень любит переиндексировать страницы в случае изменения их адреса. А это не подходит для работы с биржей GoGetLinks и других партнёрских программ интернета. Года полтора назад, на одном из блогов, я настроил постоянные ссылки (до этого были посты вида http://yourdomain.com/?p=123) и Яндекс до сих пор их не переиндексировал. Чего не скажешь о Google, который справился довольно быстро и в его индексе присутствуют страницы с красивыми URL.

Вывод постраничной навигации осуществляется при помощи функций previous_posts_link и next_posts_link. Я хотел изменить эти функции так, чтобы внутри категорий ссылки на предыдущие и последующие посты выводились со словом category. Однако всё оказалось не так-то просто, и поиск решения превратился в квест, т.к. эти функции имеют прямую зависимость от многих других. В итоге я нашел «первородную» фунцию – get_pagenum_link. Алгоритм сводиться к тому, чтобы «всунуть» слово category между http://yourdomain.com/ и /page/N/.

Функции, отвечающие за вывод ссылок, находятся в файле link-template.php в папке wp-includes. Необходимо вставить следующий текст перед строкой $result= apply_filters(‘get_pagenum_link’, $result);

$url = $result;
$categories = get_categories();
foreach ($categories as $c)
{
$c = $c->slug;
if (strpos($url, $c) !== false && strpos($url, sprintf('category/%s', $c)) === false)
$url = str_replace($c, sprintf('category/%s', $c), $url);
}
$result = $url;

Теперь постраничная навигация будет работать. Как видим – метод рабочий, однако мы «ковыряли» файлы движка – следовательно, после обновления метод перестанет работать.