
20 полезных хаков для админки WordPress
- Stats: 7787 2
- Author: admin
- Category: CMS WordPress, Статті
- Comments: Комментариев нет

Подборка хаков, которые можно использовать для админ-панели WordPress. Все коды проверены на работоспособность до версии WP 4.7. Здесь собраны популярные хуки и очень полезные советы по настройке.
1. Все настройки сайта на одной странице
Включение спрятанной страница админ панели. Этот маленький кусок кода, добавит еще один пункт в меню настроек сайта. Перейдя на добавленную страницу, вы увидите все настройки сайта сразу. На такую страницу можно попасть по ссылке: site.ru/wp-admin/options.php
.
Код срабатывает только для администратора сайта, другие роли новый пункт меню не увидят.
1 2 3 4 5 |
## Добавляет ссылку на страницу всех настроек в пункт меню админки "Настройки" add_action('admin_menu', 'all_settings_link'); function all_settings_link(){ add_options_page( __('All Settings'), __('All Settings'), 'manage_options', 'options.php'); } |
2. Удаляем уведомление об обновлении WordPress для всех кроме админа
1 2 3 4 5 |
## удаляет сообщение о новой версии WordPress у всех пользователей кроме администратора if( is_admin() && ! current_user_can('manage_options') ){ add_action('init', function(){ remove_action( 'init', 'wp_version_check' ); }, 2 ); add_filter('pre_option_update_core', '__return_null'); } |
3. Удаление метабоксов на странице редактирования записи
На странице редактирования записи очень часто находятся никогда не используемые метабоксы. И чтобы немного ускорить админку и убрать лишнее из интерфейса, их можно удалить. Подробнее читайте в описании функции remove_meta_box()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
## Удаление метабоксов на странице редактирования записи add_action('admin_menu','remove_default_post_screen_metaboxes'); function remove_default_post_screen_metaboxes() { // для постов remove_meta_box( 'postcustom','post','normal' ); // произвольные поля remove_meta_box( 'postexcerpt','post','normal' ); // цитата remove_meta_box( 'commentstatusdiv','post','normal' ); // комменты remove_meta_box( 'trackbacksdiv','post','normal' ); // блок уведомлений remove_meta_box( 'slugdiv','post','normal' ); // блок альтернативного названия статьи remove_meta_box( 'authordiv','post','normal' ); // автор // для страниц remove_meta_box( 'postcustom','page','normal' ); // произвольные поля remove_meta_box( 'postexcerpt','page','normal' ); // цитата remove_meta_box( 'commentstatusdiv','page','normal' ); // комменты remove_meta_box( 'trackbacksdiv','page','normal' ); // блок уведомлений remove_meta_box( 'slugdiv','page','normal' ); // блок альтернативного названия статьи remove_meta_box( 'authordiv','page','normal' ); // автор } |
4. Произвольный порядок пунктов в главном меню админ-панели
В WordPress есть особенность, которая позволяет изменить порядок пунктов главного меню в админке как угодно. Об этой возможности знают далеко не все. По умолчанию она не работает — её нужно включить через хук custom_menu_order
. Подробнее смотрите в коде ниже.
Код ниже изменит порядок меню. Сначала будет идти «Страницы», потом «Записи», а потом произвольный тип записей «events». Меняя порядок элементов массива, можно изменить порядок пунктов меню как угодно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
## Произвольный порядок пунктов в главном меню админки if( is_admin() ){ add_filter('custom_menu_order', '__return_true'); // включаем ручную сортировку add_filter('menu_order', 'custom_menu_order'); // ручная сортировка function custom_menu_order( $menu_order ){ /* $menu_order - массив где элементы меню выставлены в нужном порядке. Array( [0] => index.php [1] => separator1 [2] => edit.php [3] => upload.php [4] => edit.php?post_type=page [5] => edit-comments.php [6] => edit.php?post_type=events [7] => separator2 [8] => themes.php [9] => plugins.php [10] => snippets [11] => users.php [12] => tools.php [13] => options-general.php [14] => separator-last [15] => edit.php?post_type=cfs ) */ if( ! $menu_order ) return true; return array( 'index.php', // консоль 'edit.php?post_type=page', // страницы 'edit.php', // посты 'edit.php?post_type=events', // записи типа events ); } } |
5. Удаление вкладок «Все рубрики» и «Часто используемые» у метабокса рубрик в админке
Этот хак я часто использую то тут то там. По-моему это удобно!
Код удалить такие вкладки и у метабоксов произвольных древовидных таксономий.
1 2 3 4 5 6 7 8 9 10 11 12 |
## Удаление табов "Все рубрики" и "Часто используемые" из метабоксов рубрик (таксономий) на странице редактирования записи. add_action('admin_print_footer_scripts', 'hide_tax_metabox_tabs_admin_styles', 99); function hide_tax_metabox_tabs_admin_styles(){ $cs = get_current_screen(); if( $cs->base !== 'post' || empty($cs->post_type) ) return; // не страница редактирования записи ?> <style> .postbox div.tabs-panel{ max-height:1200px; border:0; } .category-tabs{ display:none; } </style> <?php } |
6. Перемещаем выбранную рубрику сверху на свое место в иерархии
Есть древовидная структура категорий.
Я публикую запись и помещаю её в дочернюю рубрику.
В результате, выбранная рубрика находится вверху, а нужно, чтобы она была на своем месте, в иерархии рубрик.
1 2 3 4 5 6 7 8 9 |
## отменим показ выбранного термина наверху в checkbox списке терминов add_filter( 'wp_terms_checklist_args', 'set_checked_ontop_default', 10 ); function set_checked_ontop_default( $args ) { // изменим параметр по умолчанию на false if( ! isset($args['checked_ontop']) ) $args['checked_ontop'] = false; return $args; } |
7. Добавляем типы записей, таксономии в виджет «На виду» («Прямо сейчас») в консоли
Чтобы в консоли сразу было видны числа — сколько записей каждого типа создано, можно расширить виджет «На виду» (раньше он назывался «Прямо сейчас»).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
## Добавляем все типы записей в виджет "Прямо сейчас" в консоли add_action( 'dashboard_glance_items' , 'add_right_now_info' ); function add_right_now_info( $items ){ if( ! current_user_can('edit_posts') ) return $items; // выходим // типы записей $args = array( 'public' => true, '_builtin' => false ); $post_types = get_post_types( $args, 'object', 'and' ); foreach( $post_types as $post_type ){ $num_posts = wp_count_posts( $post_type->name ); $num = number_format_i18n( $num_posts->publish ); $text = _n( $post_type->labels->singular_name, $post_type->labels->name, intval( $num_posts->publish ) ); $items[] = "<a href=\"edit.php?post_type=$post_type->name\">$num $text</a>"; } // таксономии $taxonomies = get_taxonomies( $args, 'object', 'and' ); foreach( $taxonomies as $taxonomy ){ $num_terms = wp_count_terms( $taxonomy->name ); $num = number_format_i18n( $num_terms ); $text = _n( $taxonomy->labels->singular_name, $taxonomy->labels->name , intval( $num_terms ) ); $items[] = "<a href='edit-tags.php?taxonomy=$taxonomy->name'>$num $text</a>"; } // пользователи global $wpdb; $num = $wpdb->get_var("SELECT COUNT(ID) FROM $wpdb->users"); $text = _n( 'User', 'Users', $num ); $items[] = "<a href='users.php'>$num $text</a>"; return $items; } |
8. Добавляет миниатюры записи в таблицу записей в админке
В таблице записей в админке иногда очень удобно видеть какая для записи установлена миниатюра или первая загруженная картинка. Такую колонку легко можно добавить, установив небольшой код.
Он работает автоматически для всех типов записей. Но если миниатюра нужна на конкретных, то раскомментируйте строку в коде и укажите типы записей для которых нужно выводить миниатюру.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
## Добавляет миниатюры записи в таблицу записей в админке if(1){ add_action('init', 'add_post_thumbs_in_post_list_table', 20 ); function add_post_thumbs_in_post_list_table(){ // проверим какие записи поддерживают миниатюры $supports = get_theme_support('post-thumbnails'); // $ptype_names = array('post','page'); // указывает типы для которых нужна колонка отдельно // Определяем типы записей автоматически if( ! isset($ptype_names) ){ if( $supports === true ){ $ptype_names = get_post_types(array( 'public'=>true ), 'names'); $ptype_names = array_diff( $ptype_names, array('attachment') ); } // для отдельных типов записей elseif( is_array($supports) ){ $ptype_names = $supports[0]; } } // добавляем фильтры для всех найденных типов записей foreach( $ptype_names as $ptype ){ add_filter( "manage_{$ptype}_posts_columns", 'add_thumb_column' ); add_action( "manage_{$ptype}_posts_custom_column", 'add_thumb_value', 10, 2 ); } } // добавим колонку function add_thumb_column( $columns ){ // подправим ширину колонки через css add_action('admin_notices', function(){ echo ' <style> .column-thumbnail{ width:80px; text-align:center; } </style>'; }); $num = 1; // после какой по счету колонки вставлять новые $new_columns = array( 'thumbnail' => __('Thumbnail') ); return array_slice( $columns, 0, $num ) + $new_columns + array_slice( $columns, $num ); } // заполним колонку function add_thumb_value( $colname, $post_id ){ if( 'thumbnail' == $colname ){ $width = $height = 45; // миниатюра if( $thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true ) ){ $thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true ); } // из галереи... elseif( $attachments = get_children( array( 'post_parent' => $post_id, 'post_mime_type' => 'image', 'post_type' => 'attachment', 'numberposts' => 1, 'order' => 'DESC', ) ) ){ $attach = array_shift( $attachments ); $thumb = wp_get_attachment_image( $attach->ID, array($width, $height), true ); } echo empty($thumb) ? ' ' : $thumb; } } } |
9. Отключаем пинги на свои (внутренние) записи
Когда публикуется запись со ссылкой в тексте на другую запись вашего же сайта у которой включена возможность получать уведомления, в комментариях появляется пинг — уведомление что запись была процетирована где-то. Это удобно, чтобы видеть что на вашу запись кто-то сослался, но когда ссылается ваш сайт на ваш сайт — это нелогично и даже мешает.
Чтобы отключить такое странное поведение, вставьте следующий код в functions.php
:
1 2 3 4 5 6 7 |
## Отключаем пинги на свои же посты add_action('pre_ping', 'kama_disable_inner_ping'); function kama_disable_inner_ping( &$links ){ foreach( $links as $k => $val ) if( false !== strpos( $val, str_replace('www.', '', $_SERVER['HTTP_HOST']) ) ) unset( $links[$k] ); } |
10. Отключаем все стандартные виджеты WordPress
Чтобы отключить все виджеты WordPress, которые существуют по умолчанию, вставьте в functions.php
такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
add_action('widgets_init', 'unregister_basic_widgets' ); function unregister_basic_widgets() { unregister_widget('WP_Widget_Pages'); // Виджет страниц unregister_widget('WP_Widget_Calendar'); // Календарь unregister_widget('WP_Widget_Archives'); // Архивы unregister_widget('WP_Widget_Links'); // Ссылки unregister_widget('WP_Widget_Meta'); // Мета виджет unregister_widget('WP_Widget_Search'); // Поиск unregister_widget('WP_Widget_Text'); // Текст unregister_widget('WP_Widget_Categories'); // Категории unregister_widget('WP_Widget_Recent_Posts'); // Последние записи unregister_widget('WP_Widget_Recent_Comments'); // Последние комментарии unregister_widget('WP_Widget_RSS'); // RSS unregister_widget('WP_Widget_Tag_Cloud'); // Облако меток unregister_widget('WP_Nav_Menu_Widget'); // Меню } |
11. Изменение названия типа записи
По умолчанию в WordPress есть два типа записи: Записи (post) и Страницы (page). Этот пример показывает как изменить их названия по всей админке.
Иногда удобно или логично заменить слово «Записи» и все связанные названия «Записей» в админке на другое слово, например «Посты». Такую замену я сделал на этом сайте:
Код простой и работает очень быстро:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
## заменим слово "записи" на "посты" для типа записей 'post' add_filter('post_type_labels_post', 'rename_posts_labels'); function rename_posts_labels( $labels ){ // заменять автоматически нельзя: Запись = Статья, а в тексте получим "Просмотреть статья" $new = array( 'name' => 'Посты', 'singular_name' => 'Пост', 'add_new' => 'Добавить пост', 'add_new_item' => 'Добавить пост', 'edit_item' => 'Редактировать пост', 'new_item' => 'Новый пост', 'view_item' => 'Просмотреть пост', 'search_items' => 'Поиск постов', 'not_found' => 'Посты не найдены.', 'not_found_in_trash' => 'Посты в корзине не найдены.', 'parent_item_colon' => '', 'all_items' => 'Все посты', 'archives' => 'Архивы постов', 'insert_into_item' => 'Вставить в пост', 'uploaded_to_this_item' => 'Загруженные для этого поста', 'featured_image' => 'Миниатюра поста', 'filter_items_list' => 'Фильтровать список постов', 'items_list_navigation' => 'Навигация по списку постов', 'items_list' => 'Список постов', 'menu_name' => 'Посты', 'name_admin_bar' => 'Пост', // пункте "добавить" ); return (object) array_merge( (array) $labels, $new ); } |
12. Отключим уведомление об обновлении только для неактивных плагинов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
add_filter('transient_update_plugins', 'update_active_plugins'); // Hook for 2.8.+ //add_filter('option_update_plugins', 'update_active_plugins'); // Hook for 2.7.x function update_active_plugins( $value = '' ){ /* The $value array passed in contains the list of plugins with time marks when the last time the groups was checked for version match The $value->reponse node contains an array of the items that are out of date. This response node is use by the 'Plugins' menu for example to indicate there are updates. Also on the actual plugins listing to provide the yellow box below a given plugin to indicate action is needed by the user. */ if( (isset($value->response)) && (count($value->response)) ){ // Get the list cut current active plugins $active_plugins = get_option('active_plugins'); if ($active_plugins) { // Here we start to compare the $value->response // items checking each against the active plugins list. foreach($value->response as $plugin_idx => $plugin_item) { // If the response item is not an active plugin then remove it. // This will prevent WordPress from indicating the plugin needs update actions. if (!in_array($plugin_idx, $active_plugins)) unset($value->response[$plugin_idx]); } } else { // If no active plugins then ignore the inactive out of date ones. foreach($value->response as $plugin_idx => $plugin_item) { unset($value->response); } } } return $value; } |
Важно: отключать уведомления об обновлении даже для неактивный плагинов, может быть опасно. Когда в плагине может быть уязвимый файл, который можно использовать независимо от активности плагина. Впрочем, это большая редкость...
13. Авто-удаление license.txt и readme.html
В основном каталоге WordPress есть эти два файла. Их может открыть кто угодно и так определить работает сайт на WordPress и какая именно версия используется.
Как работает? Проверяет наличие файла, когда вы заходите в админку. Если файл есть, то PHP пытается его удалить автоматически. Если для удаления недостаточно прав, то админ увидит сообщение о том, что нужно удалить файлы license.txt и readme.html.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
## Удаление файлов license.txt и readme.html для защиты if( is_admin() && ! defined('DOING_AJAX') ){ $license_file = ABSPATH .'/license.txt'; $readme_file = ABSPATH .'/readme.html'; if( file_exists($license_file) && current_user_can('manage_options') ){ $deleted = unlink($license_file) && unlink($readme_file); if( ! $deleted ) $GLOBALS['readmedel'] = 'Не удалось удалить файлы: license.txt и readme.html из папки `'. ABSPATH .'`. Удалите их вручную!'; else $GLOBALS['readmedel'] = 'Файлы: license.txt и readme.html удалены из из папки `'. ABSPATH .'`.'; add_action( 'admin_notices', function(){ echo '<div class="error is-dismissible"><p>'. $GLOBALS['readmedel'] .'</p></div>'; } ); } } |
14. Подсказки (счетчики) в меню админ-панели
Если есть обновления плагинов, то в меню мы видим кружок с числом плагинов. Такие же кружки с номерами можно добавить к любому пункту меню. Например, нам нужно показывать такое уведомление, если есть записи на проверке:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
add_action( 'admin_menu', 'add_user_menu_bubble' ); function add_user_menu_bubble(){ global $menu; // записи $count = wp_count_posts()->pending; // на утверждении if( $count ){ foreach( $menu as $key => $value ){ if( $menu[$key][2] == 'edit.php' ){ $menu[$key][0] .= ' <span class="awaiting-mod"><span class="pending-count">' . $count . '</span></span>'; break; } } } } |
15. Удаление пунктов меню в админ-панели
При создании блога целесообразно запретить доступ к определенным функциям. Таким образом удастся избежать многих проблем, включая случайное удаление основной темы. Для этого необходимо внедрить код в имеющийся файл темы functions.php
. Следует добавить, что такое удаление пунктов меню не запрещает прямой доступ к ним (доступ по ссылке), а всего лишь визуально убирает пункты меню:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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') — ну и наконец, святое: пункт меню «Плагины».
16. Удаляем админ-меню полностью
1 2 3 4 5 |
add_action('admin_head', 'kill_adminmenu'); function kill_adminmenu(){ $GLOBALS['menu'] = array(); echo "<style type='text/css'>#adminmenuwrap, #adminmenuback{display:none!important;} #wpcontent{margin-left:10px!important;}</style>"; } |
17. Свой логотип на странице входа
Какой либо практической пользы такой хак не принесет, но увеличит привлекательность и внешний вид сайта, клиенты порадуются тому, что будут видеть собственный логотип при входе в админку. То что делает хак ниже можно реализовать с помощью плагина «The Custom admin branding», но к чему плагин, когда мы можем просто добавить пару строк в файл темы functions.php
.
Важно, чтобы логотип (картинка custom-login-logo.gif) находился по указанному адресу (в папке images в каталоге темы).
1 2 3 4 5 6 |
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>'; } add_action('login_head', 'my_custom_login_logo'); |
18. Изменение внутреннего логотипа админки
Данный хак дополнит предыдущий и увеличит ощущение того, что блог создавался именно для конкретного клиента. Если мы вставим этот код в файл темы functions.php
, то логотип в верхнем левом углу в админке WP изменится на нужный нам (custom-logo.gif
).
Важно, чтобы логотип (картинка custom-logo.gif
) находилась по указанному адресу (в папке images в каталоге темы).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
## Изменение внутреннего логотипа админки. Для версий с 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' => 'О моем сайте', ), ) ); } |
В результате получим что-то такое:
19. Отключение сообщений о необходимости обновится
Пакеты обновлений для WordPress разработчики движка выпускают часто. Их обязательно необходимо устанавливать, чтобы поддержать меры безопасности на должном уровне.
Однако клиентам о различных обязательных изменениях лучше не знать. Это позволит избежать необоснованного волнения, что что-то не так с сайтом. Делается это просто, следует вставить такой код в файл темы functions.php
:
1 2 3 4 5 |
if( ! current_user_can( 'edit_users' ) ){ add_filter( 'auto_update_core', '__return_false' ); // обновление ядра add_filter( 'pre_site_transient_update_core', '__return_null' ); } |
20. Изменение цвета шапки админки
Иногда возможно нужно изменить белый фон шапки админки, например чтобы цвета соответствовали цветам бренда клиента или еще по каким-то причинам. Чтобы изменить цветовую схему воспользуйтесь следующим хуком и укажите цвета в CSS стилях:
1 2 3 4 5 6 |
add_action('admin_head', 'custom_colors'); function custom_colors() { echo '<style type="text/css"> #wphead{background:#069} </style>'; } |
Отправить ответ