codebros care
Integrace

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ář:

  1. vrátí normální úspěch (stejný HTTP status i děkovací hlášku jako běžně), aby šlo ověřit celý tok,
  2. nevytvoří reálný lead ani objednávku a nepošle notifikaci majiteli (přeskočí, nebo odloží do test logu),
  3. 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

  1. 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.
  2. Zálohuj každý soubor před úpravou: cp soubor soubor.care-bak.
  3. 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).
  4. 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.
  5. 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_test a 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).

On this page