4 Июнь 2013

Чистый личный кабинет WordPress

Приветствую вас, уважаемый читатель! В данной статье речь пойдет об удалении лишнего из профиля пользователя блога на WordPress и выводе туда дополнительной информации.

В WordPress есть механизм регистрации, авторизации и профиля пользователя. Очень хочется воспользоваться готовым функционалом, дабы не лепить свой собственный велосипед. Ранее я уже рассказывал об интеграции стандартной вордпрессовской регистрации и авторизации в интерфейс сайта. Теперь осталось понять, как выкинуть мусор из профиля пользователя и вывести туда действительно нужную информацию.

Если зарегистрироваться как новый пользователь с правами подписчика, то профиль пользователя (или личный кабинет), доступный по ссылке imya_saita.ru/wp-admin/profile.php будет иметь внешний вид, представленный на рис. 1. Согласитесь, куча лишнего хлама.

Личный кабинет WordPress, вид по умолчанию

Рис. 1.  Стандартный вид профиля пользователя WordPress с правами подписчика.

На рис. 1. цифрами обозначены проблемные места, которые мы будем последовательно убирать.

Принцип кодирования следующий: в процессе загрузки страницы движок генерирует события, называемые хуками. При возникновении хука можно запустить написанный нами код. Для того, чтобы наш программный код был воспринят движком, необходимо вставить его в файл function.php активной темы.

Поехали.

Видеоурок

Видеоурок записан при поддержке новой статейной биржи от SeoPult — WebArtex. В системе работают только высокоуровневые сайты, которые не светятся и не светились ранее в линкоброкерах. Такие площадки предельно безопасны и предельно эффективны для оптимизаторов.

Пояснение к видеоуроку, исходники
1. Удаление лого WP и выпадающего меню. Добавление ссылки «На главную».

//Удаление логотипа WordPress из горизонтального меню
add_action( 'admin_bar_menu', 'remove_wp_logo', 999 );

function remove_wp_logo( $wp_admin_bar )
{
	if(!current_user_can('administrator'))
	{
		$wp_admin_bar->remove_node('wp-logo');
		$wp_admin_bar->remove_node('site-name');

		$args = array(
			'id' => 'sdelaysite_home_page',
			'title' => 'На главную',
			'href' => '/',
			'meta' => array('class' => 'my-toolbar-page')
		);
		$wp_admin_bar->add_node($args);
	}
}

Изменение горизонтального меню администратора WordPress

Рис. 2. Результат действия вышеприведенного кода.

2. Удаление ссылки на консоль.

// Удаление ссылки на консоль и других лишних пунктов
add_action('admin_menu', 'remove_menus');

function remove_menus ()
{
	global $menu;
	
	if(!current_user_can('administrator'))
	{
		$restricted = array(__('Dashboard'), __('Posts'), __('Media'), __('Links'), __('Pages'), __('Appearance'), __('Tools'), __('Users'), __('Settings'), __('Comments'), __('Plugins'));
		end ($menu);
		while (prev($menu))
		{
			$value = explode(' ',$menu[key($menu)][0]);
			if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
		}
	}
}

3. Удаление левого вертикального меню, подвала и помощи.

В данном пункте применен несколько иной подход. При возникновении хука admin_print_scripts-profile.php выполняется вывод дополнительных стилей, которые скрывают блоки с указанными идентификаторами. Если вы хотите спрятать любой другой блок, имеющий идентификатор, можете воспользоваться предложенным способом.

// Удаление левого вертикального меню, подвала, информации о версии движка
add_action('admin_print_scripts-profile.php', 'hide_admin_bar_prefs');

function hide_admin_bar_prefs()
{
	if(!current_user_can('administrator'))
	{
?>
	<style type="text/css">
		#adminmenuback, #adminmenuwrap, .update-nag, #contextual-help-link-wrap, #footer, #wpfooter{
			display: none;
		}
	</style>
<?php
	}
}

4. Удаление цветовой схемы.

Опять-таки, несколько иной подход. Функция, выводившая переключатель цветовой схемы, просто отключается.

//Удаление цветовой схемы
remove_action( 'admin_color_scheme_picker', 'admin_color_scheme_picker' );

5. Удаление заголовка «Персональные настройки», чекбокса «Показывать верхнюю панель при просмотре сайта» и изменение заголовка «Контакты» на «Персональные данные».

В данном пункте используется подход, аналогичный описанному в третьем пункте. Вся разница в том, что удаление блоков не возможно посредством CSS, т.к. у блоков нет уникальных идентификаторов. Благодаря возможности селекторов jQuery гибко выбирать нужный объект и выполнять над ним широкий спектр действий, мне удалось сделать задуманное.

Хук personal_options запускает функцию, выводящую нужный jQuery-код.

// Удаление пункта Персональные настройки, изменение названия заголовков
add_action( 'personal_options', 'ozh_personal_options');

function ozh_personal_options() 
{
	if(!current_user_can('administrator'))
	{
?>
<script type="text/javascript">
  jQuery(document).ready(function(){
    jQuery("#your-profile .form-table:first, #your-profile h3:first").remove();
    jQuery("#your-profile h3:eq(1)").html('Персональные данные');
  });
</script>
<?php
}
}

6. Изменение полей ввода контактной информации.

Код демонстрирует возможность удалить стандартными функциями WP лишние поля ввода контактных данных (строки 7 — 8).

В строке 10 выполняется добавление нового способа контактов под названием «Skype».

E-mail — обязательное поле, как удалить его я не знаю. Кроме того, я не знаю, как стандартным образом удалить поле ввода адреса сайта. Можно попробовать jQuery подход, описанный в пункте 5.

//Изменение контактов
add_filter('user_contactmethods', 'my_user_contactmethods');

function my_user_contactmethods($user_contactmethods)
{
	unset($user_contactmethods['jabber']);
	unset($user_contactmethods['yim']); 
	unset($user_contactmethods['aim']);

	$user_contactmethods['skype'] = '<b>Skype</b>'; 

	return $user_contactmethods;
}

7. Удаление биографии.

Для удаления биографии я нашел решение, которое не берусь комментировать. Однако, оно работает. Думаю, аналогичный результат можно получить воспользовавшись jQuery-подходом пятого пункта.

// Удаление биографии, обо мне
add_action( 'personal_options', array ( 'T5_Hide_Profile_Bio_Box', 'start' ) );

/**
 * Captures the part with the biobox in an output buffer and removes it.
 *
 * @author Thomas Scholz, <info@toscho.de>
 *
 */
class T5_Hide_Profile_Bio_Box
{
    /**
     * Called on 'personal_options'.
     *
     * @return void
     */
    public static function start()
    {
        if(!current_user_can('administrator'))
        {
        	$action = ( IS_PROFILE_PAGE ? 'show' : 'edit' ) . '_user_profile';
	        add_action( $action, array ( __CLASS__, 'stop' ) );
	        ob_start();
        }
    }

    /**
     * Strips the bio box from the buffered content.
     *
     * @return void
     */
    public static function stop()
    {
        if(!current_user_can('administrator'))
        {
	        $html = ob_get_contents();
	        ob_end_clean();

	        // remove the headline
	        $headline = __( IS_PROFILE_PAGE ? 'About Yourself' : 'About the user' );
	        $html = str_replace( '<h3>' . $headline . '</h3>', '', $html );

	        // remove the table row
	        $html = preg_replace( '~<tr>\s*<th><label for="description".*</tr>~imsUu', '', $html );
	        print $html;
	    }
    }
}

Скачать исходники (*.txt, 3.9 кБайт).

С уважением, Андрей Морковин.