Testovatelné formuláře
Jak upravit kontaktní nebo objednávkový formulář, aby ho care denně testoval, ale nevznikl falešný lead ani objednávka.
care jednou denně odešle testovací submit na primární formulář webu a ověří, že projde (a volitelně že dorazí e-mail). Aby tenhle test nevytvořil reálný lead nebo objednávku a neobtěžoval majitele, formulář musí náš testovací submit rozpoznat a chovat se k němu jako k testu.
Tahle stránka je kontrakt, který na projektu implementuješ. Platí napříč stacky (WordPress, čisté PHP, headless, form služby).
Kontrakt v kostce
Testovací submit pozná formulář podle skrytého pole a tajného tokenu:
- Pole:
care_test - Hodnota: tajný token daného webu (řetězec, který zná jen care).
Pro submit, kde care_test odpovídá tokenu, formulář:
- vrátí normální úspěch (stejný HTTP status i děkovací hlášku jako běžně), aby šlo ověřit celý tok,
- nevytvoří reálný lead ani objednávku a nepošle notifikaci majiteli (přeskočí, nebo odloží do test logu),
- volitelně nechá odejít potvrzovací e-mail odesílateli. Jako odesílatele používáme probe adresu, takže tím ověříme i doručení.
Token je tajný, takže bez správné hodnoty se formulář chová úplně normálně. To brání zneužití.
Kde vzít token. Token dodá care (v zadání jako
care_test_secret). Pokud ho nemáš, vygeneruj náhodný řetězec (min. 24 znaků) a vrať ho care, jinak nejde kontrolu nastavit.
Postup
- Detekuj stack. Stáhni stránku s formulářem a najdi
<form action=...>, method a skrytá pole. U WordPressu zjisti pluginy (wp plugin list). Najdi handler. - Zálohuj každý soubor před úpravou:
cp soubor soubor.care-bak. - Uprav minimálně a reverzibilně. U WordPressu vždy přes mu-plugin
wp-content/mu-plugins/care-test-mode.php. Nikdy neupravuj jádro, téma ani soubory pluginu (přepíše je aktualizace). - Ověř odesláním testu s
care_test=<token>: musí přijít stejný úspěch a nesmí přibýt reálný záznam. - Ukliď dočasné soubory, ale úpravu (mu-plugin nebo ohraničený blok) nech aktivní.
Recepty podle stacku
WordPress: Contact Form 7
mu-plugin wp-content/mu-plugins/care-test-mode.php:
<?php
/* Plugin Name: care test mode */
if (!defined('ABSPATH')) exit;
const CARE_TEST_SECRET = 'SEM_VLOZ_TAJNY_TOKEN';
function care_is_test_submit(): bool {
return isset($_POST['care_test'])
&& hash_equals(CARE_TEST_SECRET, (string) $_POST['care_test']);
}
// Contact Form 7: přeskoč odeslání e-mailů, úspěšná odpověď zůstane
add_action('wpcf7_before_send_mail', function ($contact_form) {
if (care_is_test_submit()) {
$contact_form->skip_mail = true;
}
}, 1);skip_mail = true přeskočí admin i autoreply e-mail, ale CF7 vrátí normální úspěch (mail_sent). Pokud chceš roundtrip (autoreply má dorazit odesílateli), místo skip_mail odeber jen příjemce admin mailu přes filtr wpcf7_mail_components a autoreply nech.
WordPress: WPForms
// WPForms: vypni admin notifikaci u testovacího submitu
add_filter('wpforms_entry_email_is_enabled', function ($enabled, $fields, $entry, $form_data, $context) {
return care_is_test_submit() ? false : $enabled;
}, 10, 5);
// a záznam označ jako test (nebo smaž)
add_action('wpforms_process_complete', function ($fields, $entry, $form_data, $entry_id) {
if (care_is_test_submit() && $entry_id) {
wpforms()->entry->update($entry_id, ['status' => 'test']);
}
}, 10, 4);Děkovací zprávu a redirect nech beze změny.
WordPress: Gravity Forms
// Gravity Forms: vypni admin notifikaci a přeruš admin e-mail u testu
add_filter('gform_disable_notification', function ($is_disabled, $notification, $form, $entry) {
return care_is_test_submit() ? true : $is_disabled;
}, 10, 4);
add_filter('gform_pre_send_email', function ($email) {
if (care_is_test_submit()) $email['abort_email'] = true;
return $email;
});Confirmation (děkovací stránka) zůstane.
WordPress: Elementor Pro Forms
Nejméně stabilní, ověřuj pečlivě. V akci elementor_pro/forms/process (nebo new_record) přeruš akce e-mail a CRM, když je test marker, ale nech úspěšnou odpověď. Vždy přes mu-plugin.
Čistý PHP handler (contact.php, send.php)
Na začátek handleru vlož ohraničený blok a zápisy obal podmínkou:
// --- care test mode (start) ---
$__care_test = (($_POST['care_test'] ?? '') === 'SEM_VLOZ_TAJNY_TOKEN');
// --- care test mode (end) ---
// ... dál v kódu:
if (!$__care_test) {
// reálné side-efekty jen mimo test:
mail($to, $subject, $body, $headers);
// $db->insert(...);
}
// děkovací výstup / redirect nech běžet pro obě větve
echo 'Děkujeme, zpráva byla odeslána.';Neupravuj nic dalšího.
Headless (Next.js, Astro, serverless funkce)
Na začátek API handleru přidej kontrolu a při shodě vrať standardní úspěch bez side-efektů:
// app/api/kontakt/route.ts (nebo obdoba)
export async function POST(req: Request) {
const body = await req.formData(); // nebo req.json()
const isTest = body.get("care_test") === process.env.CARE_TEST_SECRET;
if (!isTest) {
// reálné side-efekty jen mimo test: e-mail, CRM, DB
await sendEmail(/* ... */);
}
// stejná úspěšná odpověď pro test i realitu
return Response.json({ ok: true, message: "Děkujeme" });
}Pokud nemáš deploy přístup, úpravu neaplikuj. Vrať care přesný návrh změny (soubor, diff a potřebný env CARE_TEST_SECRET).
Form služba (Netlify Forms, Formspree, Basin, Web3Forms, Getform)
Serverovou logiku vložit nejde. Podle služby zvol a vrať care doporučení:
- přidej skryté pole
care_testa ve službě nastav filtr/routing, aby test submity nešly do hlavní schránky (kde to služba umí), - nebo přesuň kritický formulář na vlastní endpoint (viz headless výše),
- když nic z toho nejde, kontrola poběží v režimu "jen odeslání" bez ověření doručení. Napiš to care jasně.
Bezpečnost
- Nikdy nemaž data ani neupravuj jádro, téma nebo soubory pluginu, které přepíše aktualizace.
- Vždy záloha (
.care-bak) a reverzibilní zásah (mu-plugin nebo ohraničený blok). - Token nedávej natvrdo do veřejného HTML jinam než jako očekávanou hodnotu pole. Posílá ho jen tester care.
- Když si nejsi jistý bezpečností kroku, zásah neprováděj a vrať přesné doporučení.
Co vrátit care
Po úpravě dodej hodnoty pro nastavení funkční kontroly:
stack: detekovaný stack,markerField:care_test,markerValue: použitý token,endpoint: URL, kam se submit posílá (method a contentType),changedFiles: cesty upravených souborů a kde je záloha,- omezení: co nejde ověřit (třeba u form služby).