Kiedy oddajesz stronę klientowi, domyślny panel administracyjny często przytłacza. Pełno w nim powiadomień o promocjach wtyczek, mylących pozycji jak „Komentarze” (gdy komentarze są wyłączone) i technicznego żargonu, którego redaktor nie potrzebuje na co dzień.
Generyczny kokpit mówi „zainstalowałem motyw”. Dostosowany kokpit mówi „dostałeś narzędzie do pracy”.
W tym przewodniku przechodzimy przez praktyczną customizację panelu WordPress: czyszczenie menu pod role, własne strony wsparcia, toolbar, widżety kokpitu, CSS white-label oraz ekran logowania. Kod jest celowo krótki, bo większość problemów w produkcji bierze się z ukrywania bez kontroli uprawnień, a nie z braku frameworka opcji.

Dlaczego customizacja admina obniża liczbę ticketów
Po oddaniu sklepu WooCommerce z Elementorem klient dostaje kilkadziesiąt pozycji menu, z których używa trzech. Reszta generuje pytania: „czy mogę kliknąć Motywy?”, „co robi ACF?”, „dlaczego widzę WooCommerce → Status?”.
W jednym wdrożeniu dla redakcji lokalnej (kilku edytorów, jeden administrator agencji) po usunięciu Tools, Settings i edytorów plików z motywu liczba maili „coś zepsułem” spadła w pierwszym miesiącu mniej więcej o połowę. Nie dlatego, że panel stał się „ładniejszy”, tylko dlatego, że niebezpieczne ścieżki zniknęły z pola widzenia osób bez manage_options.
Drugi efekt: onboarding. Zamiast godzinnego szkolenia „nie klikaj tu”, pokazujesz jedną stronę „Wsparcie” z linkiem do dokumentacji, numerem osoby kontaktowej i checklistą publikacji. To jest white-label w sensie produktowym, nie tylko wymiana logo.
Sprzątanie menu administratora
Pierwszym krokiem jest remove_menu_page. Większość klientów nie musi widzieć „Narzędzi” ani „Ustawień”.
Dobra praktyka: sprawdzaj capabilities, nie ID użytkownika. Nigdy nie ukrywaj menu przed administratorami z pełnymi uprawnieniami - oni i tak wejdą URL-em, a Ty stracisz czas na debugowanie „znikającego” menu.
/**
* Oczyść menu admina dla nie-administratorów
*/
function wppoland_clean_admin_menu() {
if ( current_user_can( 'manage_options' ) ) {
return;
}
remove_menu_page( 'tools.php' );
remove_menu_page( 'options-general.php' );
remove_menu_page( 'edit-comments.php' );
remove_menu_page( 'edit.php?post_type=acf-field-group' );
remove_submenu_page( 'themes.php', 'theme-editor.php' );
remove_submenu_page( 'plugins.php', 'plugin-editor.php' );
}
add_action( 'admin_menu', 'wppoland_clean_admin_menu', 999 );Priorytet 999 jest świadomy: wiele wtyczek rejestruje menu późno. Jeśli odpalisz cleanup za wcześnie, ACF albo WooCommerce dołożą pozycje po Twoim remove_* i wrócą jak bumerang.
Ostrzeżenie warte powtórzenia: remove_menu_page tylko ukrywa link. Sprytny użytkownik nadal może wejść na /wp-admin/options-general.php bezpośrednio. Żeby zablokować dostęp, weryfikuj uprawnienia na admin_init albo current_screen i zwracaj wp_die(), gdy rola nie ma capability.
W praktyce warto też przemyśleć submenu WooCommerce. Shop manager często potrzebuje zamówień i produktów, ale nie „WooCommerce → Status” ani eksportów CSV. Tu lepiej działa remove_submenu_page niż całkowite wycięcie całego drzewa.
Dodawanie własnych stron menu
Nie używaj ciężkich frameworków opcji motywu, jeśli wystarczy jedna strona z kontaktem i krótką instrukcją. Natywne API jest lekkie i nie dokłada kolejnej warstwy update’ów.
function wppoland_register_support_page() {
add_menu_page(
'Wsparcie klienta',
'Wsparcie',
'edit_posts',
'wppoland-support',
'wppoland_render_support',
'dashicons-sos',
90
);
}
add_action( 'admin_menu', 'wppoland_register_support_page' );
function wppoland_render_support() {
?>
<div class="wrap">
<h1>Potrzebujesz pomocy?</h1>
<div class="card">
<h2>Skontaktuj się z deweloperem</h2>
<p>Opisz problem i dołącz URL panelu oraz zrzut ekranu z konsoli przeglądarki.</p>
</div>
</div>
<?php
}Capability edit_posts otwiera stronę dla redaktorów. Jeśli strona ma zawierać sekrety wdrożeniowe (klucze staging, checklisty migracji), podnieś próg do manage_options albo zrób dwie strony: „Pomoc redakcji” i „Panel agencji”.
add_submenu_page przyda się, gdy chcesz podpiąć dokumentację pod istniejące „Ustawienia” albo pod własny top-level. Unikaj tworzenia pięciu top-leveli - to powtarza problem, który właśnie czyścisz.

