WordPress Admin – problem z powiadomieniami na stronie opcji pluginu

WordPress Admin NoticesProblem dotyczy wyświetlania wiadomości w panelu administracyjnym. Podczas tworzenia strony z opcjami dla pluginu użytkownik wykonuje jakąś akcje – wypełnia formularz, klika w przyciski. Zgodnie z dobrymi zasadami projektowania aplikacji internetowych zawsze powinno się powiadamiać użytkownika czy dana akcja się udała lub nie. Do tego też został stworzony specjalny hook w api WordPressa aby dane powiadomienia zostały wyświetlone w odpowiednim miejscu.

Z założenia po stworzeniu funkcji, która wyświetla komunikat i zaczepieniu w miejscu admin_notices w miejscu poniżej nagłówka strony opcji powinien się wyświetlić komunikat. Jednak WordPress kieruje się swoimi prawami – jeżeli funkcja zostanie zaczepiona za późno (za pomocą funkcji add_action ) nie zostanie ona poprawnie dodana i niestety się nie wyświetli.

Tak jest w przypadku kiedy pracujemy na stronie z opcjami i wszelkie funkcje odpowiedzialne za odbieranie i przetwarzanie danych z formularza znajdują się w tym samym pliku, który odpowiada również za wyświetlenie wspomnianej strony z opcjami. Dla przykładu załóżmy, że na stronie aktualizuje się hasło. Przed wyświetleniem strony z opcjami znajduje się część kodu odpowiedzialna za przetworzenie danych użytkownika. Kolejno: czy hasło zostało wysłane, czy spełnia wymagania itd. W pewnym momencie skrypt dochodzi do wniosku czy hasło zostało zmienione lub nie. Niestety jeżeli w takim momencie zaczepimy funkcję od wyświetlania komunikatu do wspomnianej wcześniej akcji, nie zostanie ona wykonana.

Powód jest banalny. W tym przypadku próba zaczepienia funkcji odbywa się po wywołaniu funkcji z kolejki. W takim przypadku na pewno nie pomoże odwołanie się do wcześniejszego zaczepu ponieważ wcześniejsze akcje zostały już wykonane.

Rozwiązanie

Jednym z pierwszych rozwiązań jest przeniesienie kodu trochę wcześniej. Na przykład do pliku samego pluginu. Jednak podstawową wadą takiego rozwiązania jest przy każdorazowe wywołanie pliku przy otwieraniu strony – każdej, zarówno admina jak i frontowej.

Po krótkiej analizie kodu strony admina można łatwo zauważyć w którym momencie jest wyświetlany komunikat. Dokładnie zaraz pod tytułem strony z opcjami. Kluczem rozwiązania jest przeniesienie kodu nagłówka nad kod przetwarzający dane. W ten sposób uzyskamy satysfakcjonujący efekt.

Ciekawostka

Po dokładniejszej analizie widać że funkcje z admin_notices na początku są wyświetlane przed drukowaniem strony z opcjami. Dopiero w momencie załadowania całej strony mały skrypt javascript przenosi powiadomienia pod nagłówek strony.

Jest to właściwe jedyne rozwiązania w przypadku kiedy WordPress pozwala na samodzielne decydowanie o wyglądzie nagłówka.