Wordpress
Опубликовано в Zaandr

Убираем из адреса 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.
Он изменяет адрес вида: /category/parent-category/child-category/ на /mchild-category/.

На свадьбу нужны хорошие, элегантные мужские кольца.


Показать комментарии