Dostosowywanie paska narzędzi (toolbar)
Toolbar jest widoczny na froncie dla zalogowanych użytkowników. To dobre miejsce na szybkie akcje: wyczyść cache, otwórz stronę w Page Builderze, przejdź do ostatnich zamówień.
function wppoland_customize_toolbar( $wp_admin_bar ) {
$wp_admin_bar->remove_node( 'wp-logo' );
$wp_admin_bar->add_node( [
'id' => 'clear-redis',
'title' => 'Wyczyść cache',
'href' => admin_url( 'admin-post.php?action=wppoland_clear_cache' ),
'meta' => [ 'title' => 'Opróżnij Redis Object Cache' ],
] );
}
add_action( 'admin_bar_menu', 'wppoland_customize_toolbar', 999 );Usuwanie logo WordPressa to detal brandingowy. Ważniejsze jest to, żeby akcja „Wyczyść cache” miała nonce, capability check i logowała, kto ją odpalił. Na sklepie z object cache Redis przypadkowe czyszczenie w szczycie ruchu potrafi zabić TTFB na kilka minut, zanim cache się nagrzeje.
Jeśli klient pracuje wyłącznie w wp-admin i nie potrzebuje bara na froncie, rozważ show_admin_bar filtrowane po roli. Redaktorzy często wolą czysty podgląd; deweloperzy zostawiają bar włączony.
Widżety kokpitu: ekran powitalny
Kiedy klient się loguje, ląduje w kokpicie. Domyślne widżety (wydarzenia WordPress, szybki szkic) są dla niego zwykle bezużyteczne. Zastąp je statusem, który odpowiada na pytanie „czy coś się pali?”.
function wppoland_dashboard_widgets() {
remove_meta_box( 'dashboard_primary', 'dashboard', 'side' );
remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );
wp_add_dashboard_widget(
'wppoland_status_widget',
'Status strony',
'wppoland_render_status_widget'
);
}
add_action( 'wp_dashboard_setup', 'wppoland_dashboard_widgets' );
function wppoland_render_status_widget() {
echo '<p><strong>WordPress core</strong>: aktualny</p>';
echo '<p><strong>Kopie zapasowe</strong>: codzienne</p>';
echo '<p><strong>Ruch</strong>: otwórz analitykę w nowej karcie</p>';
}W projektach z opieką techniczną warto pokazać datę ostatniego udanego backupu i wynik ostatniego health checka (PHP, cron, REST). Nie wklejaj tu marketingowych „newsów z bloga WordPress.org” - klient i tak ich nie czyta, a Ty tracisz real estate nad foldem.
Jeśli używasz kilku środowisk, dopisz badge „staging” albo „produkcja” na podstawie stałej w wp-config.php. To banalny detal, który zapobiega edycji treści na złym hoście.
White labeling przez CSS
Na koniec dodaj szlif wizualny. Załaduj własny CSS dla panelu, żeby kolorystyka pokrywała się z brandingiem klienta albo Twojej agencji. Preferuj wp_enqueue_style na admin_enqueue_scripts zamiast surowego <style> w admin_head, zwłaszcza gdy reguł robi się więcej niż kilka.
function wppoland_admin_styles() {
echo '<style>
#wpadminbar { background: #2c3e50; }
#toplevel_page_wppoland-support .wp-menu-image { color: #e74c3c !important; }
.notice.is-dismissible { display: none; }
</style>';
}
add_action( 'admin_head', 'wppoland_admin_styles' );Ukrywanie wszystkich notice’ów „na ślepo” jest ryzykowne: możesz schować krytyczne ostrzeżenia o wersji PHP albo o nieudanym cronie. Lepiej filtrować po klasie albo po tekście konkretnych wtyczek, które spamują upsellami.
Dla ról klienta często wystarczy ukrycie notice’ów typu updated od wtyczek marketingowych, przy jednoczesnym zostawieniu error i notice-error.
Personalizacja ekranu logowania
Pierwszy punkt styku klienta z systemem to /wp-login.php. Zamiast logo WordPressa pokaż logo marki.

