Создание персональных страниц в WordPress

Перед тем как приступить к разработке личных дневников для одного моего сайта, нужно было определится в каком формате были бы ссылки. В голове крутились 2 варианта.

Либо:

blog.site.com

Либо:

site.com/users/blog

Сам я больше склонялся к второму варианту, но все же, немного сомневаясь задал вопрос на searchengines. Ответов не много, но меня они убедили остановится на втором варианте.

Дальше дело было за технической стороной. И по началу возникли трудности.

Для начала я хочу предложить пользователям сайта:
1. Вести личный дневник. Ссылка вида: site.com/users/lnx/blog
2. Создавать отчеты о рыбалке. Ссылка вида: site.com/users/lnx/foto
3. Писать собственные статьи. Ссылка вида: site.com/users/lnx/articles

К сожалению техника индивидуальных шаблонов не подходит в моем случае, потому как wordpress по запросу site.com/users/lnx/blog (где users — индивидуальная страница) сгенерирует 404 ошибку.

Да… можно пожертвовать красивыми ссылками, и использовать ссылки с GET запросами вида:

site.com/users/?u=lnx&action=blog

site.com/users/?u=lnx&action=foto

site.com/users/?u=lnx&action=articles

Но как говорится они нынче не в моде… всем подавай ЧПУ.

Так как же быть?

Такой же вопрос я задал себе и полез в исходники wordpress. Задача была следующая: найти код, в котором wordpress анализирует запросы и делает соответствующий вывод. Например при запросе /feed/ — вывод RSS ленты, или при запросе главной страницы — вызов функции get_home_template()

Файл который занимается этим называется template-loader.php

В самом начале стоит хук-функция

do_action('template_redirect');
	if ( is_robots() ) {
		do_action('do_robots');
		return;
	} else if ( is_feed() ) {
		do_feed();
		return;
	} else if ( is_trackback() ) {
		include(ABSPATH . 'wp-trackback.php');
		return;

Таким образом можно написать плагин, но к сожалению из плагина никак нельзя прервать дальнейшее выполнение кода в template-loader.php (если не прервать, будет выдана 404 ошибка), потому я позволил себе то, что дисциплинированный программист не должен позволять, а именно влезть в чужой код.

Мне всего-лишь нужно было в самом начале сделать проверку на соответствие запрашиваемой у ВП ссылки маске «/\/users\/?.*/» и в случае если урл подходит — загрузить мой шаблонный файл users.php и передать ему управление.

Вот как стало выглядеть начало template-loader.php после моих модификаций:

do_action('template_redirect');

	if( preg_match('/\/users\/?.*/',$_SERVER["REQUEST_URI"]) ){
		if( file_exists(TEMPLATEPATH . "/users.php") ) {
			include(TEMPLATEPATH . "/users.php");
			return;
		}
	}

Нужного эффекта я добился. Далее в файле users.php я сделаю полноценный шаблон для личных страниц, а через анализ $_SERVER[«REQUEST_URI»] выясню к какой именно личной странице идет запрос.