Prepojenie WordPress s CRM
Gram CRM sa dá prepojiť s webovou stránkou cez štandardné API. Najčastejšie riešenie je kontaktný formulár, ktorý zapíše nový Lead, aby sa dopyty z webu nemuseli prepisovať ručne. Rovnakým spôsobom sa dajú údaje aj čítať – napríklad zoznam objednávok za zvolené obdobie.
Ukážkové skripty na stiahnutie: example-read-orders.zip
Obsah
- Príprava v Gram CRM
- Adresa API
- Kontaktný formulár → Lead
- Čítanie údajov z Gram CRM
- Systémové polia
- Namiesto opakovaného čítania: webhook
- Bezpečnosť – čo nepodceniť
1. Príprava v Gram CRM
Technický používateľ – weblead
Vytvorte technického používateľa alebo použite existujúce konto weblead, pod ktorým bude web pristupovať do Gramu cez API. Používateľ nemusí byť aktívny na prihlasovanie do aplikácie. Slúži iba ako technický účet pre API.
Pri používateľovi nastavte profil s oprávneniami len na to, čo web skutočne potrebuje – napríklad na vytváranie záznamov Lead. Nie je potrebné prideľovať mu ďalšie oprávnenia.
API kľúč
Nastavenia → API kľúče → Nový kľúč, priraďte ho technickému používateľovi. Kľúč je celý viditeľný len pri vytvorení, potom sa už zobrazuje maskovane (****), takže si ho hneď uložte. Kľúč sa dá kedykoľvek zmazať – tým prestane platiť okamžite.
Podrobne: API kľúče – vytvorenie a deaktivovanie
2. Adresa API
https://<host>/<organizácia>/api/v1/<Entita>
- <host> – ten istý, na ktorom sa prihlasujete do Gramu (napr. app.gramcrm.eu). Staršia adresa api.gramcrm.com funguje už len ako prechodné riešenie pre pôvodné inštalácie; pri novom prepojení ju nepoužívajte.
- <organizácia> – prvý segment URL po prihlásení.
Kľúč sa posiela v hlavičke:
Token: <api-kľúč>
Najjednoduchšia ukážka – vytvorenie Leadu:
curl -X PUT \
-H "Token: 1234567890123456789012" \
-H "Content-Type: application/json" \
-d '{"Subject":"Prvý príklad"}' \
https://app.gramcrm.eu/{organizácia}/api/v1/Lead
Odpoveď
Úspech:
{ "Result": true, "NewId": "0199e0f4-...", "Data": [], "HasMore": false }
Chyba:
{ "Result": false, "ResultText": "popis chyby", "ResultCode": "ErrXyz" }
Vyhodnocujte aj HTTP stavový kód, aj pole Result – API vracia reálne kódy: 400 zlý dotaz, 401 neplatný kľúč, 403 chýbajúce právo, 404 neexistujúci záznam, 500 chyba servera.
3. Kontaktný formulár → Lead
Krok 1 – stránka s formulárom
Vo WordPresse vytvorte stránku „Kontaktný formulár“, prepnite editor na Editor kódu a vložte formulár zo súboru form.php. Formulár obsahuje dve veci navyše oproti bežnému formuláru:
- skryté pole Website (honeypot) – človek ho nevidí, bot ho vyplní,
- skryté pole Ts s časom vykreslenia – formulár odoslaný do troch sekúnd je takmer isto bot.
Krok 2 – stránka s poďakovaním
Vytvorte stránku, na ktorú sa návštevník presmeruje po odoslaní (napr. /dakujeme/).
Krok 3 – spracovanie na serveri
Nahrajte GramApi.php, config.php a lead.php. Do config.php doplňte host, organizáciu a kľúč.
Jadro spracovania:
<?php
require_once __DIR__ . '/GramApi.php';
$config = require __DIR__ . '/config.php';
$api = new GramApi($config['base_url'], $config['tenant'], $config['token']);
$data = [
'Organization' => 1,
'Subject' => 'Záujem z webu',
'Source' => 'Web',
'Name' => $meno,
'Surname' => $priezvisko,
'Position' => $pozicia,
'Company' => $firma,
'Phone' => $telefon,
'Email' => $email,
'Description' => $sprava,
'Ext' => 'web-' . bin2hex(random_bytes(8)),
'ExtDate' => date('Y-m-d H:i:s'),
];
try {
$id = $api->create('Lead', $data);
header('Location: /dakujeme/', true, 303);
} catch (GramApiException $e) {
error_log('Gram CRM: ' . $e->getMessage());
header('Location: /kontakt/?chyba=1', true, 303);
}
Kompletná verzia v lead.php obsahuje aj validáciu vstupov, honeypot, kontrolu časovej pečiatky a limit počtu odoslaní z jednej IP adresy.
4. Čítanie údajov z Gram CRM
Príklad: objednávky vystavené v auguste 2026.
<?php
require_once __DIR__ . '/GramApi.php';
$config = require __DIR__ . '/config.php';
$api = new GramApi($config['base_url'], $config['tenant'], $config['token']);
$res = $api->read('Order', [
'Select' => ['Number', 'Account:Name', 'Status', 'IssuedDate', 'PriceWithVat'],
'Where' => [
['Field' => 'IssuedDate', 'Operator' => 'between', 'Value' => ['2026-08-01', '2026-08-31']],
],
'OrderBy' => [['Field' => 'IssuedDate', 'Order' => 'desc']],
'Limit' => 100,
'Skip' => 0,
]);
foreach ($res['Data'] as $row) {
echo htmlspecialchars($row['Number'], ENT_QUOTES, 'UTF-8'), "\n";
}
5. Systémové polia
Každá entita má okrem vlastných polí aj systémové polia. Pri prepojení s webom sú užitočné najmä:
- Organization – pri jednej organizácii v tenantovi vždy 1 (aj predvolená hodnota poľa); ak ich má tenant viac, pošlite číslo tej, pod ktorú majú dopyty z webu patriť. Z kľúča sa neodvodzuje.
- Ext / ExtDate – externý identifikátor a čas. Ideálne miesto pre ID odoslania formulára alebo číslo objednávky z e-shopu; podľa neho sa dá neskôr zistiť, či záznam už v CRM je, a nevytvoriť duplicitu.
6. Namiesto opakovaného čítania: webhook
Ak má web reagovať na zmenu v CRM (nová objednávka, zmena stavu), nemusí sa API cyklicky dopytovať. V Nastavenia → Webhooky zadáte URL na strane webu a Gram na ňu pri každej udalosti pošle POST:
{ "Data": { "Entity": "Order", "Id": "<uuid>", "Event": "create" } }
Web si potom cez API načíta len ten jeden záznam. Doručovanie má vlastné opakovanie pri zlyhaní a pri dlhšom výpadku vášho endpointu príde e-mailové upozornenie.
7. Bezpečnosť – čo nepodceniť
- API kľúč uchovávajte bezpečne a nepoužívajte ho priamo vo verejne dostupnej časti webu.
- Formulár chráňte proti spamu – napríklad pomocou honeypotu, kontroly vstupov a obmedzenia počtu odoslaní.
- Chyby nezobrazujte návštevníkovi, ale ukladajte ich do logu na serveri.
- Údaje z CRM nezverejňujte bez ochrany – stránky, ktoré zobrazujú interné dáta, majú byť dostupné iba prihláseným používateľom.
- Používajte zabezpečené pripojenie HTTPS a nevypínajte kontrolu bezpečnostných certifikátov.
Pri nasadení do produkcie odporúčame používať technického používateľa s minimálnymi právami, uchovávať API kľúč výhradne na serveri a všetky vstupy z verejného formulára validovať ešte pred odoslaním do Gram CRM.
Mohlo by vás tiež zaujímať:
Návod bol naposledy upravený 28. august 2026.