Problem
Wszyscy znaleźliśmy się w takiej sytuacji i wiele pytań na tej stronie potrzebuje takiego rozwiązania. Musisz albo zaktualizować bazę danych, automatycznie wstawić dużo danych, przekonwertować meta_keys
lub coś podobnego.
Oczywiście w działającym systemie opartym na najlepszych praktykach tak się nie powinno stać.
Ale tak się stanie, chciałbym usłyszeć twoje osobiste rozwiązanie tego problemu i dlaczego wybrałeś swoje.
Pytanie
Jak wdrożyć jednorazowe skrypty w (działającej) instalacji WordPress?
Problem dotyczy głównie następujących powodów:
- Skrypty wstawiające dane nie powinny być uruchamiane więcej niż jeden raz
- Skrypty wymagające dużej ilości zasobów nie powinny być uruchamiane w czasie, gdy nie można ich monitorować
- Nie powinny być uruchamiane przypadkowo
Powód, o który pytam
Mam swoją własną praktykę, zamierzam zamieścić ją w odpowiedziach. Ponieważ nie wiem, czy jest to najlepsze rozwiązanie, chciałbym wiedzieć o twoim. Jest to również pytanie, które jest zadawane wiele razy w kontekście innych pytań, i byłoby wspaniale mieć zasoby gromadzące pomysły.
czekam na naukę od ciebie :)
źródło
wp-cron
zaplanowanych zdarzeniach.Odpowiedzi:
Dla siebie używam kombinacji:
Struktura
Korzystam z pliku (
onetime.php
) w moim folderzeinc
dołączania, który jest zawartyfunctions.php
i usunięty stamtąd po użyciu.Plik dla samego skryptu
W mojej
onetime.php
funkcjif711_my_onetime_function()
jest umieszczona. Jak może to być dowolna funkcja. Zakładam, że twój skrypt jest przetestowany i działa poprawnie.Aby uzyskać kontrolę nad wykonywaniem skryptu, używam obu
Kontrola zdolności
Aby powstrzymać innych użytkowników przed przypadkowym uruchomieniem mojego skryptu:
lub
przemijający
aby powstrzymać się od przypadkowego wykonania skryptu więcej niż raz.
Plik do wykonania skryptu w mojej funkcji
f711_my_onetime_function()
wyglądałby tak:Powodem, dla którego ustawiam stan przejściowy natychmiast po sprawdzeniu, czy istnieje, jest to, że chcę, aby funkcja była wykonywana po dwukrotnym użyciu skryptu przed zablokowaniem.
Jeśli potrzebuję danych wyjściowych z mojej funkcji, albo drukuję to jako komentarz w stopce, albo czasami filtruję zawartość.
Czas blokady jest ustawiony na 10 minut, ale można go dostosować do własnych potrzeb.
Sprzątać
Po pomyślnym wykonaniu mojego skryptu usunę
include
zfunctions.php
, i usunąćonetime.php
z serwera. Ponieważ użyłem limitu czasu dla stanu przejściowego, nie muszę czyścić bazy danych, ale oczywiście można również usunąć stan przejściowy po usunięciu pliku.źródło
Możesz także to zrobić:
uruchom
onetime.php
i zmień nazwę po wykonaniu.źródło
Stworzyłem w tym celu skrypt Phing z wiersza poleceń, nie jest to nic innego jak ładowanie zewnętrznego skryptu do uruchomienia. Powodem, dla którego użyłem go za pośrednictwem CLI, jest to, że:
Możesz więc użyć Phing lub CLI PHP i spać w nocy. WP-CLI jest również dobrą alternatywą, choć zapominam, czy można go używać poza katalogiem głównym.
Ponieważ jest to popularny post, tutaj jest przykład skryptu: https://github.com/wycks/WordPhing (run.php)
źródło
Innym dość prostym sposobem uruchomienia skryptu jednorazowego jest zrobienie tego za pomocą wtyczki MU.
Umieść kod w jakimś pliku PHP (np.
one-time.php
), Który przesyłasz do folderu wtyczek MU (domyślnie/wp-content/mu-plugins
), dostosuj uprawnienia do pliku, uruchom wtyczkę (tj. Zgodnie z wybranym hakiem, po prostu musisz odwiedzić frontend / backend) i gotowe.Oto płyta grzewcza:
Bez komentarzy i innych rzeczy wygląda to tak:
źródło
W idealnych warunkach ssh na serwer i sam wykonuję tę funkcję za pomocą wp-cli.
Często nie jest to jednak możliwe, więc zwykle ustawiam zmienną $ _GET i podpinam ją do 'init', na przykład:
następnie uderzył
i wyłącz hak po zakończeniu.
źródło
Czasami korzystałem z funkcji uzależnionej od dezaktywacji wtyczek.
Zobacz tutaj Zaktualizuj stare linki do ładnego, niestandardowego typu posta
Gdy tylko administratorzy mogą aktywować wtyczki, pojawia się sprawdzenie zdolności jako efekt uboczny.
Po dezaktywacji nie ma potrzeby usuwania pliku, nie będzie on uwzględniany przez Wordress. Uzależniony, jeśli chcesz ponownie uruchomić, możesz. Ponowna aktywacja i dezaktywacja.
A czasami używałem przejściowego używanego jak w odpowiedzi @fischi. Np. Tutaj zapytanie o tworzenie produktów woocommerce ze zdjęć lub tutaj Usuń / zamień tagi img w treści postu dla automatycznie publikowanych postów
Połączenie obu może być alternatywą.
źródło
Zdecydowanie możesz, po prostu stwórz swój jednorazowy kod jako wtyczkę.
Problem jak aktywować tę wtyczkę bez kliknięcia Aktywuj link?
wystarczy dodać
activate_plugins('onetime/index.php');
wfunctions.php
lub Użyj musi używać wtyczek, http://codex.wordpress.org/Must_Use_Plugins
Spróbuj wykonać inne czynności, jak wtedy, gdy chcesz uruchomić jednorazową wtyczkę,
admin_init - po admin init
init - wordpress init
wp - po załadowaniu wordpress
źródło
Innym sposobem jest ustawienie globalnej opcji wp_opt po zakończeniu pracy i sprawdzenie tej opcji za każdym razem, gdy wykonywane jest przechwycenie init.
Oczywiście nie musisz mieć tego kodu na zawsze (nawet jeśli jest to prosty odczyt z bazy danych), więc prawdopodobnie możesz go usunąć po zakończeniu pracy. Możesz także ręcznie zmienić tę wartość opcji na 0, jeśli chcesz ponownie wykonać kod.
źródło
Moje podejście jest nieco inne. Lubię dodawać mój jednorazowy skrypt jako funkcję w pliku function.php mojego motywu i uruchamiać go dla określonego zapytania GET.
Aby to uruchomić, po prostu odwiedź adres URL „www.sitename.com/?linkupdate”
Do tej pory działa mi to dobrze ...
Czy ta metoda ma jakieś wady? Zastanawiam się ...
źródło
Używam tylko jednej niestandardowej strony szablonu produktu, z której nie korzystam i nie jestem połączony z niczym na serwerze publicznym.
Na przykład, jeśli mam stronę referencyjną, która nie jest aktywna (w trybie roboczym itp.), Ale jest połączona na przykład z szablonem pojedynczej strony
single-testimonial.php
- mogę tam umieścić funkcje, załadować stronę za pomocą apreview
i funkcji lub cokolwiek innego uruchomiony raz. Bardzo łatwo jest również modyfikować funkcję w przypadku debugowania.Jest naprawdę łatwy i wolę go niż używać,
init
ponieważ mam większą kontrolę nad tym, kiedy i jak został uruchomiony. Po prostu moje preferencje.źródło
Na wszelki wypadek to właśnie zrobiłem i działa dobrze:
źródło