#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. Спасибо, Люциус. Это действительно выглядит как отличное решение. Я попробую это сейчас и дам вам знать.