Убираем из адреса wordpress дочерние категории

Я столкнулся с тем, что структура постов на блоге требует некоторой переработки. А именно – разнесения постов в подрубрики. Однако изменения адресов существующих статей – это тот шаг, на который мне никак не хотелось бы пойти. Ниже мы рассмотрим решения этой проблемы.
У меня структура permalink такова: /%category%/%postname%/. Это один из самых распространенных вариантов.

Было решено добиться сохранения адресов для записей. Для этого из адреса нужно было убрать отображение дочерних категорий и оставить только родительскую. Для этого я использовал add_filterpost_link. К сожалению, в этом фильтр не передается id категории, поэтому решение не отличается особенной элегантностью.

Решение без плагинов

Код который необходимо вставить в файл function.php
function kill_childcat_postlink($link) {
$result = $link;
$bloghome = get_bloginfo( 'home' );
if (preg_match('%' . $bloghome . '/(.*?)/(.*?)/(.*?)/$%i', $link))
$result = preg_replace('%' . $bloghome . '/(.*?)/.*?/(.*?)/$%i', $bloghome . '/$1/$2/', $link);
return $result;
}
add_filter('post_link','kill_childcat_postlink');

Фильтр post_link срабатывает каждый раз при формировании адреса записи и передает в нашу функцию готовый адрес. Мы, с помощью регулярный выражений, проверяем если в структуре адреса есть подкатегории, то мы удаляем их.

Данный код будет корректно работать при уровне вложенности равным единице, т.е. подкатегория не может содержать ещё одну подкатегорию.

Если кто-то знает более элегантное решение – буду рад комментариям.

Плагин No category parents.

Для тех, кто желает изменить адреса категорий, есть хороший плагин No category parents.
Он изменяет адрес вида: /category/parent-category/child-category/ на /mchild-category/.

Оцените статью
Добавить комментарий

Капча загружается...