WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Купить персональные IPV4 и IPV6 прокси

10+ приемов с админкой WordPress (сайт для клиента)

Одной из важнейших составных частей блога на движке WordPress является административная панель (админка). Именно с ее помощью пользователи имеют возможность управлять сайтом: дизайном, сообщениями, записями и многим другим. Разработчики сайтов должны осуществлять контроль над админкой, чтобы действия клиента не влияли кардинальным образом на внешний вид ресурса и его функциональность. Для этого, ниже описаны 10 различных хаков упрощающих контроль над админкой WordPress.

Удаление пунктов меню в админ-панели

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

add_action('admin_menu', 'remove_menus');
function remove_menus(){
	global $menu;
	$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)]);
		}
	}
}

Нужно пояснить что:

  • __('Dashboard') — главная страница админки (консоль);
  • __('Posts') — пункт меню "Записи";
  • __('Media') — пункт меню "Медиафайлы" (картинки, видео и т.п.);
  • __('Links') — никому не нужный, пункт меню "Ссылки";
  • __('Pages') — пункт меню "Страницы";
  • __('Appearance') — пункт меню "Внешний вид";
  • __('Tools') — пункт меню "инструменты" — это где всякие там: "импорт", "экспорт";
  • __('Users') — пользователи;
  • __('Settings') — пункт меню "Настройки". Его очень даже можно закрыть для клиентов, а то они настроят ...;
  • __('Comments') — комментарии;
  • __('Plugins') — ну и наконец, святое: пункт меню "Плагины".

Также, существует специальная функция WP для удаления пунктов меню и подменю: remove_menu_page() и remove_submenu_page().

меню

Удаляем админ-меню полностью

В комментариях спросили как полностью удалить админ-меню. Мне стало интересно и вот что я придумал:

add_action('admin_head', 'kill_adminmenu');
function kill_adminmenu(){
	$GLOBALS['menu'] = array();
	echo "<style>#adminmenuwrap, #adminmenuback{display:none!important;} #wpcontent{margin-left:10px!important;}</style>";
}

Вставляем код куда-нить в functions.php и у нас больше нет меню в админ-панели. Тут меню также убирается визуально и не закрывает прямой доступ к пунктам меню по ссылкам.

Получим:

меню

Свой логотип на странице входа

Какой либо практической пользы такой хак не принесет, но увеличит привлекательность и внешний вид сайта, клиенты порадуются тому, что будут видеть собственный логотип при входе в админку. То что делает хак ниже можно реализовать с помощью плагина «The Custom admin branding», но к чему плагин, когда мы можем просто добавить пару строк в файл темы functions.php.

Важно, чтобы логотип (картинка custom-login-logo.gif) находился по указанному адресу (в папке images в каталоге темы).

add_action('login_head', 'my_custom_login_logo');
function my_custom_login_logo(){
	echo '<style type="text/css">
	h1 a { background-image:url('.get_bloginfo('template_directory').'/images/custom-login-logo.gif) !important; }
	</style>';
}

2 и 3 примеры (смена логотипов в WordPress) более подробно описаны тут.

меню

Изменение внутреннего логотипа админки

Данный хак дополнит предыдущий и увеличит ощущение того, что блог создавался именно для конкретного клиента. Если мы вставим этот код в файл темы functions.php, то логотип в верхнем левом углу в админке WP изменится на нужный нам (custom-logo.gif).

Важно, чтобы логотип (картинка custom-logo.gif) находилась по указанному адресу (в папке images в каталоге темы).

## Изменение внутреннего логотипа админки. Для версий с dashicons
add_action('add_admin_bar_menus', 'reset_admin_wplogo');
function reset_admin_wplogo(  ){
	remove_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 ); // удаляем стандартную панель (логотип)

	add_action( 'admin_bar_menu', 'my_admin_bar_wp_menu', 10 ); // добавляем свою
}
function my_admin_bar_wp_menu( $wp_admin_bar ) {
	$wp_admin_bar->add_menu( array(
		'id'    => 'wp-logo',
		'title' => '<span style="font-family:dashicons; font-size:20px;" class="dashicons dashicons-carrot"></span>', // иконка dashicon
				 // можно вставить картинку <img style="max-width:100%;height:auto;" src="'. get_bloginfo('template_directory') .'/images/custom-logo.gif" alt="" >
		'href'  => home_url('/about/'),
		'meta'  => array(
			'title' => 'О моем сайте',
		),
	) );
}

