Как предотвратить повторный запуск cURL в функции WP?

#php #wordpress

#php #wordpress

Вопрос:

Когда публикуется сообщение WordPress, хук publish_post иногда вызывается несколько раз. Поэтому функция send_webhook также запускается несколько раз.

Я пытался предотвратить это с помощью глобальной переменной, но, похоже, это не работает. Я думаю, это потому, что сама функция вызывается несколько раз.

Это мой код:

 add_action('publish_post', 'send_webhook');
function send_webhook($post_id) {
    global $ss_done;
    if (!isset($ss_done)) {
        $url = 'https://hook.integromat.com/wy41cb1vlsfi7m1dfef63sxec3wotdnr';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_exec($ch);
        curl_close($ch);
        $ss_done = true;
    }
}
 

Как я могу предотвратить запуск cURL несколько раз, например, за период времени в 300 секунд, даже если функция вызывается несколько раз? Может быть, каким-то образом сохранить заголовок сообщения в переменной, а затем проверить, используется ли он уже? Есть идеи?

Комментарии:

1. Я бы изучил переходные процессы. Вы можете сохранить данные в подсистеме переходных процессов, и WordPress автоматически удалит базу данных с истекшим сроком действия. Например, вы могли бы сделать что-то вроде set_transient( 'maurice_cache_' . $post_id, [] , 300 ); Значение на самом деле не имеет значения, только идентификатор в вашем случае. Для большинства простых сайтов этого достаточно, однако элементы могут быть удалены из кэша раньше, и если это проблема, вам следует вместо этого посмотреть options или post_meta .

Ответ №1:

Вы можете использовать post_meta для проверки, вызывалась ли функция ранее. Если этого не произошло (или прошло 300 секунд), выполните вызов api и сохраните текущее время:

 add_action('publish_post', 'send_webhook');
function send_webhook($post_id) {
    $last = get_post_meta($post_id, 'integromat_webhook_sent', true);
    if (empty($last) || (strtotime('now') - strtotime($last)) > 300  ) {
        $url = 'https://hook.integromat.com/wy41cb1vlsfi7m1dfef63sxec3wotdnr';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_exec($ch);
        curl_close($ch);
        update_post_meta($post_id, 'integromat_webhook_sent', strtotime('now'));
    }
}
 

Комментарии:

1. Спасибо, Люциус. Это действительно выглядит как отличное решение. Я попробую это сейчас и дам вам знать.