Подготавливаем страницу…
Подготавливаем страницу…
Работает с Contact Form 7, WPForms, Gravity Forms, Ninja Forms и формами Elementor. Два способа: браузерный код из кабинета или серверный PHP-хук.
pk_, защита списком доменов.mu-plugins с обработчиками тех же пяти конструкторов форм — готовый файл выдаёт кабинет («Интеграция» → карточка сайта → «Свой сервер»), примеры для ручной настройки ниже. Ключ секретный sk_, защита списком IP; не зависит от браузера посетителя.Кабинет → «Интеграция» → карточка сайта. Для браузерного кода — pk_, для серверного хука — sk_. Там же — номера форм согласия (form_id).
Для sk_ сразу заполните список IP: пока он пуст, запросы принимаются с любого адреса. Внешний адрес сервера покажет curl ifconfig.me с самого сервера; без SSH его видно в админке WordPress — «Здоровье сайта» → «Инфо» → «Сервер».
Браузерный: скопируйте код из карточки сайта и вставьте через плагин вставки кода (например, WPCode или Insert Headers and Footers) в раздел «Scripts in Footer». Ключ и формы в коде уже подставлены.
Серверный: создайте папку wp-content/mu-plugins/, положите туда файл 1opd.php — готовый из кабинета или собранный из примеров ниже. В functions.php темы код не кладите: обновление темы сотрёт его молча.
В Contact Form 7 — тегом [acceptance]; ссылки на политику и текст согласия берите из кабинета, блок «HTML-чекбокс для формы» отдаёт их подставленными:
[acceptance opd_consent default:0]
Даю согласие на обработку персональных данных в соответствии с
<a href="ССЫЛКА_НА_ПОЛИТИКУ" target="_blank">Политикой обработки персональных данных</a>.
[/acceptance]
[acceptance opd_consent_marketing default:0 optional]
Даю согласие на получение информационной и рекламной рассылки.
[/acceptance]В WPForms чекбокс добавляется конструктором: поле «Согласие GDPR» или обычный Checkbox. Основное согласие — обязательное; согласие на рассылку — отдельный добровольный чекбокс со своей формой согласия: обязательная галочка на рекламу добровольным согласием не считается.
Отправьте форму с тестовой почтой на опубликованном сайте и найдите запись: кабинет → «Согласия». Пока записи в реестре нет — интеграция не работает, даже если форма не показала ошибку.
Для ручной настройки. Готовый файл со всеми пятью обработчиками — CF7, WPForms, Gravity (gform_after_submission), Ninja (ninja_forms_after_submission), Elementor (elementor_pro/forms/new_record) — выдаёт кабинет; обработчики разных конструкторов не конфликтуют и живут в одном файле.
<?php
// Серверный хук Contact Form 7. Класть в wp-content/mu-plugins/1opd.php —
// см. пояснение на странице, почему не в functions.php.
// Срабатывает перед отправкой письма CF7.
add_action('wpcf7_before_send_mail', function ($contact_form) {
$submission = WPCF7_Submission::get_instance();
if (!$submission) return;
$data = $submission->get_posted_data();
// ── Настройки ─────────────────────────────────────────────────────
$api_key = 'sk_ваш_ключ';
$email = $data['your-email'] ?? ''; // name поля email в вашей форме CF7
// Имя acceptance-чекбокса CF7 → form_id формы согласия в 1ОПД.
$consent_form_ids = [
'opd_consent' => 1, // основное согласие (обязательный чекбокс)
'opd_consent_marketing' => 2, // рассылка (добровольный чекбокс)
];
// ──────────────────────────────────────────────────────────────────
if ($email === '') return; // без идентификатора субъекта согласие не пишем
$skip = array_keys($consent_form_ids);
$payload_fields = [];
foreach ($data as $k => $v) {
if (in_array($k, $skip, true)) continue;
if (is_array($v)) $v = implode(',', $v);
$payload_fields[] = ['field' => $k, 'value' => (string) $v];
}
foreach ($consent_form_ids as $checkbox => $form_id) {
// [acceptance] передаёт '1', когда галочка отмечена. Отправляем только
// за отмеченные — и сообщаем платформе, что отметка проверена.
if (empty($data[$checkbox])) continue;
wp_remote_post('https://v2.1opd.ru/api/v2/create-agreement', [
'headers' => [
'API-KEY' => $api_key,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode([
'form_id' => $form_id,
'hash_field' => $email,
'consent_given' => true,
'fields' => $payload_fields,
]),
'timeout' => 5,
'blocking' => false, // письмо CF7 не ждёт нашего ответа
]);
}
}, 10, 1);<?php
// WPForms — хук после успешной обработки формы.
add_action('wpforms_process_complete', function ($fields, $entry, $form_data, $entry_id) {
$api_key = 'sk_ваш_ключ';
// ID формы WPForms → form_id формы согласия в 1ОПД.
$form_id_map = [
7 => 1,
12 => 2,
];
$form_id = $form_id_map[(int) $form_data['id']] ?? null;
if (!$form_id) return; // эту форму в 1ОПД не пишем
$email = '';
$payload_fields = [];
foreach ($fields as $f) {
if ($f['type'] === 'email') $email = $f['value'];
$payload_fields[] = ['field' => $f['name'], 'value' => (string) $f['value']];
}
if ($email === '') return;
wp_remote_post('https://v2.1opd.ru/api/v2/create-agreement', [
'headers' => [
'API-KEY' => $api_key,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode([
'form_id' => $form_id,
'hash_field' => $email,
'consent_given' => true, // чекбокс согласия в форме обязателен
'fields' => $payload_fields,
]),
'timeout' => 5,
'blocking' => false,
]);
}, 10, 4);'blocking' => false — намеренно: отправка письма и запись заявки не ждут ответа платформы. Если платформа недоступна, очередь ответит 202 и запись доедет сама.
Правка functions.php основной темы исчезает с первым же её обновлением, и интеграция замолкает молча. Поэтому код кладут в wp-content/mu-plugins/1opd.php: папку можно создать самому, файлы оттуда WordPress включает всегда, обновления их не трогают. Запасные варианты — дочерняя тема или плагин Code Snippets.
Для серверного хука: включите журнал — строка define('WP_DEBUG_LOG', true); в wp-config.php — и посмотрите wp-content/debug.log: там видны запросы к v2.1opd.ru и их ответы. Для браузерного кода: F12 → Network → запрос на v2.1opd.ru. Приём — это и 200, и 202.
Наоборот быть не должно: CF7 отвечает HTTP 200 и на отказ — успех и провал различаются полем статуса в его ответе, а не кодом. Код из кабинета пишет согласие только при статусе mail_sent; отказы валидации, спам-фильтр и неотмеченная галочка успехом не считаются. Если писали перехват сами — проверяйте статус CF7, а не код ответа.
Для sk_ — адрес сервера не в IP-списке ключа: у хостинга исходящий адрес может отличаться от адреса сайта, а за CDN нужен адрес источника, не CDN. Для pk_ — домен не в списке Origin: внесите и ваш-домен.ru, и www.ваш-домен.ru.
Синтаксическая ошибка в PHP-файле. Восстановите файл из копии по FTP, затем вставьте код заново целиком. Проверить синтаксис локально: php -l 1opd.php.