В результате получим что-то такое:

wplogo

Код для WordPress ниже 3.8

function my_custom_logo(){
	echo '<style type="text/css">
	#header-logo { background-image: url('. get_bloginfo('template_directory') .'/images/custom-logo.gif) !important; }
	</style>';
}
add_action('admin_head', 'my_custom_logo');
меню

Отключение сообщений о необходимости обновиться

Пакеты обновлений для WordPress разработчики движка выпускают часто. Их обязательно необходимо устанавливать, чтобы поддержать меры безопасности на должном уровне.

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

if( ! current_user_can( 'edit_users' ) ){
	add_filter( 'auto_update_core', '__return_false' );   // обновление ядра

	add_filter( 'pre_site_transient_update_core', '__return_null' );
}
меню

Удаление лишних виджетов из консоли WordPress

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

## Удаление виджетов из Консоли WordPress
add_action( 'wp_dashboard_setup', 'clear_dash', 99 );
function clear_dash(){
	$side   = & $GLOBALS['wp_meta_boxes']['dashboard']['side']['core'];
	$normal = & $GLOBALS['wp_meta_boxes']['dashboard']['normal']['core'];

	// die( print_r($GLOBALS['wp_meta_boxes']['dashboard']) ); // смотрим что есть...

	$remove = array(
		'dashboard_activity', // последняя активность
		'dashboard_primary',  // новости wordpress
		//'dashboard_right_now',  // консоль
	);
	foreach( $remove as $id ){
		unset( $side[$id], $normal[$id] ); // или $side или $normal
	}

	// удалим welcome панель
	remove_action( 'welcome_panel', 'wp_welcome_panel' );
}

Подробнее про удаление виджетов из консоли WordPress я описывал в этой статье.

меню

Избирательное удаление виджетов для конкретных пользователей и групп

Скрытие некоторых блоков для определенных групп пользователей иногда бывает полезным. Нижеприведенный код показывает как удалить блок произвольных полей на странице редактирования поста для пользователя с уровнем ниже "редактора" (автор, помощник, подписчик):

add_action('admin_init','customize_meta_boxes');
function customize_meta_boxes(){
	if( current_user_can('moderate_comments') )
		return;

	remove_meta_box('postcustom', 'post', 'normal');
}

Список возможных значений прав пользователей смотрите в описании функции current_user_can().

Этот код также как и остальные вставляем в functions.php

меню

Добавление виджетов в консоль (админку)

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

function example_dashboard_widget_function(){
	// Показать то, что вы хотите показать
	echo "Привет, мир. Я — великий виджет админки, созданный великими программистами";
}
// Создаем функцию, используя хук действия
function example_add_dashboard_widgets() {
	wp_add_dashboard_widget('example_dashboard_widget', 'Пример виджета админки', 'example_dashboard_widget_function');
}
// Хук в 'wp_dashboard_setup', чтобы зарегистрировать нашу функцию среди других
add_action('wp_dashboard_setup', 'example_add_dashboard_widgets' );
меню

Изменение цвета шапки админки

C версии 3.8 WordPress представляет множество цветовых схем, среди которых можно подобрать наиболее подходящую.

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

add_action('admin_head', 'custom_colors');
function custom_colors() {
	echo '<style type="text/css">
	#wphead{background:#069}
	</style>';
}

Таким же образом можно указать CSS стили для любых других элементов админки.

меню

Добавление сообщений с дополнительной справкой

У основной массы клиентов могут возникать проблемы с пониманием даже простых вещей при использовании блога на WordPress. Для них существует контекстная справка, отвечающая на некоторые вопросы. Внедрение такой справки производится подобным кодом:

function my_admin_help($text, $screen) {
	// Проверим, только ли для страницы настроек это применимо
	if (strcmp($screen, MY_PAGEHOOK) == 0 ) {
		$text = 'Вот некоторая полезная информация, которая поможет вам разобраться с плагином...';
		return $text;
	}
	// Пусть по умолчанию штуки с помощью будут и на других страницах панели управления
	return $text;
}
add_action( 'contextual_help', 'my_admin_help' );
меню

Умный показ ошибок PHP

Одним из элементов защиты блога от взлома, является отключение вывода ошибок PHP на экран. Поэтому на рабочем сервере все же лучше, чтобы ошибки не показывались. По умолчанию, на многих серверах так и сделано, но во время работы над сайтом, а это часто бесконечный процесс, ошибки появляются постоянно и всегда включать/выключать становится все сложнее с каждым разом.

