f510ac484a618e8b6971c219ab344cf4358c2686
Pilot on washanyanya.ru lost the cf7stg_dispatch cron event somewhere
between 21.04 and 01.05 — wp_next_scheduled('cf7stg_dispatch') returned
NULL, queue had 6 pending rows, sent-24h=0, failed=0, no error trail.
Settings/token were intact. The most likely cause is the PUC self-update
to 1.2.0: WordPress plugin upgrades replace files but do NOT call
register_activation_hook, so Activator::activate() never re-ran and any
cron event Activator::deactivate() had cleared (or that was lost for any
other reason) stayed missing.
Two-part fix:
1. Activator::ensure_scheduled() — extracted from the old private
schedule_events(), now public and idempotent. wp_next_scheduled()
short-circuits when events are already queued, so it's safe to call
on every request. Plugin::boot() invokes it on plugins_loaded — every
admin or front-end hit auto-heals lost cron events.
2. Activator::on_upgrade_complete() bound to upgrader_process_complete.
When WordPress finishes upgrading THIS plugin (matched via
plugin_basename + $hook_extra['plugins']), we re-run install_table()
(idempotent dbDelta), seed_silent_drop_options() (uses add_option,
preserves user values), and ensure_scheduled(). guard_requirements
is intentionally skipped — wp_die mid-upgrade would leave admin in
a broken state, and the host obviously meets requirements since the
old version is currently running.
Tests untouched (this is integration code wrapping WP-only APIs); full
suite still 126/126 green.
Changelog entry for 1.2.1 added to readme.txt.
Stable tag and CF7STG_VERSION will be bumped by release.sh.
Refs: cp-1lg
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
=== CF7 Spam → Telegram === Contributors: vbryzgalov Tags: contact-form-7, telegram, spam, flamingo Requires at least: 6.0 Tested up to: 6.9 Requires PHP: 7.4 Stable tag: 1.2.0 License: GPLv2 or later Пересылает в Telegram-группу submissions CF7, помеченные как спам, с эвристической оценкой «похоже клиент / неясно / похоже спам». == Description == Решает узкую задачу: среди отсечённого Akismet/Honeypot спама иногда встречаются реальные заявки клиентов. Плагин пересылает всё содержимое таких submissions в общую TG-группу с пометкой классификации (🟢/🟡/🔴), причиной попадания в спам, IP/UA, UTM. Требует установленных плагинов Contact Form 7 и Flamingo. == Installation == 1. Загрузите папку `cf7-spam-to-telegram` в `/wp-content/plugins/`. 2. Активируйте плагин в меню «Плагины». 3. Откройте «Настройки → CF7 Spam → TG», укажите Bot Token и Chat ID группы, сохраните. 4. Нажмите «Отправить тестовое сообщение», чтобы проверить. == Changelog == = 1.2.1 = * Fix: Cron-события `cf7stg_dispatch` / `cf7stg_cleanup` теперь самовосстанавливаются. `Plugin::boot()` на каждой загрузке вызывает `Activator::ensure_scheduled()` — если событие пропало (PUC self-update без `register_activation_hook`, ручной `wp_clear_scheduled_hook`, обрезанный wp_options.cron), оно немедленно пересоздаётся. До фикса очередь могла молча застревать на дни без признаков ошибки (sent-24h=0, failed=0). * Fix: Подписан хук `upgrader_process_complete` — после plugin update WordPress повторно вызывает `Activator::install_table()`, `seed_silent_drop_options()` и `ensure_scheduled()`. Без guard_requirements (чтобы не убить admin при апгрейде). = 1.2.0 = * New: Self-hosted plugin updates from Gitea via Plugin Update Checker v5.6. WordPress admin shows updates automatically (checked hourly). Source: https://git.netranking.ru/bryzgalov/cf7-spam-to-telegram/raw/branch/main/wp-plugin-info.json * Dev: release.sh — one-shot release script (bump → release commit → push → build clean zip via git archive --worktree-attributes → Gitea release + asset upload → regenerate wp-plugin-info.json with actual download_url → JSON commit + push). Two fast-forward commits per release, no force-push. * Dev: .gitattributes export-ignore covers tests/, docs/, composer.*, phpunit.xml, .beads/, .claude/, CLAUDE.md, AGENTS.md, release.sh, dist/, .git* — git archive produces clean zip without dev files. * Dev: .gitignore adds dist/ for local release build artifact. = 1.1.0 = * New: Silent drop — заявки, удовлетворяющие hard-rule (нет позитивных сигналов + короткое латинское имя или ≥3 полей-плейсхолдеров) или score ≤ -5, не отправляются в TG. По умолчанию при установке/апгрейде включён dry-run режим (помечает сообщение «[БЫЛО БЫ DROPPED]»); реальный дроп включается чекбоксом в настройках. * New: Settings → блок «Silent drop» с переключателями dry-run, hard-rule, score-порогом и статистикой счётчиков. * New: Dashboard widget показывает количество дропов. * New: filter `cf7stg_should_enqueue` для внешних override-правил. * New: filter `cf7stg_hard_drop_rules` для точечного отключения hard-rules. = 1.0.4 = * Fix: PhoneParser больше не склеивает цифры из соседних полей при flatten через `\n` / `\t`. * Fix: Flamingo `_from_email` используется как `your-email` только если содержит `@`; `_from_name` больше не маппится. * New: `FieldDetector` — fallback-поиск имени и e-mail по значению, когда на форме нестандартные ключи полей (`text-211`, `name_user` и т.п.). * UX: Dashboard-виджет «CF7 Spam → Telegram» отображается всегда (статус очереди), а не только при ошибках. * UX: В ретроспективной выгрузке по умолчанию `0` дней (без ограничения по дате). = 1.0.3 = * Fix: Убрана `tel:`-кнопка в inline_keyboard (Telegram Bot API отклонял `tel:` URL с HTTP 400). * Fix: HTTP 4xx ответы Telegram (кроме 429 rate-limit) теперь классифицируются как permanent — записи сразу помечаются failed, без 5 бесполезных retry. * Fix: `FlamingoHelper::extract_fields` берёт значения из `_field_*` мета, а не из пустого `_fields`-массива. = 1.0.2 = * Fix: Activator регистрирует `cron_schedules` фильтр до `wp_schedule_event` — без этого кастомный интервал `cf7stg_every_minute` не существовал в момент активации и cron никогда не срабатывал. * Fix: Autoloader корректно маппит классы с `_` (например, `Settings_Page`, `Interface_Spam_Source`) в файлы с дефисами. * Fix: Поправлен неверный Punycode-пример в документации. * Fix: Honeypot теперь hard override → label=spam (weighted -5 был недостаточен для перевеса положительных сигналов). = 1.0.0 = * Первый релиз.
Description
WordPress plugin: forwards CF7 spam submissions to Telegram with heuristic classification