Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Pavel Soukup
Člen
Avatar
Pavel Soukup:8.6.2018 19:50

Ahoj všichni, potřeboval bych pomoct ohledně wp_schedule_event ve wordpressu. Na codex.wordpress.org jsem si našel, jak se implementuje wp_schedule_event, ale nejspíš jsem to nepochopil.

Zkusil jsem: Zkoušel jsem pozměnit, názvy funkcí a procedury, které řeším ve funkci, která se má provádět jednou za hodinu, ale neúspěšně. Zde je kód:

register_activation_hook(__FILE__, 'my_activation');

function my_activation() {
    if (! wp_next_scheduled ( 'my_hourly_event' )) {
        wp_schedule_event(time(), 'hourly', 'my_hourly_event');
    }
}

add_action('my_hourly_event', 'do_this_hourly');

function do_this_hourly() {
        $step = $wpdb->get_var("SELECT timeStep FROM wp_plugins");
        if (!empty($step)) {
            $wpdb->update('wp_plugins', array(
            'timeStep' => 'funguje to',
                ),
                array( 'state' => 'deactivate_plugins')
            );
        }
}

register_deactivation_hook(__FILE__, 'my_deactivation');

function my_deactivation() {
        wp_clear_scheduled_hook('my_hourly_event');
}

Ve funkci do_this_hourly() si zkouším pro začátek ukládat do databáze pod sloupec hodnotu funguje to, abych věděl jestli se mi do databáze hodinově uloží tato hodnota nebo ne, ale když jsem se po hodině koukal do databáze, tak se výchozí hodnota nezměnila.

Chci docílit: wp_schedule_event chci primárně použít pro aktivaci nebo deaktivaci pluginů v určitou hodinu co si vybere uživatel, takže kdyby si například uživatel chtěl teď nastavit, že se jeho pluginy mají vypnout zítra ve 3 ráno, tak si tento údaj uložím do databáze a potom každou hodinu pomocí wp_schedule_event kontroluji, jestli daný čas už nastal a nebo ne. Později bych tedy chtěl implementovat tento kód:

if (!empty($_POST["bdaytime"]) AND !empty($_POST["step"])) {
            $time = $_POST["bdaytime"];
            date_default_timezone_set('Europe/Prague');
                        $today = date("Y-m-d\TH:i");

                        if ($time == $today) {
                                echo "shodují se";
                        } else {
                                echo "neshodují se";
                        }

                        $wpdb->update('wp_plugins', array(
                       'time' => $_POST["bdaytime"],
                       'timeStep' => $_POST["step"],
                       ),
                       array( 'state' => 'deactivate_plugins')
              );


 }

$_POST["bdaytime"] je hodnota z inputu typu datetime-local a $_POST["step"] obsahuje hodnotu, jestli se mají pluginy vypnout nebo zapnout.

Pro začátek by mi stačilo, aby se každou hodinu, uložila do databáze hodnota funguje to a pak implementuji script víše do funkce wp_schedule_event.

Každou radu uvítám
Děkuji
S pozdravem, Jakub Štolba.

 
Odpovědět
8.6.2018 19:50
Avatar
Vít Kološ
Člen
Avatar
Odpovídá na Pavel Soukup
Vít Kološ:9.6.2018 11:32

Myslím, že vycházíš z chybného předpokladu. :)

Schedules a hook which will be executed by the WordPress actions core on a specific interval, specified by you. The action will trigger when someone visits your WordPress site, if the scheduled time has passed. See the Plugin API for a list of hooks. https://codex.wordpress.org/…hedule_event

Funkce se tedy spouští, když tvůj web někdo navštíví po uplynutí nastaveného času. Nestačí se proto pouze podívat do databáze.


Kdybys chtěl, aby na web někdo chodil za tebe (a tak spouštěl časované akce), musel bys použít CRON.

Editováno 9.6.2018 11:33
Nahoru Odpovědět
9.6.2018 11:32
Neopravuj, co není rozbité.
Avatar
Pavel Soukup
Člen
Avatar
Odpovídá na Vít Kološ
Pavel Soukup:9.6.2018 11:45

