Cel
Chcę użyć wp_schedule_single_event( )
do wykonania pojedynczego zdarzenia, które wyśle mi wiadomość e-mail 8 minut po przesłaniu formularza przez użytkownika.
Problem
W moim jest następujący kod functions.php
:
function nkapi_send_to_system( $args ) {
wp_mail( 'xxx', 'xxx', $args );
}
add_action( 'nkapi_send', 'nkapi_send_to_system' );
function schedule_event( $id ) {
wp_schedule_single_event( current_time( 'timestamp' ) + 480, 'nkapi_send', array( $id ) );
}
Do wywołania służy następujący kod schedule-event
:
schedule_event( $_SESSION['insert_id'] ); // the $_SESSION var contains an INT
Po odczekaniu ponad 8 minut w mojej skrzynce odbiorczej nie było wiadomości e-mail.
Co próbowałem
Dzięki wtyczce Core Control można zobaczyć, które zadania cron są zaplanowane.
Po kilku zmianach udało mi się je całkowicie poprawić, a lepiej, gdy kliknę „Uruchom teraz”, faktycznie otrzymuję wiadomość e-mail w mojej skrzynce odbiorczej.
Ale dlaczego cron nie wykonuje się, gdy odwiedzam moją stronę po 8 minutach. Co może być nie tak z tym kodem? Muszę powiedzieć, że po raz pierwszy używam WP Cron.
Próbowałem więcej
Po komentarzu id vancodera postanowiłem sprawdzić, czy kod działa, jeśli wstawię następujący kod bezpośrednio do functions.php
:
function schedule_event( $id ) {
wp_schedule_single_event( time(), 'nkapi_send', array( $id ) );
}
if ( isset( $_SESSION['insert_id'] ) ) {
if ( ! array_key_exists( 'insert_scheduled', $_SESSION ) || $_SESSION['insert_scheduled'] != $_SESSION['insert_id'] ) {
schedule_event( $_SESSION['insert_id'] );
$_SESSION['insert_scheduled'] = $_SESSION['insert_id'];
}
}
Minusem tego kodu jest to, że użytkownik musi przejść do innej strony, zanim ten kod zostanie wykonany. Ale z drugiej strony to też nie działa, więc nie byłby to mój pierwszy problem ...
schedule_event( $_SESSION['insert_id'] );
zwolniony?schedule_event( )
, powiedzmy na górze dołączonego pliku załadowanego przez shortcode.Odpowiedzi:
Najpierw możesz potwierdzić, że nie masz włączonych żadnych wtyczek buforujących? Wtyczki buforujące mogą zakłócać zadania crona, ponieważ odwiedzającym nie jest wyświetlana strona aktywna, ale wersja strony z pamięci podręcznej.
Jeśli masz włączoną wtyczkę buforującą, możesz wybrać jedną ze stron, dodać wyjątek do ustawień wtyczki buforującej dla tej strony, aby nigdy nie była buforowana.
Następnie musisz ręcznie utworzyć zadanie cron (używając cpanel, jeśli korzystasz ze współdzielonego środowiska hostingowego lub z terminala, jeśli jest to serwer VPS / dedykowany), który będzie odwiedzał tę stronę co kilka minut.
Mam nadzieję że to pomogło!
źródło
Po pierwsze, zdefiniuj swoje niestandardowe harmonogramy zadań cron.
add_filter('cron_schedules', array($this, 'cron_schedules'));
Musisz zdecydować, gdzie i kiedy faktycznie zaplanować wydarzenie.
Oto tylko przykładowy fragment kodu, który wywołuje metodę niestandardowej klasy:
Oto kod, który faktycznie planuje wydarzenie:
Teraz wystarczy zadzwonić pod nazwę niestandardowego zadania cron. W tym przykładzie nazwa zadania cron to
custom_imap_import
.add_action('custom_imap_import', array($this, 'do_imap_import'));
W tym przykładzie
$this->do_imap_import();
jest wywoływany co 30 minut (zakładając, że masz wystarczający ruch do swojej witryny).Notatki
Wymaga wizyty na stronie, aby twój cron mógł odpalić w odpowiednim czasie.
Przykład: jeśli zaplanowałeś zadanie w 30-minutowych odstępach, ale nikt nie odwiedził Twojej witryny przez 4 godziny, twoje zadanie cron nie zostanie zwolnione, dopóki ten gość nie pojawi się na Twojej stronie 4 godziny później. Jeśli naprawdę potrzebujesz, aby Twoje zadanie było uruchamiane co 30 minut, zalecamy skonfigurowanie legalnej pracy crona za pośrednictwem usługodawcy hostingowego, aby odwiedzał twoją stronę internetową w pożądanych odstępach czasu.
Zadania cron WordPress nie spowalniają Twojej witryny!
Być może zastanawiasz się, co jeśli wykonanie skryptu cron zajmuje dużo czasu, odwiedzający będą musieli poczekać, aż skrypt zostanie wykonany. Nie! Jak to możliwe? Jeśli spojrzysz na
wp-cron.php
plik, znajdziesz linięignore_user_abort(true);
Jest to
php.ini
konfiguracja, która powoduje, że jeśli przestaniesz ładować witrynę / skrypt, skrypt nie przestanie działać.Jeśli spojrzysz na
wp-includes/cron.php
plik, znajdziesz taką linię:Oznacza to, że WordPress będzie czekać tylko 0,01 sekundy do wyzwalania wykonanie to będzie przerwać, ale jak masz ustawione
ignore_user_abort
dotrue
skryptu będzie wykonywany. Ta funkcja jest ogromną zaletą do wykonywania dużych skryptów w zadaniach cron WordPress.Dostępne funkcje pomocy:
wp_schedule_event
wp_schedule_single_event
wp_clear_scheduled_hook
wp_next_scheduled
wp_unschedule_event
wp_get_schedule
źródło
WP_Cron
używa GMT pod maską, podobnie jak reszta WP, więc lepiej zaplanować pierwsze wydarzenietime()
zamiastcurrent_time()
.WordPress Cron pozwala zaplanować zadania, ale zostaną one wykonane tylko wtedy, gdy zostanie wysłane żądanie do witryny. Przy każdym żądaniu otrzymywanym przez WordPress sprawdzi, czy istnieją zadania cron do przetworzenia, a jeśli tak, odpala żądanie
/wp-cron.php?doing_wp_cron
asynchronicznie w celu przetworzenia zadania. Jeśli zaplanowane uruchomienie zadania przebiega bez żądania, proces cron nie zostanie uruchomiony.Ponieważ możesz zobaczyć i uruchomić zaplanowane zadania, możliwe, że nie ma żądań, które wyzwalają uruchomienie zadania cron, zwłaszcza jeśli używasz wtyczki buforowania. Najlepszą opcją przeniesienia tego do bardziej regularnego harmonogramu jest wyłączenie domyślnego sprawdzania w WordPress i korzystanie z niego
crontab
.Najpierw wyłącz domyślne sprawdzanie (które może trochę pomóc w wydajności po stronie klienta), dodaj następujące elementy do
wp-config.php
:Następnie utwórz zadanie pobierania
wp-cron.php
strony raz na minutę w celu przetworzenia dowolnego zadania z zaplecza, z poziomu wiersza poleceń wprowadź,crontab -e
a następnie dodaj wiersz, który wygląda następująco:źródło
doing_wp_cron=$(date +\%s.\%N)
aby temu zapobiec.Sprawdź, czy DISABLE_WP_CRON nie jest ustawiony w twojej konfiguracji.
W przeciwnym razie spróbuj wyłączyć wszystkie wtyczki (oprócz kontroli rdzenia - chociaż użyłbym wp-crontrol) i sprawdź, czy twoje podstawowe zadania działają. Jeśli tak, to gdzieś występują zakłócenia wtyczek.
Podobnie spróbuj przełączyć się na standardowy motyw dwudziestokrotnie.
Jeśli żaden z nich nie robi żadnej różnicy, istnieje prawdopodobieństwo, że jest to problem z hostingiem.
źródło
DISABLE_WP_CRON
ustawiłem sięwp-config.php
, spróbuję więcej rzeczy i wrócę późniejSprawdź dowolną wtyczkę, która ukrywa Wordpress.
Jak sprawdzić, czy to jest problem?
+1. Nie wierz w żadne wtyczki, które „sprawdzają, czy cron działa” - np. Wtyczka sprawdzania statusu WP Cron wykazała, że cron działa. Ale tak się nie stało.
Wniosek: jeśli jest to błąd 404 - wyłącz a) nie tylko buforowanie wtyczek, jak sugerują inni b), ale także wszelkie wtyczki, które ukrywają Wordpress.
źródło