function wppoland_login_logo() {
echo '<style type="text/css">
#login h1 a {
background-image: url(' . esc_url( get_stylesheet_directory_uri() . '/assets/images/client-logo.png' ) . ');
background-size: contain;
width: 100%;
height: 80px;
}
</style>';
}
add_action( 'login_head', 'wppoland_login_logo' );Dopnij też login_headerurl i login_headertext, żeby kliknięcie logo prowadziło na front klienta, a nie na wordpress.org. Na instalacjach z 2FA albo SSO upewnij się, że własny CSS nie psuje layoutu dodatkowych pól.
Gdzie trzymać kod i jak go testować
Customizację admina trzymaj w wtyczce, nie w functions.php motywu. Motyw zmienia się przy redesignie; role, menu i widżety mają zostać. Must-use plugin (wp-content/mu-plugins/) sprawdza się, gdy klient nie może przypadkiem wyłączyć paczki z poziomu listy wtyczek.
Testuj na koncie z rolą edytora, nie tylko jako administrator. Najczęstszy błąd: deweloper loguje się jako admin, widzi „czysty” panel (bo cleanup się nie odpala dla manage_options) i ogłasza sukces, a redaktor nadal widzi ACF i Tools.
Na stagingu worth sprawdzić też mobile wp-admin. Toolbar i własne menu potrafią rozjechać się na wąskich ekranach, zwłaszcza gdy dokładasz długie etykiety po polsku.
Role klienta vs role wewnętrzne
W typowym projekcie masz co najmniej trzy poziomy dostępu: administrator agencji, redaktor klienta i ewentualnie shop manager albo autor. Każdy poziom dostaje inny zestaw menu. Redaktor publikuje treści i media. Shop manager ogarnia zamówienia. Administrator agencji widzi wtyczki, DNS-adjacent narzędzia i logi.
Nie buduj jednej „roli klienta” na siłę. Jeśli sklep i blog prowadzą różne osoby, rozdziel capability zamiast ukrywać te same pozycje CSS-em. Ukrywanie CSS-em to antypattern: pozycja znika wizualnie, a endpoint zostaje.
Przy WooCommerce sprawdź też role z wtyczek płatności i faktur. Często doklejają własne top-level menu z upsellami. Cleanup z priorytetem 999 powinien iść po ich rejestracji; inaczej wracają po każdej aktualizacji bramki.
Powiadomienia admina bez chaosu
Drugi największy źródło ticketów po menu to notice’y. Wtyczki SEO, backupów i page builderów walczą o pasek nad listą wpisów. Klient czyta „aktualizuj pro do wersji premium” jako alarm.
Zamiast display: none na wszystkich .notice, podpinaj się pod admin_notices albo filtruj konkretne klasy / teksty. Zostaw błędy PHP, ostrzeżenia o cronie i komunikaty własne. Na kontach z manage_options możesz pokazywać więcej - to Twój kanał diagnostyczny.
Warto też wyłączyć domyślne „Try Gutenberg” i podobne nags na starych instalacjach, jeśli decyzja o edytorze już zapadła. Każdy zbędny banner to kolejne pytanie na stand-upie z klientem.
Checklist przed oddaniem klientowi
- Menu oczyszczone dla ról bez
manage_options, z priorytetem late. - Bezpośrednie URL-e do Settings/Tools zablokowane capability checkiem.
- Strona wsparcia z jasnym CTA i bez sekretów w treściach dla redaktorów.
- Toolbar bez martwych akcji; cache clear ma nonce i log.
- Kokpit pokazuje status backupów i środowiska, nie feed WordPress.org.
- Login branding + poprawne linki nagłówka.
- Kod w wtyczce, nie w motywie; przetestowany na roli edytora.
- Notice’y przefiltrowane per rola, nie globalnie wyzerowane.
- Role WooCommerce i wtyczek płatności przejrzane po update’ach.
Podsumowanie
Dostosowywanie panelu admina to UX produktu, nie kosmetyka. Usuwając bałagan i eksponując narzędzia, których klient naprawdę używa, zmniejszasz liczbę zgłoszeń i skracasz onboarding.
Jeśli przejmujesz stary WordPress z dziesiątkami ról i chaosem w menu, da się to uporządkować w ramach opieki developerskiej. Po audycie ról i wtyczek układamy checklistę zmian w adminie i wdrażamy je na stagingu przed produkcją.
Potrzebujesz takiego porządku na żywej instalacji? Napisz przez formularz kontaktowy - wystarczy krótki opis ról użytkowników i lista wtyczek z panelu.






