Ежедневное разовое выполнение задания сайта на WP
Есть задача на сайте на WP сделать ежедневную проверку определенных параметров. Испробовал несколько вариантов, однако все они одномоментно выполняются по 2-3 раза, иногда по 4 раза. Надо, чтобы код выполнялся строго один раз ежедневно.
Вот первый вариант. add_action('init', 'check_has_photo_and_profile_completed'); function check_has_photo_and_profile_completed(){ $get_transient = get_transient('book_872345'); if (false === $get_transient || time() > $get_transient){ global $wpdb; $res = $wpdb->get_results('SELECT ID……'); foreach($res as $item){ /*здесь выполняется код проверки*/ } set_transient('book_872345', (time() + DAY_IN_SECONDS), (time() + 86400 + DAY_IN_SECONDS)); }} В этом варианте изначально и каждый день код внутри цикла foreach повторяется по три раза в один момент. Вот другой вариант. add_action( 'book_daily_photo_profile_check', 'get_profile_completed' ); if (false === wp_next_scheduled('book_daily_photo_profile_check')) { wp_schedule_event( time(), 'daily', 'book_daily_photo_profile_check' ); } function get_profile_completed(){ global $wpdb; $res = $wpdb->get_results('SELECT ID,……..'); foreach($res as $item){ //здесь выполняется код проверки } } В этом варианте также код одномоментно выполняется по 3-4 раза в первый раз и каждый день по 4 раза. Что я делаю не так? И как сделать выполнение проверки строго один раз в сутки? Это добавил после ответа @Roman Я и до этого испробовал разные варианты, вот и сейчас то же самое, код проверки выполняется 4 раза одномоментно. Вот код, который я использовал: add_action('wp', 'book_schedule_daily_photo_profile_check'); function book_schedule_daily_photo_profile_check() { if (!wp_next_scheduled('datebook_daily_photo_profile_check')) { $datetime = time() + 900; wp_schedule_event($datetime, 'hourly', 'datebook_daily_photo_profile_check'); } } Использовал hourly вместо daily, чтобы долго не ждать. add_action( 'datebook_daily_photo_profile_check', 'get_profile_completed' ); function get_profile_completed(){ if (!add_option('book_daily_photo_profile_lock', true, '', 'no')) { return; } global $wpdb; $filename = __DIR__ . '/new-file.txt'; $res = $wpdb->get_results('SELECT …', ARRAY_A); if(!is_null($res) && is_array($res) && !empty($res)){ foreach($res as $item){ //—здесь выполняется проверка file_put_contents($filename, PHP_EOL.'—Privet—'.PHP_EOL.microtime(true), FILE_APPEND); }} delete_option('book_daily_photo_profile_lock'); } Здесь специально добавил запись в файл, чтобы показать реальную картину. Вот что записалось в файл: —Privet— 1793405423.7234 —Privet— 1793405423.7234 —Privet— 1793405423.7235 —Privet— 1793405423.7235 —Privet— 1793409152.9463 —Privet— 1793409152.9464 —Privet— 1793409152.9464 —Privet— 1793409152.9465 —Privet— 1793412804.5078 —Privet— 1793412804.5079 —Privet— 1793412804.508 —Privet— 1793412804.5081 —Privet— 1793416226.776 —Privet— 1793416226.7761 —Privet— 1793416226.7761 —Privet— 1793416226.7762 Если внимательно посмотреть на временные отметки, то можно увидеть, что код проверки выполняется ежечасно по 4 раза с разницей в несколько миллисекунд. Прямо какое-то наваждение! Это что, создаются сразу 4 экземпляра wp_schedule_event? А может, дело в настройках сервера?
Источник: ru.stackoverflow.com — ru.stackoverflow.com/questions/1627581/%D0%95%D0%B6%D0%B5%D0%B4%D0%BD%D0%B5%D0%B2%D0%BD%D0%BE%D0%B5-%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%BE%D0%B5-%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F-%D1%81%D0%B0%D0%B9%D1%82%D0%B0-%D0%BD%D0%B0-wp