This commit is contained in:
2026-07-04 19:40:48 +03:00
parent 0cf3f93567
commit 409668ac50
12 changed files with 236 additions and 27 deletions

View File

@@ -241,7 +241,10 @@
align-items: center;
min-height: 46px;
border-bottom: 1px solid var(--color-line);
color: var(--color-text);
font: inherit;
font-weight: 700;
text-align: left;
}
.site-footer {
@@ -315,6 +318,15 @@
box-shadow: var(--shadow-soft);
}
.lead-form__trap {
position: absolute;
left: -10000px;
width: 1px;
height: 1px;
opacity: 0;
pointer-events: none;
}
.lead-form__head {
display: grid;
gap: 8px;
@@ -381,6 +393,67 @@
color: var(--color-success);
}
.lead-modal {
position: fixed;
inset: 0;
z-index: 120;
display: grid;
place-items: center;
padding: 20px;
}
.lead-modal[hidden] {
display: none;
}
.lead-modal__overlay {
position: absolute;
inset: 0;
background: rgba(44, 33, 29, 0.58);
}
.lead-modal__dialog {
position: relative;
width: min(100%, 520px);
max-height: calc(100vh - 40px);
overflow: auto;
}
.lead-modal__close {
position: absolute;
top: 14px;
right: 14px;
z-index: 2;
width: 36px;
height: 36px;
border-radius: 50%;
background: var(--color-surface-soft);
}
.lead-modal__close::before,
.lead-modal__close::after {
position: absolute;
top: 17px;
left: 10px;
width: 16px;
height: 2px;
border-radius: 2px;
background: var(--color-text);
content: "";
}
.lead-modal__close::before {
transform: rotate(45deg);
}
.lead-modal__close::after {
transform: rotate(-45deg);
}
.lead-modal .lead-form {
padding-top: 54px;
}
.cookie-note {
position: fixed;
right: 24px;

View File

@@ -48,6 +48,10 @@ body.menu-is-open {
overflow: hidden;
}
body.lead-modal-is-open {
overflow: hidden;
}
.button-main,
.lead-form__button {
display: inline-flex;

View File

@@ -7,6 +7,11 @@
var catalogButton = document.querySelector('.site-header__menu-button');
var cookieNote = document.querySelector('[data-cookie-note]');
var cookieButton = document.querySelector('[data-cookie-accept]');
var leadModal = document.querySelector('[data-lead-modal]');
var leadOpenNodes = document.querySelectorAll('[data-lead-open]');
var leadCloseNodes = document.querySelectorAll('[data-lead-close]');
var phoneInputs = document.querySelectorAll('[data-phone-mask]');
var emailInputs = document.querySelectorAll('[data-email-mask]');
function setMenuState(isOpen) {
if (!menu || !toggle) {
@@ -19,6 +24,67 @@
toggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
}
function setLeadModalState(isOpen, source) {
if (!leadModal) {
return;
}
leadModal.hidden = !isOpen;
body.classList.toggle('lead-modal-is-open', isOpen);
if (!isOpen) {
return;
}
var pageInput = leadModal.querySelector('input[name="lead_page"]');
var sourceInput = leadModal.querySelector('input[name="lead_source"]');
var firstInput = leadModal.querySelector('input[name="lead_name"]');
if (pageInput) {
pageInput.value = document.title + ' | ' + window.location.pathname;
}
if (sourceInput) {
sourceInput.value = source || 'Попап заявки';
}
if (firstInput) {
window.setTimeout(function () {
firstInput.focus();
}, 80);
}
}
function applyPhoneMask(input) {
var digits = input.value.replace(/\D/g, '');
if (digits.charAt(0) === '8') {
digits = '7' + digits.slice(1);
}
if (digits.charAt(0) === '7') {
digits = digits.slice(1);
}
digits = digits.slice(0, 10);
var value = '+7';
if (digits.length > 0) {
value += ' (' + digits.slice(0, 3);
}
if (digits.length >= 3) {
value += ') ' + digits.slice(3, 6);
}
if (digits.length >= 6) {
value += '-' + digits.slice(6, 8);
}
if (digits.length >= 8) {
value += '-' + digits.slice(8, 10);
}
input.value = value;
}
if (menu && toggle) {
toggle.addEventListener('click', function () {
setMenuState(!menu.classList.contains('is-open'));
@@ -46,6 +112,44 @@
});
}
leadOpenNodes.forEach(function (node) {
node.addEventListener('click', function (event) {
event.preventDefault();
setMenuState(false);
setLeadModalState(true, node.getAttribute('data-lead-source') || node.textContent.trim());
});
});
leadCloseNodes.forEach(function (node) {
node.addEventListener('click', function () {
setLeadModalState(false);
});
});
document.addEventListener('keydown', function (event) {
if (event.key === 'Escape') {
setLeadModalState(false);
}
});
phoneInputs.forEach(function (input) {
input.addEventListener('focus', function () {
if (!input.value) {
input.value = '+7';
}
});
input.addEventListener('input', function () {
applyPhoneMask(input);
});
});
emailInputs.forEach(function (input) {
input.addEventListener('input', function () {
input.value = input.value.replace(/\s/g, '').toLowerCase();
});
});
if (cookieNote && cookieButton && window.localStorage) {
if (localStorage.getItem('sevTortCookieAccepted') !== 'yes') {
cookieNote.hidden = false;

View File

@@ -35,8 +35,8 @@ if ( ! defined( 'ABSPATH' ) ) {
<span class="site-footer__title">Контакты</span>
<ul class="site-footer__list">
<li class="site-footer__item"><a class="site-footer__link" href="<?php echo esc_url( sev_tort_site_phone_href() ); ?>"><?php echo esc_html( sev_tort_site_phone() ); ?></a></li>
<li class="site-footer__item"><a class="site-footer__link" href="<?php echo esc_url( sev_tort_whatsapp_url() ); ?>" target="_blank" rel="noopener noreferrer">WhatsApp</a></li>
<li class="site-footer__item"><a class="site-footer__link" href="<?php echo esc_url( sev_tort_telegram_url() ); ?>" target="_blank" rel="noopener noreferrer">Telegram</a></li>
<!-- <li class="site-footer__item"><a class="site-footer__link" href="<?php echo esc_url( sev_tort_whatsapp_url() ); ?>" target="_blank" rel="noopener noreferrer">WhatsApp</a></li>
<li class="site-footer__item"><a class="site-footer__link" href="<?php echo esc_url( sev_tort_telegram_url() ); ?>" target="_blank" rel="noopener noreferrer">Telegram</a></li> -->
<li class="site-footer__item">г. Севастополь</li>
<li class="site-footer__item">Ежедневно: 09:00 - 20:00</li>
</ul>
@@ -48,6 +48,13 @@ if ( ! defined( 'ABSPATH' ) ) {
</div>
</div>
</footer>
<div class="lead-modal" data-lead-modal hidden>
<div class="lead-modal__overlay" data-lead-close></div>
<div class="lead-modal__dialog" role="dialog" aria-modal="true" aria-label="Форма заявки">
<button class="lead-modal__close" type="button" data-lead-close aria-label="Закрыть окно заявки"></button>
<?php get_template_part( 'template-parts/lead-form', null, array( 'title' => 'Оставить контакты', 'page' => 'Попап заявки', 'source' => 'Попап заявки' ) ); ?>
</div>
</div>
<div class="cookie-note" data-cookie-note hidden>
<div class="cookie-note__inner">
<span class="cookie-note__text">Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, Вы соглашаетесь с нашей <a class="cookie-note__link" href="<?php echo esc_url( home_url( '/politika-konfidencialnosti/' ) ); ?>">политикой конфиденциальности</a>.</span>

View File

@@ -13,7 +13,7 @@ get_header();
<h1 class="home-hero__title">Торты на заказ в Севастополе с доставкой</h1>
<p class="home-hero__lead">Готовим бенто, детские, свадебные и праздничные торты под ваш повод. Подберем дизайн, начинку и формат после короткой заявки.</p>
<div class="home-hero__actions">
<a class="button-main" href="<?php echo esc_url( home_url( '/torty-na-zakaz/' ) ); ?>">Рассчитать стоимость</a>
<button class="button-main" type="button" data-lead-open data-lead-source="Рассчитать стоимость: первый экран главной">Рассчитать стоимость</button>
<a class="button-link" href="<?php echo esc_url( sev_tort_telegram_url() ); ?>" target="_blank" rel="noopener noreferrer">Написать в Telegram</a>
</div>
</div>
@@ -83,7 +83,7 @@ get_header();
<li class="home-steps__item">Передаем торт курьером или на самовывоз.</li>
</ol>
</div>
<?php get_template_part( 'template-parts/lead-form', null, array( 'title' => 'Обсудить торт', 'page' => 'Главная' ) ); ?>
<?php get_template_part( 'template-parts/lead-form', null, array( 'title' => 'Обсудить торт', 'page' => 'Главная', 'source' => 'Встроенная форма: блок Как мы работаем' ) ); ?>
</div>
</section>
<section class="home-delivery">
@@ -178,8 +178,8 @@ get_header();
<p class="home-final__text">Напишите нам в мессенджер или оставьте заявку, чтобы получить 2-3 идеи оформления и ориентир по цене.</p>
</div>
<div class="home-final__actions">
<a class="button-main" href="<?php echo esc_url( sev_tort_telegram_url() ); ?>" target="_blank" rel="noopener noreferrer">Telegram</a>
<a class="button-link" href="<?php echo esc_url( sev_tort_whatsapp_url() ); ?>" target="_blank" rel="noopener noreferrer">WhatsApp</a>
<!-- <a class="button-main" href="<?php echo esc_url( sev_tort_telegram_url() ); ?>" target="_blank" rel="noopener noreferrer">Telegram</a>
<a class="button-link" href="<?php echo esc_url( sev_tort_whatsapp_url() ); ?>" target="_blank" rel="noopener noreferrer">WhatsApp</a> -->
<a class="button-link" href="<?php echo esc_url( sev_tort_site_phone_href() ); ?>">Позвонить</a>
</div>
</div>

View File

@@ -43,7 +43,7 @@ if ( ! defined( 'ABSPATH' ) ) {
<li class="site-header__menu-item"><a class="site-header__menu-link" href="<?php echo esc_url( home_url( '/kontakty/' ) ); ?>">Контакты</a></li>
</ul>
</nav>
<a class="site-header__cta" href="<?php echo esc_url( home_url( '/torty-na-zakaz/' ) ); ?>">Заказать торт</a>
<button class="site-header__cta" type="button" data-lead-open data-lead-source="Заказать торт: шапка">Заказать торт</button>
<button class="site-header__burger" type="button" aria-label="Открыть меню" aria-expanded="false" data-menu-toggle>
<span class="site-header__burger-line"></span>
<span class="site-header__burger-line"></span>
@@ -65,9 +65,10 @@ if ( ! defined( 'ABSPATH' ) ) {
<?php endforeach; ?>
</nav>
<div class="mobile-menu__contacts">
<button class="mobile-menu__contact" type="button" data-lead-open data-lead-source="Заказать торт: мобильное меню">Заказать торт</button>
<a class="mobile-menu__contact" href="<?php echo esc_url( sev_tort_site_phone_href() ); ?>"><?php echo esc_html( sev_tort_site_phone() ); ?></a>
<a class="mobile-menu__contact" href="<?php echo esc_url( sev_tort_whatsapp_url() ); ?>" target="_blank" rel="noopener noreferrer">WhatsApp</a>
<a class="mobile-menu__contact" href="<?php echo esc_url( sev_tort_telegram_url() ); ?>" target="_blank" rel="noopener noreferrer">Telegram</a>
<!-- <a class="mobile-menu__contact" href="<?php echo esc_url( sev_tort_whatsapp_url() ); ?>" target="_blank" rel="noopener noreferrer">WhatsApp</a>
<a class="mobile-menu__contact" href="<?php echo esc_url( sev_tort_telegram_url() ); ?>" target="_blank" rel="noopener noreferrer">Telegram</a> -->
</div>
</div>
</div>

View File

@@ -16,20 +16,32 @@ function sev_tort_handle_lead_form() {
sev_tort_redirect_form_status( 'consent' );
}
if ( ! empty( $_POST['lead_company'] ) ) {
sev_tort_redirect_form_status( 'success' );
}
$name = isset( $_POST['lead_name'] ) ? sanitize_text_field( wp_unslash( $_POST['lead_name'] ) ) : '';
$phone = isset( $_POST['lead_phone'] ) ? sanitize_text_field( wp_unslash( $_POST['lead_phone'] ) ) : '';
$email = isset( $_POST['lead_email'] ) ? sanitize_email( wp_unslash( $_POST['lead_email'] ) ) : '';
$message = isset( $_POST['lead_message'] ) ? sanitize_textarea_field( wp_unslash( $_POST['lead_message'] ) ) : '';
$page = isset( $_POST['lead_page'] ) ? sanitize_text_field( wp_unslash( $_POST['lead_page'] ) ) : '';
$source = isset( $_POST['lead_source'] ) ? sanitize_text_field( wp_unslash( $_POST['lead_source'] ) ) : '';
if ( '' === $phone ) {
if ( '' === $phone || ! preg_match( '/^\+7 \([0-9]{3}\) [0-9]{3}-[0-9]{2}-[0-9]{2}$/', $phone ) ) {
sev_tort_redirect_form_status( 'error' );
}
if ( '' !== $email && ! is_email( $email ) ) {
sev_tort_redirect_form_status( 'error' );
}
$text = "Новая заявка с сайта sevastopol-tort.ru\n";
$text .= "Страница: " . $page . "\n";
$text .= "Имя: " . ( $name ? $name : 'не указано' ) . "\n";
$text .= "Телефон: " . $phone . "\n";
$text .= "Комментарий: " . ( $message ? $message : 'не указан' );
$text .= 'Страница: ' . ( $page ? $page : 'не указана' ) . "\n";
$text .= 'Источник: ' . ( $source ? $source : 'не указан' ) . "\n";
$text .= 'Имя: ' . ( $name ? $name : 'не указано' ) . "\n";
$text .= 'Телефон: ' . $phone . "\n";
$text .= 'Почта: ' . ( $email ? $email : 'не указана' ) . "\n";
$text .= 'Комментарий: ' . ( $message ? $message : 'не указан' );
$sent = sev_tort_send_telegram_message( $text );

View File

@@ -5,20 +5,20 @@ if ( ! defined( 'ABSPATH' ) ) {
}
function sev_tort_site_phone() {
return '+7 (978) 000-00-00';
return '+7 (911) 774-89-23';
}
function sev_tort_site_phone_href() {
return 'tel:+79780000000';
return 'tel:+7 (911) 774-8923';
}
function sev_tort_whatsapp_url() {
return 'https://wa.me/79780000000';
}
// function sev_tort_whatsapp_url() {
// return 'https://wa.me/79780000000';
// }
function sev_tort_telegram_url() {
return 'https://t.me/sevastopol_tort';
}
// function sev_tort_telegram_url() {
// return 'https://t.me/sevastopol_tort';
// }
function sev_tort_pages() {
return array(

View File

@@ -117,7 +117,7 @@ get_header();
<h2 class="section-title">Понравился стиль из портфолио?</h2>
<p class="portfolio-lead__text">Отправьте пример, дату и пожелания по весу. Подскажем начинку, стоимость и ближайший свободный срок.</p>
</div>
<?php get_template_part( 'template-parts/lead-form', null, array( 'context' => 'portfolio' ) ); ?>
<?php get_template_part( 'template-parts/lead-form', null, array( 'title' => 'Оставить заявку', 'page' => 'Портфолио', 'source' => 'Встроенная форма: портфолио' ) ); ?>
</div>
</section>
</main>

View File

@@ -20,7 +20,7 @@ get_header();
<h1 class="service-hero__title"><?php echo esc_html( $page['h1'] ); ?></h1>
<p class="service-hero__lead"><?php echo esc_html( $page['lead'] ); ?></p>
<div class="service-hero__actions">
<a class="button-main" href="#lead-form">Получить расчет</a>
<button class="button-main" type="button" data-lead-open data-lead-source="Получить расчет: первый экран <?php echo esc_attr( $page['label'] ); ?>">Получить расчет</button>
<a class="button-link" href="<?php echo esc_url( sev_tort_telegram_url() ); ?>" target="_blank" rel="noopener noreferrer">Написать в Telegram</a>
</div>
</div>
@@ -115,7 +115,7 @@ get_header();
<h2 class="section-title">Расскажите, какой торт нужен</h2>
<p class="service-lead__text">Укажите дату, повод, примерный вес и пожелания по декору. Если пока нет точной идеи, поможем подобрать варианты.</p>
</div>
<?php get_template_part( 'template-parts/lead-form', null, array( 'title' => 'Получить расчет', 'page' => $page['title'] ) ); ?>
<?php get_template_part( 'template-parts/lead-form', null, array( 'title' => 'Получить расчет', 'page' => $page['title'], 'source' => 'Встроенная форма: страница ' . $page['label'] ) ); ?>
</div>
</section>
</main>

View File

@@ -5,10 +5,13 @@ if ( ! defined( 'ABSPATH' ) ) {
$form_title = isset( $args['title'] ) ? $args['title'] : 'Оставить заявку';
$form_page = isset( $args['page'] ) ? $args['page'] : '';
$form_source = isset( $args['source'] ) ? $args['source'] : 'Встроенная форма';
?>
<form class="lead-form" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post">
<input type="hidden" name="action" value="sev_tort_lead">
<input type="hidden" name="lead_page" value="<?php echo esc_attr( $form_page ); ?>">
<input type="hidden" name="lead_source" value="<?php echo esc_attr( $form_source ); ?>">
<input class="lead-form__trap" type="text" name="lead_company" value="" tabindex="-1" autocomplete="off" aria-hidden="true">
<?php wp_nonce_field( 'sev_tort_lead', 'sev_tort_nonce' ); ?>
<div class="lead-form__head">
<span class="lead-form__title"><?php echo esc_html( $form_title ); ?></span>
@@ -20,7 +23,11 @@ $form_page = isset( $args['page'] ) ? $args['page'] : '';
</label>
<label class="lead-form__field">
<span class="lead-form__label">Телефон</span>
<input class="lead-form__input" type="tel" name="lead_phone" autocomplete="tel" placeholder="+7" required>
<input class="lead-form__input" type="tel" name="lead_phone" autocomplete="tel" inputmode="tel" placeholder="+7 (___) ___-__-__" pattern="^\+7 \([0-9]{3}\) [0-9]{3}-[0-9]{2}-[0-9]{2}$" data-phone-mask required>
</label>
<label class="lead-form__field">
<span class="lead-form__label">Почта</span>
<input class="lead-form__input" type="email" name="lead_email" autocomplete="email" inputmode="email" placeholder="name@example.ru" pattern="^[^@\s]+@[^@\s]+\.[^@\s]+$" data-email-mask>
</label>
<label class="lead-form__field">
<span class="lead-form__label">Комментарий</span>