diff --git a/wp-content/themes/sevastopol-tort-child/assets/css/portfolio-page.css b/wp-content/themes/sevastopol-tort-child/assets/css/portfolio-page.css index 5943e68..8d0340e 100644 --- a/wp-content/themes/sevastopol-tort-child/assets/css/portfolio-page.css +++ b/wp-content/themes/sevastopol-tort-child/assets/css/portfolio-page.css @@ -68,6 +68,29 @@ color: var(--color-muted); } +.portfolio-hero__links { + grid-column: 1 / -1; + display: flex; + flex-wrap: wrap; + gap: 12px; +} + +.portfolio-hero__link { + border: 1px solid var(--color-line); + border-radius: 999px; + background: var(--color-surface); + color: var(--color-text); + font-weight: 800; + text-decoration: none; + padding: 10px 15px; + transition: border-color 0.2s ease, color 0.2s ease; +} + +.portfolio-hero__link:hover { + border-color: var(--color-accent); + color: var(--color-accent-dark); +} + .portfolio-gallery { padding: 28px 0 76px; background: var(--color-bg); @@ -127,6 +150,13 @@ transform: scale(1.04); } +.portfolio-gallery__action { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 18px; +} + .portfolio-lead { padding: 70px 0; background: var(--color-surface-soft); diff --git a/wp-content/themes/sevastopol-tort-child/assets/css/responsive.css b/wp-content/themes/sevastopol-tort-child/assets/css/responsive.css index 0d0bdb1..5533b17 100644 --- a/wp-content/themes/sevastopol-tort-child/assets/css/responsive.css +++ b/wp-content/themes/sevastopol-tort-child/assets/css/responsive.css @@ -40,6 +40,10 @@ .service-hero, .service-details, .service-commerce, + .service-prices, + .service-terms, + .service-reviews, + .service-related, .service-formats, .service-process, .service-faq, @@ -69,6 +73,10 @@ .service-details__grid, .service-commerce__grid, + .service-prices__grid, + .service-terms__grid, + .service-reviews__grid, + .service-related__grid, .service-formats__grid, .home-categories__grid, .home-commerce__grid, @@ -96,6 +104,10 @@ .service-hero__inner, .service-details__inner, .service-commerce__inner, + .service-prices__inner, + .service-terms__inner, + .service-reviews__inner, + .service-related__inner, .service-formats__inner, .service-process__inner, .service-faq__inner, diff --git a/wp-content/themes/sevastopol-tort-child/assets/css/service-page.css b/wp-content/themes/sevastopol-tort-child/assets/css/service-page.css index 7f11b5c..8e90749 100644 --- a/wp-content/themes/sevastopol-tort-child/assets/css/service-page.css +++ b/wp-content/themes/sevastopol-tort-child/assets/css/service-page.css @@ -65,6 +65,10 @@ .service-details, .service-commerce, +.service-prices, +.service-terms, +.service-reviews, +.service-related, .service-process, .service-lead { padding: 70px 0; @@ -72,6 +76,10 @@ .service-details__inner, .service-commerce__inner, +.service-prices__inner, +.service-terms__inner, +.service-reviews__inner, +.service-related__inner, .service-process__inner, .service-lead__inner { width: min(100% - 40px, var(--container)); @@ -143,6 +151,110 @@ margin-top: 10px; } +.service-prices { + background: var(--color-bg); +} + +.service-prices__inner, +.service-terms__inner, +.service-reviews__inner, +.service-related__inner { + display: grid; + gap: 30px; +} + +.service-prices__head, +.service-terms__head, +.service-reviews__head, +.service-related__head { + display: grid; + gap: 18px; + max-width: 850px; +} + +.service-prices__lead { + max-width: 760px; + color: var(--color-muted); + font-size: var(--fz-md); +} + +.service-prices__grid, +.service-terms__grid, +.service-reviews__grid, +.service-related__grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.service-price-card, +.service-term-card, +.service-review-card, +.service-related-card { + display: grid; + gap: 10px; + border: 1px solid var(--color-line); + border-radius: var(--radius-md); + background: var(--color-surface); + padding: 22px; + box-shadow: var(--shadow-soft); +} + +.service-price-card__price { + color: var(--color-accent-dark); + font-size: var(--fz-lg); + font-weight: 800; + line-height: 1.1; +} + +.service-price-card__title, +.service-term-card__title { + font-size: var(--fz-md); + font-weight: 800; + line-height: 1.2; +} + +.service-price-card__text, +.service-term-card__text, +.service-review-card__text, +.service-related-card__text { + color: var(--color-muted); +} + +.service-terms, +.service-reviews { + background: var(--color-surface-soft); +} + +.service-review-card__author { + margin-top: 8px; + color: var(--color-text); + font-weight: 800; +} + +.service-review-card__occasion { + color: var(--color-accent-dark); + font-size: var(--fz-sm); + font-weight: 800; +} + +.service-related-card { + color: inherit; + text-decoration: none; + transition: transform 0.2s ease, border-color 0.2s ease; +} + +.service-related-card:hover { + border-color: var(--color-accent); + transform: translateY(-2px); +} + +.service-related-card__title { + color: var(--color-text); + font-size: var(--fz-md); + font-weight: 800; +} + .service-formats { padding: 70px 0; background: var(--color-surface-soft); diff --git a/wp-content/themes/sevastopol-tort-child/inc/theme-data.php b/wp-content/themes/sevastopol-tort-child/inc/theme-data.php index 487eb65..acc0070 100644 --- a/wp-content/themes/sevastopol-tort-child/inc/theme-data.php +++ b/wp-content/themes/sevastopol-tort-child/inc/theme-data.php @@ -340,6 +340,14 @@ function sev_tort_pages() { function sev_tort_page_config( $slug, $label, $title, $description, $h1, $lead, $image, $content = array(), $style = 'service-page.css' ) { $seo_meta = sev_tort_seo_meta_map(); $seo = isset( $seo_meta[ $slug ] ) ? $seo_meta[ $slug ] : array(); + $addons = sev_tort_content_addons( $slug ); + + if ( isset( $addons['faq'] ) ) { + $content['faq'] = array_merge( isset( $content['faq'] ) ? $content['faq'] : array(), $addons['faq'] ); + unset( $addons['faq'] ); + } + + $content = array_replace( $content, $addons ); return array( 'slug' => $slug, @@ -357,6 +365,191 @@ function sev_tort_page_config( $slug, $label, $title, $description, $h1, $lead, ); } +function sev_tort_content_addons( $slug ) { + $common_related = array( + array( 'title' => 'Цены', 'text' => 'Посмотреть ориентиры по стоимости и понять, что влияет на расчет.', 'url' => '/ceny/' ), + array( 'title' => 'Начинки', 'text' => 'Выбрать вкус: шоколад, ягоды, карамель, сливочные и легкие сочетания.', 'url' => '/nachinki/' ), + array( 'title' => 'Портфолио', 'text' => 'Посмотреть реальные стили декора и сохранить референс для заявки.', 'url' => '/portfolio/' ), + array( 'title' => 'Доставка и оплата', 'text' => 'Уточнить условия доставки, самовывоза, оплаты и предоплаты.', 'url' => '/dostavka-i-oplata/' ), + ); + + $category_addons = array( + 'torty-na-zakaz' => array( + 'price_cards' => array( + array( 'title' => 'Бенто', 'price' => '1 500-1 800 ₽', 'text' => 'Базовый формат около 500-550 г с надписью или простым декором.' ), + array( 'title' => 'Праздничные торты', 'price' => '2 000-2 500 ₽/кг', 'text' => 'Ориентир для детских, тематических и тортов на день рождения.' ), + array( 'title' => 'Сложный декор', 'price' => 'индивидуально', 'text' => 'Фигурки, съедобная печать, многоярусность и срочность считаются отдельно.' ), + ), + 'related_links' => $common_related, + ), + 'bento' => array( + 'price_cards' => array( + array( 'title' => 'Базовый бенто', 'price' => '1 500-1 800 ₽', 'text' => 'Около 500-550 г, подходит для подарка, свидания или короткого поздравления.' ), + array( 'title' => 'Бенто макси', 'price' => '2 200-2 500 ₽', 'text' => 'Около 1 кг, когда нужен компактный торт на несколько порций.' ), + array( 'title' => 'Персональный декор', 'price' => 'по задаче', 'text' => 'Надпись, сердечки, мем, цветовая гамма или иллюстрация по референсу.' ), + ), + 'faq' => array( + array( 'q' => 'Чем отличается бенто макси от обычного бенто?', 'a' => 'Обычный бенто обычно весит около 500-550 г, а бенто макси ближе к 1 кг и подходит, если торт нужен не только как символический подарок.' ), + array( 'q' => 'Можно ли выбрать надпись для бенто?', 'a' => 'Да, можно прислать короткую фразу, имя, дату, шутку или пример надписи. Мы подскажем, что поместится на торте аккуратно.' ), + ), + 'related_links' => $common_related, + ), + 'detskie' => array( + 'price_cards' => array( + array( 'title' => 'Базовый детский торт', 'price' => '2 000-2 500 ₽/кг', 'text' => 'Ориентир для торта с кремовым декором, ягодами, цифрой или простой темой.' ), + array( 'title' => 'Герои и фигурки', 'price' => 'выше базового', 'text' => 'Мастичные фигурки, машинки, единороги и съедобная печать увеличивают стоимость.' ), + array( 'title' => 'Доставка к празднику', 'price' => '0 ₽ от 2 500 ₽', 'text' => 'Доставляем по районам Севастополя или готовим заказ к самовывозу.' ), + ), + 'faq' => array( + array( 'q' => 'Можно ли сделать торт с машинками, единорогом или героем мультфильма?', 'a' => 'Да, пришлите тему и примеры. Мы предложим декор, который реально выполнить в нужный срок и под ваш бюджет.' ), + array( 'q' => 'Есть ли ограничения по начинкам для детского торта?', 'a' => 'Жестких ограничений нет. Обычно для детей выбирают понятные мягкие вкусы, но начинку можно подобрать индивидуально.' ), + ), + 'related_links' => $common_related, + ), + 'svadebnye' => array( + 'price_cards' => array( + array( 'title' => 'Базовый ярусный торт', 'price' => 'от 3 000-4 000 ₽', 'text' => 'Итог зависит от веса, числа ярусов, начинки и оформления.' ), + array( 'title' => 'Сложная композиция', 'price' => '10 000-13 000 ₽+', 'text' => 'Многоярусность, цветы, ленты, монограмма и сложная сборка считаются индивидуально.' ), + array( 'title' => 'Доставка на площадку', 'price' => 'по условиям', 'text' => 'Согласуем адрес, время передачи и безопасную упаковку для свадебного торта.' ), + ), + 'faq' => array( + array( 'q' => 'Сколько порций закладывать на свадебный торт?', 'a' => 'Ориентир зависит от меню, количества гостей и подачи. В заявке укажите число гостей, а мы подскажем комфортный вес.' ), + array( 'q' => 'Можно ли сделать монограмму или декор в цветах свадьбы?', 'a' => 'Да, можно прислать палитру, фото декора зала и референсы. Подберем оформление под общий стиль свадьбы.' ), + ), + 'related_links' => $common_related, + ), + 'korporativnye' => array( + 'price_cards' => array( + array( 'title' => 'Торт с логотипом', 'price' => '3 500-5 000 ₽+', 'text' => 'Цена зависит от размера, брендирования, цветовой палитры и способа нанесения логотипа.' ), + array( 'title' => 'Большой торт для команды', 'price' => 'по весу', 'text' => 'Рассчитаем вес под количество сотрудников, клиентов или гостей мероприятия.' ), + array( 'title' => 'Оплата от компании', 'price' => 'расчетный счет', 'text' => 'Доступны наличные, перевод, карта и оплата на расчетный счет.' ), + ), + 'faq' => array( + array( 'q' => 'Можно ли оплатить корпоративный торт по расчетному счету?', 'a' => 'Да, для корпоративных заказов доступна оплата на расчетный счет. Условия согласуем после заявки.' ), + array( 'q' => 'Какие материалы нужны для торта с логотипом?', 'a' => 'Лучше прислать логотип, фирменные цвета и пожелания по надписи. Если есть брендбук, можно отправить его тоже.' ), + ), + 'related_links' => $common_related, + ), + 'na-den-rozhdeniya' => array( + 'price_cards' => array( + array( 'title' => 'Торт на день рождения', 'price' => '2 000-2 500 ₽/кг', 'text' => 'Базовый ориентир для праздничного торта с надписью, цифрой возраста или декором.' ), + array( 'title' => 'Индивидуальная тема', 'price' => 'выше базового', 'text' => 'Хобби, персонажи, сложные детали и съедобная печать влияют на итоговую цену.' ), + array( 'title' => 'Доставка в день праздника', 'price' => '0 ₽ от 2 500 ₽', 'text' => 'Доставляем по Севастополю или передаем заказ на самовывоз.' ), + ), + 'faq' => array( + array( 'q' => 'Можно ли сделать торт по хобби именинника?', 'a' => 'Да, можно прислать описание человека, любимые цвета, хобби и примеры. Мы предложим идею, которую можно аккуратно перенести в декор.' ), + array( 'q' => 'Можно ли заказать торт с цифрой возраста?', 'a' => 'Да, цифру можно добавить в декор, надпись или сделать частью общей композиции.' ), + ), + 'related_links' => $common_related, + ), + 'srochnyj-zakaz' => array( + 'price_cards' => array( + array( 'title' => 'Срочный бенто', 'price' => 'от 1 500 ₽', 'text' => 'Возможен при свободном окне и простом декоре.' ), + array( 'title' => 'Срочный праздничный торт', 'price' => 'по расчету', 'text' => 'Срок, вес и сложность оформления влияют на возможность заказа.' ), + array( 'title' => 'Быстрая доставка', 'price' => '0 ₽ от 2 500 ₽', 'text' => 'Если заказ готов, согласуем доставку по Севастополю или самовывоз.' ), + ), + 'faq' => array( + array( 'q' => 'Что написать в срочной заявке?', 'a' => 'Укажите дату и время, повод, примерный вес, адрес доставки и желаемый декор. Так мы быстрее поймем, что можно успеть.' ), + array( 'q' => 'Можно ли срочно сделать сложные фигурки?', 'a' => 'Чаще всего нет: сложный декор требует подготовки. При срочном заказе предложим более быстрые и аккуратные варианты.' ), + ), + 'related_links' => $common_related, + ), + ); + + $service_addons = array( + 'ceny' => array( + 'price_cards' => array( + array( 'title' => 'Бенто 500-550 г', 'price' => '1 500-1 800 ₽', 'text' => 'Базовый мини-торт с надписью или простым декором.' ), + array( 'title' => 'Бенто макси около 1 кг', 'price' => '2 200-2 500 ₽', 'text' => 'Больше порций при компактном формате подарочного торта.' ), + array( 'title' => 'Детские и день рождения', 'price' => '2 000-2 500 ₽/кг', 'text' => 'Точная цена зависит от темы, начинки, печати, фигурок и срочности.' ), + array( 'title' => 'Свадебные', 'price' => 'от 3 000-4 000 ₽', 'text' => 'Многоярусные и сложные композиции могут стоить 10 000-13 000 ₽ и выше.' ), + array( 'title' => 'Корпоративные', 'price' => '3 500-5 000 ₽+', 'text' => 'Логотип, фирменные цвета и масштаб брендирования считаются индивидуально.' ), + array( 'title' => 'Доставка', 'price' => '0 ₽ от 2 500 ₽', 'text' => 'Если заказ дешевле 2 500 ₽, доставка по Севастополю стоит 500 ₽.' ), + ), + 'conditions' => array( + array( 'title' => 'Предоплата', 'text' => 'Для фиксации заказа нужна предоплата 30% после согласования даты, веса, декора и стоимости.' ), + array( 'title' => 'Способы оплаты', 'text' => 'Доступны наличные, перевод, карта и оплата на расчетный счет.' ), + array( 'title' => 'Индивидуальный расчет', 'text' => 'Сложные фигурки, съедобная печать, многоярусность, срочность и доставка влияют на итоговую сумму.' ), + ), + 'related_links' => $common_related, + ), + 'dostavka-i-oplata' => array( + 'intro' => array( + 'title' => 'Доставка по всем районам Севастополя', + 'text' => 'Доставляем торты по Севастополю, согласуем удобный интервал и аккуратную передачу заказа. Также доступен самовывоз после подтверждения готовности.', + ), + 'cards' => array( + array( 'title' => 'Бесплатная доставка', 'text' => 'При стоимости заказа от 2 500 ₽ доставка по Севастополю бесплатная.' ), + array( 'title' => 'Доставка 500 ₽', 'text' => 'Если сумма заказа меньше 2 500 ₽, доставка стоит 500 ₽.' ), + array( 'title' => 'Самовывоз', 'text' => 'Можно забрать торт самостоятельно в согласованное время.' ), + ), + 'formats_title' => 'Как можно оплатить заказ', + 'formats' => array( 'Наличными', 'Переводом', 'Картой', 'На расчетный счет', 'Предоплата 30%', 'Остаток после согласования' ), + 'conditions' => array( + array( 'title' => 'Как подготовиться к доставке', 'text' => 'Укажите точный адрес, дату, желаемый интервал и контактный телефон получателя.' ), + array( 'title' => 'Как хранить торт', 'text' => 'После получения держите торт в холодильнике и доставайте незадолго до подачи.' ), + array( 'title' => 'Перенос заказа', 'text' => 'Если дата изменилась, сообщите заранее: проверим свободное окно и возможность переноса.' ), + ), + 'faq' => array( + array( 'q' => 'Доставляете ли вы во все районы Севастополя?', 'a' => 'Да, доставка доступна по всем районам Севастополя. Время и адрес согласуем при подтверждении заказа.' ), + array( 'q' => 'Когда доставка бесплатная?', 'a' => 'Доставка бесплатная при стоимости заказа от 2 500 ₽. Если заказ дешевле, доставка стоит 500 ₽.' ), + array( 'q' => 'Какая предоплата нужна?', 'a' => 'Для фиксации заказа нужна предоплата 30% после согласования всех деталей.' ), + ), + 'related_links' => $common_related, + ), + 'otzyvy' => array( + 'intro' => array( + 'title' => 'Что обычно отмечают клиенты', + 'text' => 'В отзывах чаще всего важны вкус, аккуратность декора, совпадение с референсом, бережная доставка и понятная коммуникация перед заказом.', + ), + 'reviews' => array( + array( 'name' => 'Анна', 'occasion' => 'День рождения', 'text' => 'Заказывали торт с надписью и ягодами. Все согласовали быстро, торт приехал аккуратно упакованным, по вкусу получился нежный и не приторный.' ), + array( 'name' => 'Марина', 'occasion' => 'Детский праздник', 'text' => 'Нужен был торт в яркой теме для ребенка. Помогли выбрать начинку и подсказали, какой декор лучше успеем сделать к дате.' ), + array( 'name' => 'Игорь', 'occasion' => 'Корпоратив', 'text' => 'Делали торт с логотипом для команды. Понравилось, что заранее уточнили вес, цвета и способ оплаты, а доставку привезли вовремя.' ), + ), + 'conditions' => array( + array( 'title' => 'Фото после праздника', 'text' => 'Если клиент присылает фото торта на столе, добавляем его в портфолио с разрешения.' ), + array( 'title' => 'Отзывы из мессенджеров', 'text' => 'Скриншоты отзывов лучше размещать только реальные, с согласия клиента и без личных данных.' ), + array( 'title' => 'Что помогает заказу', 'text' => 'Чем точнее референс, дата и количество гостей, тем быстрее получается рассчитать торт.' ), + ), + 'related_links' => $common_related, + ), + 'kontakty' => array( + 'intro' => array( + 'title' => 'Как быстрее получить расчет', + 'text' => 'Напишите дату праздника, повод, примерное количество гостей, желаемую начинку, адрес доставки и приложите фото-референс, если он есть.', + ), + 'cards' => array( + array( 'title' => 'ИП', 'text' => 'Максимов Антон Сергеевич.' ), + array( 'title' => 'Доставка', 'text' => 'По всем районам Севастополя. Бесплатно при заказе от 2 500 ₽, иначе 500 ₽.' ), + array( 'title' => 'Оплата', 'text' => 'Наличные, перевод, карта или расчетный счет. Предоплата 30%.' ), + ), + 'formats_title' => 'Что указать в заявке', + 'formats' => array( 'Дата и время', 'Повод', 'Количество гостей', 'Желаемый декор', 'Начинка', 'Адрес доставки' ), + 'conditions' => array( + array( 'title' => 'Телефон', 'text' => sev_tort_site_phone() ), + array( 'title' => 'Telegram', 'text' => 'Можно отправить референсы, пожелания и фото примеров.' ), + array( 'title' => 'Самовывоз', 'text' => 'Доступен по предварительному согласованию времени выдачи.' ), + ), + 'related_links' => $common_related, + ), + 'faq' => array( + 'conditions' => array( + array( 'title' => 'Нет ограничений по начинкам', 'text' => 'Можно обсудить любые популярные сочетания, которые подходят под формат и срок заказа.' ), + array( 'title' => 'Предоплата 30%', 'text' => 'Заказ фиксируется после согласования деталей и внесения предоплаты.' ), + array( 'title' => 'Доставка по Севастополю', 'text' => 'Бесплатно от 2 500 ₽, иначе 500 ₽. Самовывоз тоже доступен.' ), + ), + 'related_links' => $common_related, + ), + ); + + if ( isset( $category_addons[ $slug ] ) ) { + return $category_addons[ $slug ]; + } + + return isset( $service_addons[ $slug ] ) ? $service_addons[ $slug ] : array(); +} + function sev_tort_seo_meta_map() { return array( 'torty-na-zakaz' => array( diff --git a/wp-content/themes/sevastopol-tort-child/page-templates/page-portfolio.php b/wp-content/themes/sevastopol-tort-child/page-templates/page-portfolio.php index c9e9ef7..25a69e0 100644 --- a/wp-content/themes/sevastopol-tort-child/page-templates/page-portfolio.php +++ b/wp-content/themes/sevastopol-tort-child/page-templates/page-portfolio.php @@ -72,6 +72,14 @@ function sev_tort_portfolio_image_groups() { } $portfolio_groups = sev_tort_portfolio_image_groups(); +$portfolio_links = array( + array( 'title' => 'Бенто', 'url' => '/bento/' ), + array( 'title' => 'Детские', 'url' => '/detskie/' ), + array( 'title' => 'Свадебные', 'url' => '/svadebnye/' ), + array( 'title' => 'Корпоративные', 'url' => '/korporativnye/' ), + array( 'title' => 'На день рождения', 'url' => '/na-den-rozhdeniya/' ), + array( 'title' => 'Цены', 'url' => '/ceny/' ), +); get_header(); ?> @@ -87,6 +95,11 @@ get_header(); + @@ -105,6 +118,10 @@ get_header(); +
Финальная стоимость зависит от веса, начинки, декора, срочности и доставки. Ниже указаны ориентиры, точный расчет сделаем после заявки.
+