Поэтому мне пришел в голову такой прием: показывать ошибки PHP только, если пользователь зарегистрирован и имеет права администратора, для этого вставьте такой код в functions.php:

add_action('init', 'enable_errors');
function enable_errors(){
	if( $GLOBALS['user_level'] < 5 )
		return;

	error_reporting(E_ALL ^ E_NOTICE);
	ini_set("display_errors", 1);
}

Перед установкой кода убедитесь, что показ ошибок выключен и конфигурация PHP позволяет включить ошибки таким способом (обычно он работает).

Важно! При таком способе включения ошибок, PHP ошибки допущенные в functions.php (файл куда мы вставили код) отображаться не будут! Поэтому можно воспользоваться другим способом описанным в статье: Дебаг в WordPress

меню

Изменение размера картинки по умолчанию для вставки в контент записи

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

Воспользуемся функцией, которую необходимо добавить в файл functions.php. Комбинирую аргументы в функции, можно подобрать настройки для себя.

Предположим, предпочтительным является выравнивание по центру, ссылка — нет, т.е. изображение не кликабельное в записи, и размер — полный.

Чтобы это сделать нужно изменить значение настроек:

  • image_default_align - left, right, center, none
  • image_default_link_type - file, attachment, post, none
  • image_default_size - thumbnail, medium, large, full-size

Изменение настроек через админку

Заходим на скрытую страницу всех настроек site.ru/wp-admin/options.php и находим там вышеупомянутые настройки и меняем их:

Через хук

Для этого изменим значение настроек при активации темы через хук after_switch_theme:

## Настройки отображения файла по умолчанию
add_action( 'after_switch_theme', 'my_display_attachment_settings' );
function my_display_attachment_settings() {
	update_option( 'image_default_align', 'center' );   // left, right, center, none
	update_option( 'image_default_link_type', 'none' ); // file, attachment, post, none
	update_option( 'image_default_size', 'large' );     // thumbnail, medium, large, full-size
}
меню

Мониторинг ошибок сервера из админки

Известно всем, в WordPress можно создавать виджеты. Это можно использовать чтобы следить за PHP ошибками из консоли. Допустим, пользователь зашел на сайт и увидел какую-то ошибку, о которой вы возможно не знаете, эта ошибка была записана в лог ошибок сервера, чтобы просматривать такие ошибки прямо из консоли используйте нижеследующий код. Функция, которая будет считывать файл с логами PHP ошибок сервера и выводить ошибки из него в виджет. Также, можно будет очистить этот лог файл прямо из админки WP:

/* Логи ошибок в виджете админ-панели, в консоли
--------------------------------------------------------------------- */
function slt_PHPErrorsWidget() {
	$logfile = $_SERVER['DOCUMENT_ROOT'] . '/../error_log'; // Полный пусть до лог файла
	$displayErrorsLimit = 100; // Максимальное количество ошибок, показываемых в виджете
	$errorLengthLimit = 300; // Максимальное число символов для описания каждой ошибки
	$fileCleared = false;
	$userCanClearLog = current_user_can( 'manage_options' );

	// Очистить файл?
	if( $userCanClearLog && isset( $_GET["slt-php-errors"] ) && $_GET["slt-php-errors"]=="clear" ){
		$handle = fopen( $logfile, "w" );
		fclose( $handle );
		$fileCleared = true;
	}
	// Читаем файл
	if( file_exists( $logfile ) ){
		$errors = file( $logfile );
		$errors = array_reverse( $errors );
		if ( $fileCleared ) echo '<p><em>Файл очищен.</em></p>';
		if ( $errors ) {
			echo '<p> Ошибок: '. count( $errors ) . '.';
			if ( $userCanClearLog ) 
				echo ' [ <b><a href="'. admin_url() .'?slt-php-errors=clear" onclick="return confirm(\'Вы уверенны?\');">Очистить файл логов</a></b> ]';
			echo '</p>';
			echo '<div id="slt-php-errors" style="max-height:500px; overflow:auto; padding:5px; background-color:#FAFAFA;">';
			echo '<ol style="padding:0; margin:0;">';
			$i = 0;
			foreach( $errors as $error ){
				echo '<li style="padding:2px 4px 6px; border-bottom:1px solid #ececec;">';
				$errorOutput = preg_replace( '/\[([^\]]+)\]/', '<b>[$1]</b>', $error, 1 );
				if( strlen( $errorOutput ) > $errorLengthLimit ){
					echo substr( $errorOutput, 0, $errorLengthLimit ).' [...]';
				}
				else
					echo $errorOutput;
				echo '</li>';
				$i++;
				if( $i > $displayErrorsLimit ){
					echo '<p><em>Набралось больше чем '. $displayErrorsLimit .' ошибок в файле...</em></p>';
					break;
				}
			}
			echo '</ol></div>';
		}
		else
			echo '<p>Ошибок нет!</p>';
	}
	else
		echo '<p><em>Произошла ошибка чтения лог файла.</em></p>';
}
// Добавляем виджет
function slt_dashboardWidgets(){
	wp_add_dashboard_widget( 'slt-php-errors', 'PHP errors', 'slt_PHPErrorsWidget' );
}
add_action( 'wp_dashboard_setup', 'slt_dashboardWidgets' );
меню

