Ciągle mam taką samą irytację, więc pomyślałem, że zobaczę, czy są jakieś pomysły lub doświadczenia ...
Utworzyłem wtyczkę, która korzysta z własnej strony administratora. Musi. Teraz, gdy uporządkowałem rzeczy WP_List_Table (), muszę powiedzieć, że jest świetny ... ale ...
Niestandardowe strony wtyczek są zawsze ładowane, admin.php?page=...
chyba że chcę je załadować bezpośrednio z katalogu wtyczek, czego nie robię. Teraz, jeśli wykonam „akcję” z tej strony, muszę ją jakoś przetworzyć, a następnie przekierować z powrotem na stronę bez parametru akcji. Bez względu na to, czy robię GET, czy POST, naprawdę.
Na wszystkich swoich wewnętrznych stronach WP robi to na tej samej stronie, sprawdza, czy jest jakieś działanie, jeśli je przetwarza, a następnie przekierowuje do siebie bez działania. Jest to możliwe, ponieważ na tych stronach admin-header
jeszcze nie został załadowany.
Jeśli jednak spróbujesz to zrobić na własnej stronie, połowa interfejsu administratora została już wysłana do przeglądarki, więc przekierowanie nie jest już możliwe. Najwyraźniej rozwiązaniem jest POST / GET bezpośrednio na inną stronę, załadowanie do niej frameworka WP, wykonanie przetwarzania, a następnie przekierowanie z powrotem do oryginalnej strony ... ale ... to trochę denerwujące, ponieważ ... moja oryginalna strona jest ładowana przez wywołanie zwrotne, więc działa w ramach metody mojej klasy. To jest piękne.
Jeśli załaduję osobną stronę, muszę ręcznie dołączyć wp-load.php
i być poza moją klasą, co jest denerwujące, aw moim przypadku szczególnie mnie wkurza, ponieważ instynktownie instynktuję moją klasę wtyczek, aby nikt nie miał do niej dostępu z zewnątrz.
Więc po tej długiej historii ... czy ktoś wymyślił dobre rozwiązanie, aby załadować kolejną stronę za pomocą wywołania zwrotnego, bez konfigurowania całego interfejsu administratora?
(Wiem o obejściu ... mogę podłączyć funkcję, load-....
która sprawdza parametr akcji oraz wykonuje przetwarzanie i przekierowuje. Ale zastanawiam się, czy jest lepszy sposób.)
Dzięki.
[plugin-wp-pagenavi]
?[plugin-development]
z pewnością jest tu mile widziany.plugin-wp-pagenavi
... założyłem, że dotyczy to korelacji między wtyczkami a menu administratora. Ponieważ moje pytanie jest z tym związane, wybrałem ten tag.[admin-menu]
tutaj, ale nie sądzę, żeby to było naprawdę związane z tym. Zmieniłem tagi na to, co moim zdaniem pasuje, możesz oczywiście ponownie je edytować.Odpowiedzi:
Zasadniczo należy stosować żądanie POST dla większości działań, aby upewnić się, że nie zostaną one wykonane przypadkowo . Ale dobrą praktyką jest również przekierowanie na normalną stronę po żądaniu POST, aby zapobiec duplikowaniu wykonania, gdy użytkownik odświeży stronę.
Więc przepływ jest taki:
Środkowa strona nie musi być stroną wtyczki. Oznacza to, że można korzystać z „rodzajowe obsługi POST” , który został dołączony trzy lata temu, z
'admin_action_' . $_REQUEST['action']
hakiem wadmin.php
.Przykładowym użytkownikiem jest wtyczka Akismet . Jeśli chcesz go używać niezawodnie, musisz przesłać go
admin.php
bezpośrednio , a nie na inną stronę, która się na nim znajdujeadmin.php
.Oto bardzo prosty przykład tego, jak z niego korzystać:
źródło
admin.php
bezpośrednie dzwonienie to „sztuczka”, której nauczyło mnie źródło Akismet. Masz rację, gdy wyświetlasz formularz i chcesz wyświetlić go ponownie w przypadku błędów: wtedy byłoby łatwo, gdyby miejscem docelowym była strona wtyczki, ale zaczepienie gdzieś na początku (abyś mógł przekierować, jeśli się powiedzie, lub wyświetlić formularz ponownie z komunikatami o błędach, jeśli nie). Może zasugerujesz to na bilecie Trac?'load-<pagehook>'
hak do działania ... jest on wywoływany przed załadowaniem strony ... aleadmin_action_...
koncepcja wydaje się o wiele ładniejsza i bardziej szczegółowa. Uwaga: komunikaty o błędach są nadal problematyczne, jeśli wykonujesz testy POST i nie chcesz ponownie ładować przy przeładowaniu, ale to inny temat.admin_action_
hak został przesunięty przed modułem ładującym strony wtyczki.Podszedłem do tego nieco inaczej, po prostu dodając noheader = true do adresu URL akcji na stronie, na której użytkownik przesyła akcję.
Mój program obsługi następnie wykonuje akcję (tj. Zazwyczaj dodaje, aktualizuje lub usuwa), a następnie kończy działanie wp_redirect () do następnej akcji strony (np. Dodaj stronę -> edytuj stronę, usuń stronę -> stronę listy, edytuj stronę -> edytuj stronę ). Przekazuję również wiadomość na adres URL, dzięki czemu mogę wyświetlić stan, np. Aktualizację zakończoną powodzeniem lub niepowodzeniem.
Dzięki takiemu podejściu wszystkie działania: lista, dodawanie, edycja, usuwanie, usuwanie zbiorcze itp. Znajdują się w tej samej klasie i przy użyciu tego samego narzędzia administratora, dzięki czemu jest dość łatwe w utrzymaniu i zrozumieniu.
źródło
Innym innym podejściem jest po prostu dodanie ukrytego pola wejściowego do formularza:
W ten sposób WordPress wydaje się automatycznie obsługiwać przekierowanie.
źródło