Как изменить URL конкретных страниц / записей / рубрик / меток / таксономий через functions.php

Если вы читаете эту статью, то наверняка хотя бы раз слышали про WP_Rewrite. Этот класс позволяет работать с постоянными ссылками в WordPress, изменять их вид и структуру. WP_Rewrite задает правила перезаписи, которые будут действовать по всему блогу.

Сейчас же я покажу вам очень простой но действенный метод ручной замены URL конкретных страниц сайта на WordPress. Состоит он всего из трёх шагов: редиректа старых страниц на новые, изменения запроса к базе, перезаписи ссылок.

Шаг 1. Редиректы через хук template_redirect

Этот шаг нужен для того, чтобы страница не была доступна по двум URL одновременно, поэтому мы ставим 301й редирект со всех старых URL на новые (желающие могут реализовать это также через .htaccess).

В примерах я по умолчанию использую префикс для рубрик — category и для меток — tag, у вас они могут отличаться.

Весь код, который вы увидите в этой статье — в functions.php.

function true_301_redirect() {
	/* в массиве указываем все старые=>новые ссылки  */
	$rules = array(
		array('old'=>'/category/без_рубрики/','new'=>'/category/Без_рубрики/'), // рубрика
		array('old'=>'/контакты/','new'=>'/Контакты/'), // страница
		array('old'=>'/привет-мир/','new'=>'/хеллоу-мир/'), // запись
		array('old'=>'/tag/метка/','new'=>'/tag/Метка/') // метка
	);
	foreach( $rules as $rule ) :
		// если URL совпадает с одним из указанных в массиве, то редиректим
		if( urldecode($_SERVER['REQUEST_URI']) == $rule['old'] ) :
			wp_redirect( site_url( $rule['new'] ), 301 );
			exit();
		endif;
	endforeach;
}
 
add_action('template_redirect', 'true_301_redirect');

Вы могли заметить, что в большинстве ссылок я просто добавил заглавные буквы — это сделано для наглядности и такая замена тоже считается перезаписью ссылки.

Ссылки на описания функций, использованных в примерах, вы найдёте в конце статьи.

Шаг 2. Изменение параметров запроса через хук request

Окей, редиректы проставили и, если вы уже начали пробовать то, что получилось, то у вас наверняка повылазили ошибки 404. Сейчас нам нужно добиться того, чтобы новые URL WordPress воспринимал как старые.

function true_request( $query ){
 
	$url_zapros = urldecode($_SERVER['REQUEST_URI']);
 
	/* для рубрик */
	if( $url_zapros == '/category/Без_рубрики/' )
		$query['category_name'] = 'без_рубрики';
 
	/* для страниц */
	if( $url_zapros == '/Контакты/' ){
		$query['pagename'] = urlencode('контакты');
		unset($query['name']);
	}
 
	/* для записей */
	if( $url_zapros == '/хеллоу-мир/' )
		$query['name'] = 'привет-мир';
 
	/* для меток */
	if( $url_zapros == '/tag/Метка/' )
		$query['tag'] = 'метка';
 
	return $query;
}
 
add_filter( 'request', 'true_request', 9999, 1 );

Шаг 3. И конечно же сама перезапись ссылок

Хуки для записей и страниц будут отличаться от хуков для рубрик и меток.

Для записей / страниц

function true_posts_links( $url, $post ){
	if( !is_object( $post ) )
		$post = get_post( $post_id );
 
	$replace = $post->post_name;
 
	/* замены для записей и страниц,
		к сожалению тут только по ID замену можно сделать */
 
	if( $post->ID == 1 ) 
		$replace = 'хеллоу-мир';
	if( $post->ID == 12 ) 
		$replace = 'Контакты';
 
	$url = str_replace($post->post_name, $replace, $url );
	return $url;
}
 
add_filter( 'post_link', 'true_posts_links', 'edit_files', 2 );
add_filter( 'page_link', 'true_posts_links', 'edit_files', 2 );
add_filter( 'post_type_link', 'true_posts_links', 'edit_files', 2 );

Обязательно ли делать проверку именно по ID записи? Да, если в URL присутствует кириллица. Если вы не знаете, где найти ID, спрашивайте в комментах, всё расскажу и покажу.

Перезапись ссылок для рубрик / меток

function true_term_links( $url, $term, $taxonomy ){
	$replace = $term->slug;
 
	/* замены для рубрик/меток, опять-таки нужно указать ID и желаемый ярлык */
	if( $term->term_id == 5 ) 
		$replace = 'Без_рубрики';
	if( $term->term_id == 55 ) 
		$replace = 'Метка';
 
	$url = str_replace($term->slug, $replace, $url );
 
	return $url;
}
 
add_filter( 'term_link', 'true_term_links', 10, 3 );

Альтернатива всему этому в виде плагина Custom Permalinks

Если вы не хотите мудохаться через functions.php, то рекомендую плагин Custom Permalinks. Мне он показался очень удобным — прямо в админке можно указать свои произвольные урлы.

Например при создании рубрик:

Произвольный URL рубрики при помощи плагина Custom Permalinks
Миша Рудрастых Разработчик WordPress WooCommerce

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.

Смотрите также