Упрощаем ссылку входа

Прием устарел! С версии 3.4. ссылка /login перенаправляет на страницу входа /wp-login.php по умолчанию.

Ссылка на страницу входа (логина) в WordPress выглядит: http://example.com/wp-login.php, т.е. для входа нужно набирать в адресной строке: wp-login.php что менее удобно чем просто login, поэтому логично поправить этот момент и сделать так, чтобы по ссылке http://example.com/login пользователя бы перекидывало на страницу http://example.com/wp-login.php. Задача реализуется 2-мя способами:

Способ 1: Дополняем файл .htaccess такой строкой:
RewriteRule ^login$ http://example.com/wp-login.php [NC,L]

Не забудьте site.ru заменить на свой сайт.

Способ 2: вставляем код в functions.php:
/* редирект с login на /wp-login.php  и с admin на /wp-admin */
add_action('template_redirect', 'kama_login_redirect');
function kama_login_redirect(){
	if( strpos($_SERVER['REQUEST_URI'], 'login')!==false )
		$loc = '/wp-login.php';
	elseif( strpos($_SERVER['REQUEST_URI'], 'admin')!==false )
		$loc = '/wp-admin/';
	if( $loc ){
		header( 'Location: '.get_option('site_url').$loc, true, 303 );
		exit;
	}
}

Этот пример удобнее тем, что нет никаких site.ru... и не надо редактировать .htaccess — все изменения остаются как бы "внутри" темы.