Cron je ale pouze na linuxech ne? Tím pádem se používá pro web server. Já pouze vytvářím plugin ve wordpressu, který se stará o zbytek pluginů, takže cron je pro mě zbytečný.

Neexistuje něco v php nebo javascriptu, co by dokázalo i bez aktivity uživatele, pouštět funkci dokola, která by kontrolovala, jestli daný čas neuběhl?
Děkuji za odpovědi.

 
Nahoru Odpovědět
9.6.2018 11:45
Avatar
Vít Kološ
Člen
Avatar
Odpovídá na Pavel Soukup
Vít Kološ:9.6.2018 12:55

Ještě mě napadá možnost použít vlastní server. Plugin by ti na tvůj server odeslal adresu konkrétního (klientského) webu a tvoje skripty by se pak pomocí CRONu (třeba cron-job.org) pravidelně aktivovaly a spouštěly klientské stránky.

Nahoru Odpovědět
9.6.2018 12:55
Neopravuj, co není rozbité.
Avatar
Pavel Soukup
Člen
Avatar
Odpovídá na Vít Kološ
Pavel Soukup:9.6.2018 12:58

taky možnost, zkusím :) ale tedy pomocí toho wp_schedule_event se to co chci udělat nedá, pokud bych neměl tedy velkou základnu uživatelů

 
Nahoru Odpovědět
9.6.2018 12:58
Avatar
Vít Kološ
Člen
Avatar
Odpovídá na Pavel Soukup
Vít Kološ:9.6.2018 13:02

V podstatě máš pravdu. :) Ale i tak je to užitečná funkce, která má svá využití.

Nahoru Odpovědět
9.6.2018 13:02
Neopravuj, co není rozbité.
Avatar
Pavel Soukup
Člen
Avatar
Pavel Soukup:9.6.2018 13:05

to určitě, ale já dělám plugin, který je pouze pro adminy wordpressu, takže běžný uživatel ho na stránce neuvidí.
Můj plugin je pouze pro správu pluginů. a admin si může navolit, že všechny pluginy se mu zapnou zítra ráno ve 3 třeba
tak chci aby se zapnuli, i když nebude online

 
Nahoru Odpovědět
9.6.2018 13:05
Avatar
Pavel Mareš
Tvůrce
Avatar
Odpovídá na Pavel Soukup
Pavel Mareš:24.6.2018 19:42

K tomuhle mám jen dodatek. Co se web serverů týká, tak abys něco spouštěl bez pomoci uživatele, tak vždy potřebuješ CRON. Taky jsem na to narazil pár let zpět a bohužel zklamání no :)

Co se týká aktivace pluginů, tak bych jen dodal, že tohle je něco, co bych asi jako admin nikdy nepoužil. Důvod je jasnej. Když vypínám / zapínám plugin, něco očekávám a většinou hlídám, kdyby cokoli. Takže aby se mi něco spustilo v době, kdy u toho nejsem, asi bych nebyl úplně šťastnej.

Za třetí. Pokud plugin aktivuješ ve 3 ráno a někdo ti přijde až ve 4, tak od 3 do 4 ráno je ten plugin zbytečnej. Pokud se zapne až ve 4, kdy přijde někdo na web, tak se zapnou tak jako tak a je klid. ALE. Ve chvíli, kdy se zapínají by viděl "maintenance active" hlášku. Což by ti nemuselo vadit, když je to jen pro admina ne? Takže na webu by to moc udělat nemuselo, tolik (btw aktivace a maintenance hláška tam ani být nemusí, protože aktivace je většinou rychlá - update už ne).

Myšlenka na závěr: Nebylo by lepší to dělat na tlačítko pro admina, když to je jen pro admina?

Můžeš prozradit víc o pluginu? Docela mě zajímá, co vymýšlíš :)

Editováno 24.6.2018 19:45
Nahoru Odpovědět
24.6.2018 19:42
Však ono půjde ...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.