113 комментов
Полезные 6 Вопросы 2 Все
  • Евгений ИП-Евгений.рф

    Здравствуйте.
    Я установил плагин WP Nivo Slider. Активировал.
    Во вкладке плагины он наряду со всеми установленными и активными плагинами отражается.
    Однако в консоли нет ссылки на вход в плагин для редактирования его, я соответственно не могу им работать. Что надо сделать?

    Ответить5.7 лет назад #
    • Kama7566

      Источник: http://wordpress.org/plugins/wp-nivo-slider/

      To use the WP Nivo Slider, you must first enter the settings Plug-in Option -> WP Nivo Slider and choose which category you want that displays the posts. Next you need to insert a post in that category you chose previously. In the post that you entered you need to choose a post thumbnails. WP Nivo Slider changes its size to be the size image that you inserted, or the size of the slider will depend on the Largest image. This plugin do not resize images.

      Перевод

      Для использования WP Nivo Slider, Вы должны указать настройки Plug-in Option -> WP Nivo Slider и выбрать, из каких категорий выводить посты. Далее нужно вставить пост в категорию, которую вы выбрали до этого. В каждом таком посте, нужно указать миниатюру. WP Nivo Slider изменяет свой размер, под размер изображения которое было вставлено ​​или размер слайдера будет зависеть от оригиналов изображения. Этот плагин не меняет размеры картинок.

      На скринах все видно: http://wordpress.org/plugins/wp-nivo-slider/screenshots/ вроде бы. Вы что-то не так делаете. Или плагин просто не работает.

      Ответить5.7 лет назад #
  • Евгений

    Здравствуйте!
    Касательно темы "1. Удаление лишних пунктов меню".
    Всё прописал в файл functions.php. Но почему-то пункт "Внешний вид" не исчез, хотя прописал и __('Appearance'). Не подскажите, почему именно этот пункт не исчезает, а другие все спрятались?
    Кстати, есть хороший плагин для WP - adminimize.1.8.4. Он работает аналогично вашему коду, только может намного больше, и для любого пользователя (Администратор, редактор, подписчик и т.п.). Т.е. для каждого пользователя можно что-то скрыть, а что-то оставить.

    Плагин интересный, но в нем другая проблема: если я оставляю пункт "Внешний вид", чтобы он не исчезал, то он всё равно исчезает, т.е. ситуация полностью противоположная вашему коду (ваш код не хочет скрывать Внешний вид, а плагин наоборот не хочет показывать вкладку "Внешний вид").
    Я к чему про плагин написал то: возможно вы сталкивались с ним, или, возможно, во вкладке "Внешний вид" есть какая то особенность, о который вы можете что то рассказать. Спасибо!

    Ответить5.6 лет назад #
    • Kama7566

      А функцию remove_menu_page() не пробовали использовать для удаления?

      Ответить5.6 лет назад #
      • Евгений

        Нет, не пробовал. Спасибо, обязательно протестирую.
        А с плагином adminimize.1.8.4 я всё-таки разобрался с горем пополам.
        Чтобы там правильно всё работало, нужно еще добавить 2ой плагин - user-role-editor (если кому интересно).
        Эффект отличный получается. Убираются не только основные меню, но и любые подменю, ссылки из записей, или страниц и т.п. Функционал плагинов мощный, но всё же покопаться в настройках нужно будет.
        Возможно проще вашим вариантом пользоваться smile
        Спасибо, Кама, за советы и ответы!

        -1
        Ответить5.6 лет назад #
  • Михаил artstorm.su

    если пользователь зарегистрирован и иммет права администратора

    иммет - наверное должно быть имеет ))

    Ответить5.5 лет назад #
  • Сергей

    отличные хаки!smile

    Ответить5.5 лет назад #
  • Павел comesite.ru

    Замена логотипа на входе в админку очень путевая штука!
    Буквально вчера меня просили на одном из сайтов клиента поменять логотип на их картинку! Если честно до этого и не знал что это можно сделать smile

    Ответить5 лет назад #
  • Владимир

    4. Изменение внутреннего логотипа админки

    Не получаетса изменить етот логотип. Версия WordPress - 4.1. Етот хак еще актуален? Мне кажетса там логотип настроен через dashicons. Подскажите, может я что не так делаю (логотип свой подготовил, пути перепроверил, изменил и скопировал код в functions.php теми).

    Ответить4.3 года назад #
    • Kama7566

      Дополнил этот момент... Теперь работает для WordPress - 4.1

      Ответить4.3 года назад #
  • Павел76 lincaseidhe.ru

    Как удалить виджеты, которые выводят плагины? копаться в коде и искать как они называются? конкретно плагин Seo Yoast и bbpress

    Ответить3.7 года назад #
    • Павел76 lincaseidhe.ru

      а все, разобрался, в ваш код добавляю строку, и в квадратных скобках подставляем значение id бокса в котором висит виджет плагина

      Ответить3.7 года назад #
  • Актуально касаемо ссылки создаваемой плагином. Использую плагин по созданию произвольных полей, так вот сами поля для заказчика конечно нужно. Но лезть, ломать их или перенастраивать в сам плагин и т.д вовсе не обязательно.
    Круто было бы прятать и меню создаваемые плагинами после их настройки.

    2
    Ответить3.6 года назад #
    • Алексей

      Gran, Привет!
      Удалить пункты меню от плагинов.
      Ссылка в меню админки: admin.php?page=super_plagin
      В итоге:

      remove_menu_page( 'super_plagin' ); // Super Plagin
      2
      Ответить2.9 года назад #
      • Gran

        Сперва не проканало, потом дошло, что нужно вешать на хук:

        function remove_menu_plugin() {
          remove_menu_page( 'plugin_name' ); 
        }
        add_action('admin_menu', 'remove_menu_plugin');
        Ответить2.9 года назад #
  • rednail

    appearance не убирает раздел "внешний вид", Вп версии 4 4 1

    1
    Ответить3.5 года назад #
  • adward6 tatar-congress.org

    Вы не подскажете, как в админке, в списке записей, отображать не автора поста, а имя последнего редактировавшего пост?

    Спасибо.

    Ответить2.7 года назад #
    • Kama7566

      get_the_modified_author() по коду видно что ID кто редактировал находится в метаполе _edit_last

      $last_id = get_post_meta( get_post()->ID, '_edit_last', true );
      $last_user = get_userdata($last_id);
      echo $last_user->display_name;
      Ответить2.7 года назад #
Здравствуйте, !     Войти . Зарегистрироваться