Compare commits
10 Commits
d0567fda86
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| e7450aad74 | |||
| 21c0520b0e | |||
| 2e9e7ace4b | |||
| 30000857c1 | |||
| 85aa6ae65e | |||
| 49709e8cf8 | |||
| fe22b37b0e | |||
| 7ff8d06780 | |||
| 8f1f001085 | |||
| 82105c6f09 |
@@ -0,0 +1,5 @@
|
|||||||
|
.DS_Store
|
||||||
|
.claude/
|
||||||
|
wordpress/
|
||||||
|
node_modules/
|
||||||
|
*.log
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: mysql:8.0
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: rootpass
|
||||||
|
MYSQL_DATABASE: bitwms
|
||||||
|
MYSQL_USER: bitwms
|
||||||
|
MYSQL_PASSWORD: bitwms
|
||||||
|
volumes:
|
||||||
|
- db_data:/var/lib/mysql
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
|
||||||
|
wordpress:
|
||||||
|
image: wordpress:php8.2-apache
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
environment:
|
||||||
|
WORDPRESS_DB_HOST: db:3306
|
||||||
|
WORDPRESS_DB_NAME: bitwms
|
||||||
|
WORDPRESS_DB_USER: bitwms
|
||||||
|
WORDPRESS_DB_PASSWORD: bitwms
|
||||||
|
WORDPRESS_LOCALE: ru_RU
|
||||||
|
volumes:
|
||||||
|
- wp_data:/var/www/html
|
||||||
|
- ./wp-content/themes/bitwms-child:/var/www/html/wp-content/themes/bitwms-child
|
||||||
|
|
||||||
|
wpcli:
|
||||||
|
image: wordpress:cli
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- wordpress
|
||||||
|
environment:
|
||||||
|
WORDPRESS_DB_HOST: db:3306
|
||||||
|
WORDPRESS_DB_NAME: bitwms
|
||||||
|
WORDPRESS_DB_USER: bitwms
|
||||||
|
WORDPRESS_DB_PASSWORD: bitwms
|
||||||
|
volumes:
|
||||||
|
- wp_data:/var/www/html
|
||||||
|
- ./wp-content/themes/bitwms-child:/var/www/html/wp-content/themes/bitwms-child
|
||||||
|
entrypoint: wp
|
||||||
|
command: "--info"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db_data:
|
||||||
|
wp_data:
|
||||||
@@ -0,0 +1,323 @@
|
|||||||
|
# Экспертный портал БИТ.WMS
|
||||||
|
|
||||||
|
## Презентация проекта
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. О проекте
|
||||||
|
|
||||||
|
**БИТ.WMS** — экспертный информационный портал по складской логистике и автоматизации склада от компании «Первый Бит».
|
||||||
|
|
||||||
|
Портал сочетает два направления:
|
||||||
|
- **Экспертный контент** — статьи, вебинары, курсы, кейсы и материалы по складской логистике
|
||||||
|
- **Продвижение решений** — продуктовая страница БИТ.WMS с демонстрацией возможностей и формами захвата лидов
|
||||||
|
|
||||||
|
**Позиционирование:** «Мы — эксперты в складской логистике. Знаем всё о складе и автоматизации». Подход pull-продаж: привлечение клиентов через ценный контент, а не прямую рекламу.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Цели и задачи
|
||||||
|
|
||||||
|
### Главная цель
|
||||||
|
Генерация лидов, звонков и подписок по направлению продажи и внедрения WMS-решений.
|
||||||
|
|
||||||
|
### Задачи портала
|
||||||
|
|
||||||
|
| Задача | Как решается |
|
||||||
|
|--------|-------------|
|
||||||
|
| Привлечение целевой аудитории | SEO-оптимизированный экспертный контент (статьи, вебинары, материалы) |
|
||||||
|
| Демонстрация экспертности | Кейсы внедрения, записи вебинаров, обучающие курсы |
|
||||||
|
| Захват контактов | Формы обратной связи, подписка на рассылку, gated-контент (скачивание за email) |
|
||||||
|
| Продажа продукта БИТ.WMS | Продуктовая страница с функциями, преимуществами и формой демо |
|
||||||
|
| Вовлечение и удержание | Онлайн-консультант (JivoSite), callback-виджет, попапы, email-рассылка |
|
||||||
|
| Аналитика эффективности | Яндекс.Метрика, Google Analytics, CallTouch — отслеживание всех точек контакта |
|
||||||
|
|
||||||
|
### KPI сайта
|
||||||
|
|
||||||
|
- Количество лидов через web-формы
|
||||||
|
- Количество подписок на рассылку
|
||||||
|
- Количество звонков с сайта (CallTouch)
|
||||||
|
- Обращения через callback-виджет
|
||||||
|
- Диалоги в онлайн-консультанте
|
||||||
|
- Конверсия трафика в лиды
|
||||||
|
- Стоимость лида
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Целевая аудитория
|
||||||
|
|
||||||
|
| Сегмент | Потребность |
|
||||||
|
|---------|-------------|
|
||||||
|
| Руководители складов | Оптимизация процессов, снижение ошибок, ускорение работы |
|
||||||
|
| IT-директора и сотрудники IT-отделов | Выбор и внедрение WMS-системы, интеграция с существующими решениями |
|
||||||
|
| Директора предприятий | ROI от автоматизации, стратегические решения |
|
||||||
|
| Предприниматели (МСБ) | Масштабирование бизнеса, автоматизация складского учёта |
|
||||||
|
| Финансовые менеджеры | Расчёт окупаемости, оптимизация затрат |
|
||||||
|
|
||||||
|
### Ценностное предложение
|
||||||
|
- **Экспертность** — глубокое знание отрасли, проверенные решения
|
||||||
|
- **Комплексность** — единое окно для всех задач складской логистики
|
||||||
|
- **Прозрачность** — открытый опыт, кейсы, ценовая политика
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Структура сайта
|
||||||
|
|
||||||
|
```
|
||||||
|
Главная страница
|
||||||
|
│
|
||||||
|
├── БИТ.WMS (продуктовая страница)
|
||||||
|
│ ├── Функции системы
|
||||||
|
│ ├── Заказать демо (форма)
|
||||||
|
│ └── Анкета для детального запроса
|
||||||
|
│
|
||||||
|
├── Кейсы
|
||||||
|
│ ├── Архив кейсов (карточки с фильтрацией)
|
||||||
|
│ └── Детальная страница кейса
|
||||||
|
│
|
||||||
|
├── Статьи
|
||||||
|
│ ├── Архив статей
|
||||||
|
│ └── Детальная страница статьи
|
||||||
|
│
|
||||||
|
├── Вебинары
|
||||||
|
│ ├── Архив вебинаров
|
||||||
|
│ └── Детальная страница (анонс / запись)
|
||||||
|
│
|
||||||
|
├── Курсы
|
||||||
|
│ ├── Архив курсов
|
||||||
|
│ └── Детальная страница курса
|
||||||
|
│
|
||||||
|
├── Мероприятия
|
||||||
|
│ ├── Архив мероприятий
|
||||||
|
│ └── Детальная страница мероприятия
|
||||||
|
│
|
||||||
|
├── Материалы (скачиваемые)
|
||||||
|
│ └── Архив материалов (PDF, видео, чек-листы)
|
||||||
|
│
|
||||||
|
├── Новости
|
||||||
|
│ ├── Архив новостей
|
||||||
|
│ └── Детальная страница новости
|
||||||
|
│
|
||||||
|
└── Контакты
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Состав блоков по страницам
|
||||||
|
|
||||||
|
### 5.1. Главная страница
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Герой** | Крупный заголовок с экспертным посылом, подзаголовок, две CTA-кнопки («Заказать демо» и «Смотреть кейсы»), KPI-цифры (200+ проектов, 15+ лет, 50+ экспертов) |
|
||||||
|
| **Фильтр по рубрикам** | Горизонтальная полоса тегов: Все, Статьи, Кейсы, Вебинары, Курсы, Мероприятия, Материалы. Фильтрация без перезагрузки страницы (AJAX) |
|
||||||
|
| **Лента контента** | Карточки контента в сетке 3 колонки. Каждая карточка: изображение, бейдж типа, заголовок, описание, дата. Кнопка «Показать ещё» |
|
||||||
|
| **Промо БИТ.WMS** | Краткий блок продукта на сером фоне: 4 преимущества (быстро, собственная разработка, проверено, прозрачно) + CTA-кнопки |
|
||||||
|
| **Подписка на рассылку** | Поле email + кнопка «Подписаться». Интеграция с Unisender |
|
||||||
|
| **Наши клиенты** | Логотипы компаний-клиентов в горизонтальной строке |
|
||||||
|
|
||||||
|
### 5.2. Страница продукта БИТ.WMS
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Герой продукта** | H1 «БИТ.WMS», подзаголовок, описание, CTA: «Заказать демо» + «Скачать презентацию» (за email) |
|
||||||
|
| **Функции** | Сетка из 6 карточек: Приёмка, Размещение, Хранение, Отбор, Отгрузка, Инвентаризация. Каждая: описание + результат внедрения |
|
||||||
|
| **Почему Первый Бит** | 4 блока: Быстро, Просто, Качественно, Открыто — с пояснениями |
|
||||||
|
| **Кейсы внедрения** | 3 последних кейса + ссылка «Все кейсы» |
|
||||||
|
| **Другие решения** | Карточки: 1C:WMS, Клеверенс, 1C:TMS — «Возможно, вам будет интересно» |
|
||||||
|
| **Форма «Заказать демо»** | Поля: имя, компания, телефон, email, комментарий. Согласие на обработку данных |
|
||||||
|
| **Ссылка на анкету** | Детальная анкета для расчёта: отрасль, размер склада, количество SKU, задачи |
|
||||||
|
|
||||||
|
### 5.3. Архивные страницы (Кейсы, Статьи, Вебинары, Курсы, Мероприятия, Материалы)
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Заголовок раздела** | H1 с названием раздела |
|
||||||
|
| **Фильтры** | По рубрикам/тегам, по дате |
|
||||||
|
| **Сетка карточек** | 3 колонки. Карточка: изображение, бейдж типа, заголовок, описание, дата |
|
||||||
|
| **Пагинация** | Переход между страницами |
|
||||||
|
|
||||||
|
### 5.4. Детальная страница кейса
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Заголовок + мета** | Название проекта, клиент, отрасль |
|
||||||
|
| **Задача** | Описание задачи клиента |
|
||||||
|
| **Решение** | Что было внедрено |
|
||||||
|
| **Результат** | Измеримые результаты |
|
||||||
|
| **Галерея** | Скриншоты, фото склада |
|
||||||
|
| **Цитата клиента** | Отзыв (если есть) |
|
||||||
|
| **CTA** | «Хотите такой же результат? Закажите консультацию» |
|
||||||
|
| **Похожие кейсы** | 3 карточки других кейсов |
|
||||||
|
|
||||||
|
### 5.5. Детальная страница вебинара
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Анонс** (предстоящий) | Дата, спикер, программа, кнопка «Зарегистрироваться» |
|
||||||
|
| **Запись** (прошедший) | Видеозапись (embed), презентация для скачивания (gated) |
|
||||||
|
| **Похожие вебинары** | 3 карточки |
|
||||||
|
|
||||||
|
### 5.6. Детальная страница курса
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Описание курса** | Программа, длительность, формат, стоимость |
|
||||||
|
| **CTA** | Кнопка «Записаться на курс» |
|
||||||
|
| **Похожие курсы** | 3 карточки |
|
||||||
|
|
||||||
|
### 5.7. Детальная страница статьи / новости
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Заголовок + мета** | Название, дата, автор |
|
||||||
|
| **Основной текст** | Контент статьи |
|
||||||
|
| **Боковая колонка** | Связанные материалы + форма подписки |
|
||||||
|
| **Шеринг** | VK, Telegram, копировать ссылку |
|
||||||
|
| **Читайте также** | 3 карточки похожих статей |
|
||||||
|
|
||||||
|
### 5.8. Страница контактов
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Контактная информация** | Екатеринбург ПЦ: адрес, телефон, email |
|
||||||
|
| **Форма обратной связи** | Имя, email, сообщение, согласие |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Навигация
|
||||||
|
|
||||||
|
### Фиксированная боковая панель (левая)
|
||||||
|
|
||||||
|
Всегда видна на экране. В свёрнутом виде — иконки (70px), при наведении раскрывается с подписями (250px).
|
||||||
|
|
||||||
|
| Пункт | Иконка |
|
||||||
|
|-------|--------|
|
||||||
|
| БИТ.WMS | Склад |
|
||||||
|
| Кейсы | Папка |
|
||||||
|
| Статьи | Документ |
|
||||||
|
| Вебинары | Камера |
|
||||||
|
| Курсы | Шапочка |
|
||||||
|
| Мероприятия | Календарь |
|
||||||
|
| Материалы | Скачивание |
|
||||||
|
| Новости | Колокольчик |
|
||||||
|
| Контакты | Телефон |
|
||||||
|
|
||||||
|
Внизу панели: ссылки на Telegram и VK.
|
||||||
|
|
||||||
|
На мобильных устройствах панель скрывается и вызывается через гамбургер-меню.
|
||||||
|
|
||||||
|
### Верхний хедер
|
||||||
|
|
||||||
|
Тонкая полоса (60px) над контентом:
|
||||||
|
- Слева: логотип «первыйБит» + слоган «Экспертный портал по складской логистике»
|
||||||
|
- Справа: телефон + кнопка «Заказать демо» + поиск
|
||||||
|
|
||||||
|
### Футер
|
||||||
|
|
||||||
|
4 колонки:
|
||||||
|
- Логотип + контакты Екатеринбург ПЦ
|
||||||
|
- Ссылки на разделы сайта
|
||||||
|
- Ссылки на продукты
|
||||||
|
- Форма подписки на рассылку
|
||||||
|
- Юридические ссылки (политика конфиденциальности, согласие на обработку данных)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Лидогенерация
|
||||||
|
|
||||||
|
### Точки захвата лидов
|
||||||
|
|
||||||
|
| Инструмент | Описание | Расположение |
|
||||||
|
|-----------|----------|-------------|
|
||||||
|
| **Форма «Заказать демо»** | Имя, компания, телефон, email | Страница БИТ.WMS, модальное окно из хедера |
|
||||||
|
| **Форма «Консультация»** | Имя, телефон, email, вопрос | Контакты, детальные страницы кейсов |
|
||||||
|
| **Форма «Регистрация»** | Имя, email, телефон | Вебинары, курсы, мероприятия |
|
||||||
|
| **Gated-контент** | Имя, email → скачивание файла | Материалы (PDF, чек-листы, видео) |
|
||||||
|
| **Подписка на рассылку** | Email | Главная, боковая колонка статей, футер |
|
||||||
|
| **Онлайн-консультант** | JivoSite — чат | Все страницы (автоприглашение через 30 сек) |
|
||||||
|
| **Callback-виджет** | «Перезвоните мне» | Все страницы |
|
||||||
|
| **Попап exit-intent** | Подписка / скачивание чек-листа | Все страницы (при уходе) |
|
||||||
|
| **Попап по таймеру** | Предложение демо | Страница БИТ.WMS (через 60 сек) |
|
||||||
|
|
||||||
|
### Воронка
|
||||||
|
|
||||||
|
```
|
||||||
|
Посетитель
|
||||||
|
│
|
||||||
|
├── Читает статью / смотрит вебинар
|
||||||
|
│ │
|
||||||
|
│ ├── Подписывается на рассылку
|
||||||
|
│ ├── Скачивает материал (gated → email)
|
||||||
|
│ └── Переходит на страницу БИТ.WMS
|
||||||
|
│ │
|
||||||
|
│ ├── Заказывает демо (форма)
|
||||||
|
│ ├── Звонит (CallTouch)
|
||||||
|
│ ├── Пишет в чат (JivoSite)
|
||||||
|
│ └── Заказывает обратный звонок (callback)
|
||||||
|
│
|
||||||
|
└── ЛИД → Екатеринбург ПЦ → Распределение по ЦК WMS
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Продукты на портале
|
||||||
|
|
||||||
|
| Продукт | Роль | Представление |
|
||||||
|
|---------|------|--------------|
|
||||||
|
| **БИТ.WMS** | Основной | Полноценная продуктовая страница с демо-формой |
|
||||||
|
| 1C:WMS Логистика | Вторичный | Краткая карточка в блоке «Возможно, вам будет интересно» |
|
||||||
|
| Клеверенс | Вторичный | Краткая карточка |
|
||||||
|
| 1C:TMS | Вторичный | Краткая карточка |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Визуальный стиль
|
||||||
|
|
||||||
|
Строго по брендбуку «Первый Бит»:
|
||||||
|
|
||||||
|
| Элемент | Значение |
|
||||||
|
|---------|----------|
|
||||||
|
| Основной фон | Белый (#FFFFFF), много воздуха |
|
||||||
|
| Корпоративный цвет | Розовый/маджента (#E50071) — кнопки, акценты |
|
||||||
|
| Текст и заголовки | Чёрный (#000000) |
|
||||||
|
| Дополнительный фон | Светло-серый (#EBEBEB) |
|
||||||
|
| Шрифт заголовков | Suisse Int'l Bold |
|
||||||
|
| Шрифт текста | Suisse Int'l Book |
|
||||||
|
| Принципы | Минимализм. Без градиентов, теней, диагоналей, стоковых фото |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Технологии
|
||||||
|
|
||||||
|
| Компонент | Решение |
|
||||||
|
|-----------|---------|
|
||||||
|
| CMS | WordPress 6.x |
|
||||||
|
| Тема | GeneratePress Premium + дочерняя тема |
|
||||||
|
| Блоки | GenerateBlocks Pro |
|
||||||
|
| Кастомные поля | ACF Pro |
|
||||||
|
| Формы | Contact Form 7 |
|
||||||
|
| SEO | Yoast SEO |
|
||||||
|
| Рассылка | Unisender |
|
||||||
|
| Чат | JivoSite |
|
||||||
|
| Попапы | Popup Maker |
|
||||||
|
| Аналитика | Яндекс.Метрика, Google Analytics 4, CallTouch |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. Каналы продвижения
|
||||||
|
|
||||||
|
- Медийная реклама
|
||||||
|
- Реклама в социальных сетях
|
||||||
|
- Email-рассылки (Unisender)
|
||||||
|
- SEO-продвижение
|
||||||
|
- Контентный маркетинг (статьи, вебинары, материалы)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. Контакты и распределение лидов
|
||||||
|
|
||||||
|
- **Основной контакт:** Екатеринбург Проектный центр
|
||||||
|
- **Распределение:** Екатеринбург ПЦ распределяет лиды по территориально ближайшим Центрам компетенций WMS
|
||||||
|
- **Email:** wms@1bit.ru
|
||||||
|
- **Телефон:** +7 (343) 200-00-00
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
.wpcf7 .screen-reader-response {
|
||||||
|
position: absolute;
|
||||||
|
overflow: hidden;
|
||||||
|
clip: rect(1px, 1px, 1px, 1px);
|
||||||
|
clip-path: inset(50%);
|
||||||
|
height: 1px;
|
||||||
|
width: 1px;
|
||||||
|
margin: -1px;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
word-wrap: normal !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 .hidden-fields-container {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form .wpcf7-response-output {
|
||||||
|
margin: 2em 0.5em 1em;
|
||||||
|
padding: 0.2em 1em;
|
||||||
|
border: 2px solid #00a0d2; /* Blue */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.init .wpcf7-response-output,
|
||||||
|
.wpcf7 form.resetting .wpcf7-response-output,
|
||||||
|
.wpcf7 form.submitting .wpcf7-response-output {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.sent .wpcf7-response-output {
|
||||||
|
border-color: #46b450; /* Green */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.failed .wpcf7-response-output,
|
||||||
|
.wpcf7 form.aborted .wpcf7-response-output {
|
||||||
|
border-color: #dc3232; /* Red */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.spam .wpcf7-response-output {
|
||||||
|
border-color: #f56e28; /* Orange */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.invalid .wpcf7-response-output,
|
||||||
|
.wpcf7 form.unaccepted .wpcf7-response-output,
|
||||||
|
.wpcf7 form.payment-required .wpcf7-response-output {
|
||||||
|
border-color: #ffb900; /* Yellow */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-form-control-wrap {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-not-valid-tip {
|
||||||
|
color: #dc3232; /* Red */
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: normal;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.use-floating-validation-tip .wpcf7-not-valid-tip {
|
||||||
|
position: relative;
|
||||||
|
top: -2ex;
|
||||||
|
left: 1em;
|
||||||
|
z-index: 100;
|
||||||
|
border: 1px solid #dc3232;
|
||||||
|
background: #fff;
|
||||||
|
padding: .2em .8em;
|
||||||
|
width: 24em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-list-item {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 0 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-list-item-label::before,
|
||||||
|
.wpcf7-list-item-label::after {
|
||||||
|
content: " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-spinner {
|
||||||
|
visibility: hidden;
|
||||||
|
display: inline-block;
|
||||||
|
background-color: #23282d; /* Dark Gray 800 */
|
||||||
|
opacity: 0.75;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 100%;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0 24px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
form.submitting .wpcf7-spinner {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-spinner::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
background-color: #fbfbfc; /* Light Gray 100 */
|
||||||
|
top: 4px;
|
||||||
|
left: 4px;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 100%;
|
||||||
|
transform-origin: 8px 8px;
|
||||||
|
animation-name: spin;
|
||||||
|
animation-duration: 1000ms;
|
||||||
|
animation-timing-function: linear;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.wpcf7-spinner::before {
|
||||||
|
animation-name: blink;
|
||||||
|
animation-duration: 2000ms;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
from {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes blink {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 [inert] {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 input[type="file"] {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 input[type="file"]:disabled {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 .wpcf7-submit:disabled {
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 input[type="url"],
|
||||||
|
.wpcf7 input[type="email"],
|
||||||
|
.wpcf7 input[type="tel"] {
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-reflection > output {
|
||||||
|
display: list-item;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-reflection > output[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
.comment-content a{word-wrap:break-word}.bypostauthor{display:block}.comment,.comment-list{list-style-type:none;padding:0;margin:0}.comment-author-info{display:inline-block;vertical-align:middle}.comment-meta .avatar{float:left;margin-right:10px;border-radius:50%}.comment-author cite{font-style:normal;font-weight:700}.entry-meta.comment-metadata{margin-top:0}.comment-content{margin-top:1.5em}.comment-respond{margin-top:0}.comment-form>.form-submit{margin-bottom:0}.comment-form input,.comment-form-comment{margin-bottom:10px}.comment-form-comment textarea{resize:vertical}.comment-form #author,.comment-form #email,.comment-form #url{display:block}.comment-metadata .edit-link:before{display:none}.comment-body{padding:30px 0}.comment-content{padding:30px;border:1px solid rgba(0,0,0,.05)}.depth-1.parent>.children{border-bottom:1px solid rgba(0,0,0,.05)}.comment .children{padding-left:30px;margin-top:-30px;border-left:1px solid rgba(0,0,0,.05)}.pingback .comment-body,.trackback .comment-body{border-bottom:1px solid rgba(0,0,0,.05)}.pingback .edit-link{font-size:13px}.comment-content p:last-child{margin-bottom:0}.comment-list>.comment:first-child{padding-top:0;margin-top:0;border-top:0}ol.comment-list{margin-bottom:1.5em}.comment-form-cookies-consent{display:flex;align-items:center}.comment-form-cookies-consent input{margin-right:.5em;margin-bottom:0}.one-container .comments-area{margin-top:1.5em}.comment-content .reply{font-size:85%}#cancel-comment-reply-link{padding-left:10px}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
Theme Name: GeneratePress
|
||||||
|
Theme URI: https://generatepress.com
|
||||||
|
Author: Tom Usborne
|
||||||
|
Author URI: https://generatepress.com/about
|
||||||
|
Description: GeneratePress is a lightweight WordPress theme built with a focus on speed and usability. Performance is important to us, which is why a fresh GeneratePress install adds less than 10kb (gzipped) to your page size. We take full advantage of the block editor (Gutenberg), which gives you more control over creating your content. If you use page builders, GeneratePress is the right theme for you. It is completely compatible with all major page builders, including Beaver Builder and Elementor. Thanks to our emphasis on WordPress coding standards, we can boast full compatibility with all well-coded plugins, including WooCommerce. GeneratePress is fully responsive, uses valid HTML/CSS, and is translated into over 25 languages by our amazing community of users. A few of our many features include 60+ color controls, powerful dynamic typography, 5 navigation locations, 5 sidebar layouts, dropdown menus (click or hover), and 9 widget areas. Learn more and check out our powerful premium version at https://generatepress.com
|
||||||
|
Version: 3.6.1
|
||||||
|
Requires at least: 6.5
|
||||||
|
Tested up to: 6.9
|
||||||
|
Requires PHP: 7.4
|
||||||
|
License: GNU General Public License v2 or later
|
||||||
|
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
||||||
|
Text Domain: generatepress
|
||||||
|
Tags: two-columns, three-columns, one-column, right-sidebar, left-sidebar, footer-widgets, blog, e-commerce, flexible-header, full-width-template, buddypress, custom-header, custom-background, custom-menu, custom-colors, sticky-post, threaded-comments, translation-ready, rtl-language-support, featured-images, theme-options
|
||||||
|
|
||||||
|
GeneratePress, Copyright 2014-2025 EDGE22 Studios LTD.
|
||||||
|
GeneratePress is distributed under the terms of the GNU GPL
|
||||||
|
|
||||||
|
GeneratePress is based on Underscores http://underscores.me/, (C) 2012-2025 Automattic, Inc.
|
||||||
|
|
||||||
|
Actual CSS can be found in /assets/css/ folder.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/>
|
||||||
|
<path d="M13.73 21a2 2 0 0 1-3.46 0"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 290 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"/>
|
||||||
|
<line x1="16" y1="2" x2="16" y2="6"/>
|
||||||
|
<line x1="8" y1="2" x2="8" y2="6"/>
|
||||||
|
<line x1="3" y1="10" x2="21" y2="10"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 369 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<polygon points="23 7 16 12 23 17 23 7"/>
|
||||||
|
<rect x="1" y="5" width="15" height="14" rx="2" ry="2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 294 B |
@@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/>
|
||||||
|
<polyline points="14 2 14 8 20 8"/>
|
||||||
|
<line x1="16" y1="13" x2="8" y2="13"/>
|
||||||
|
<line x1="16" y1="17" x2="8" y2="17"/>
|
||||||
|
<polyline points="10 9 9 9 8 9"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 420 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
|
||||||
|
<polyline points="7 10 12 15 17 10"/>
|
||||||
|
<line x1="12" y1="15" x2="12" y2="3"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 328 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 281 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M22 10v6M2 10l10-5 10 5-10 5z"/>
|
||||||
|
<path d="M6 12v5c0 2 4 3 6 3s6-1 6-3v-5"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 280 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07A19.5 19.5 0 0 1 4.69 12 19.79 19.79 0 0 1 1.58 3.43 2 2 0 0 1 3.55 1.25h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L7.91 8.78a16 16 0 0 0 6 6l.91-.91a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 21.73 16z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 495 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<line x1="22" y1="2" x2="11" y2="13"/>
|
||||||
|
<polygon points="22 2 15 22 11 13 2 9 22 2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 280 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="none">
|
||||||
|
<path d="M21.579 6.855c.14-.465 0-.806-.662-.806h-2.193c-.558 0-.813.295-.953.62 0 0-1.115 2.719-2.695 4.482-.512.512-.743.675-1.022.675-.14 0-.341-.163-.341-.628V6.855c0-.558-.162-.806-.626-.806H9.642c-.348 0-.557.258-.557.504 0 .528.79.65.871 2.138v3.228c0 .707-.128.836-.407.836-.743 0-2.551-2.729-3.624-5.853-.209-.607-.42-.852-.98-.852H2.752c-.627 0-.752.295-.752.62 0 .582.743 3.462 3.461 7.271 1.812 2.601 4.363 4.012 6.687 4.012 1.393 0 1.565-.313 1.565-.852v-1.966c0-.626.133-.751.574-.751.325 0 .883.163 2.183 1.417 1.487 1.487 1.731 2.152 2.567 2.152h2.192c.626 0 .939-.313.759-.931-.198-.616-.907-1.51-1.849-2.569-.512-.604-1.277-1.254-1.51-1.579-.325-.418-.232-.604 0-.976.001 0 2.672-3.761 2.95-5.042z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 846 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M3 9l9-7 9 7v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1z"/>
|
||||||
|
<polyline points="9 22 9 12 15 12 15 22"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 297 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||||||
|
<rect width="32" height="32" fill="#E50071"/>
|
||||||
|
<text x="50%" y="50%" dominant-baseline="central" text-anchor="middle" font-family="Arial, sans-serif" font-weight="700" font-size="20" fill="#FFFFFF">Б</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 302 B |
@@ -0,0 +1,8 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 30" height="30" role="img" aria-label="первыйБит">
|
||||||
|
<title>первыйБит</title>
|
||||||
|
<!-- Pink accent square -->
|
||||||
|
<rect x="0" y="5" width="20" height="20" fill="#E50071"/>
|
||||||
|
<!-- Wordmark text -->
|
||||||
|
<text x="28" y="22" font-family="Arial, sans-serif" font-size="16" font-weight="700" fill="#000000" letter-spacing="-0.3">первый</text>
|
||||||
|
<text x="100" y="22" font-family="Arial, sans-serif" font-size="16" font-weight="700" fill="#E50071" letter-spacing="-0.3">Бит</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 558 B |
@@ -0,0 +1,123 @@
|
|||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — js/ajax-filter.js
|
||||||
|
*
|
||||||
|
* Handles filter button clicks and "Load more" for the content feed section.
|
||||||
|
* Communicates with the WordPress AJAX handler (bitwms_ajax_filter_handler).
|
||||||
|
*
|
||||||
|
* Global: bitwmsAjax { url: string, nonce: string }
|
||||||
|
*/
|
||||||
|
|
||||||
|
( function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
document.addEventListener( 'DOMContentLoaded', function () {
|
||||||
|
var filterBar = document.querySelector( '.filter-bar' );
|
||||||
|
var contentGrid = document.getElementById( 'content-grid' );
|
||||||
|
var loadMoreBtn = document.getElementById( 'load-more-btn' );
|
||||||
|
|
||||||
|
if ( ! filterBar || ! contentGrid ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentFilter = 'all';
|
||||||
|
var currentPage = 1;
|
||||||
|
var isLoading = false;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// Filter button click
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
filterBar.addEventListener( 'click', function ( e ) {
|
||||||
|
var btn = e.target.closest( '.filter-bar__btn' );
|
||||||
|
if ( ! btn ) return;
|
||||||
|
|
||||||
|
var filter = btn.getAttribute( 'data-filter' );
|
||||||
|
if ( filter === currentFilter ) return;
|
||||||
|
|
||||||
|
// Update active state.
|
||||||
|
filterBar.querySelectorAll( '.filter-bar__btn' ).forEach( function ( b ) {
|
||||||
|
b.classList.remove( 'filter-bar__btn--active' );
|
||||||
|
b.setAttribute( 'aria-selected', 'false' );
|
||||||
|
} );
|
||||||
|
btn.classList.add( 'filter-bar__btn--active' );
|
||||||
|
btn.setAttribute( 'aria-selected', 'true' );
|
||||||
|
|
||||||
|
currentFilter = filter;
|
||||||
|
currentPage = 1;
|
||||||
|
|
||||||
|
loadContent( false );
|
||||||
|
} );
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// Load more button click
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
loadMoreBtn.addEventListener( 'click', function () {
|
||||||
|
if ( isLoading ) return;
|
||||||
|
currentPage += 1;
|
||||||
|
loadContent( true );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// loadContent( append )
|
||||||
|
// append === false: replace grid content
|
||||||
|
// append === true: append to existing grid content
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
function loadContent( append ) {
|
||||||
|
if ( isLoading ) return;
|
||||||
|
isLoading = true;
|
||||||
|
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
loadMoreBtn.disabled = true;
|
||||||
|
loadMoreBtn.textContent = loadMoreBtn.getAttribute( 'data-loading' ) || 'Загрузка…';
|
||||||
|
}
|
||||||
|
|
||||||
|
var formData = new FormData();
|
||||||
|
formData.append( 'action', 'bitwms_filter' );
|
||||||
|
formData.append( 'nonce', bitwmsAjax.nonce );
|
||||||
|
formData.append( 'post_type', currentFilter );
|
||||||
|
formData.append( 'page', currentPage );
|
||||||
|
|
||||||
|
fetch( bitwmsAjax.url, {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData,
|
||||||
|
} )
|
||||||
|
.then( function ( response ) {
|
||||||
|
return response.json();
|
||||||
|
} )
|
||||||
|
.then( function ( data ) {
|
||||||
|
if ( ! data.success ) return;
|
||||||
|
|
||||||
|
var html = data.data.html;
|
||||||
|
var hasMore = data.data.has_more;
|
||||||
|
|
||||||
|
if ( append ) {
|
||||||
|
contentGrid.insertAdjacentHTML( 'beforeend', html );
|
||||||
|
} else {
|
||||||
|
contentGrid.innerHTML = html || '<p>Материалы не найдены.</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show/hide load-more button.
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
if ( hasMore ) {
|
||||||
|
loadMoreBtn.style.display = '';
|
||||||
|
loadMoreBtn.disabled = false;
|
||||||
|
loadMoreBtn.textContent = 'Загрузить ещё';
|
||||||
|
} else {
|
||||||
|
loadMoreBtn.style.display = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.catch( function ( err ) {
|
||||||
|
console.error( 'bitwms filter error:', err );
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
loadMoreBtn.disabled = false;
|
||||||
|
loadMoreBtn.textContent = 'Загрузить ещё';
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.finally( function () {
|
||||||
|
isLoading = false;
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} )();
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
var modal = document.getElementById('gated-modal');
|
||||||
|
if (!modal) return;
|
||||||
|
|
||||||
|
var overlay = modal.querySelector('.gated-modal__overlay');
|
||||||
|
var closeBtn = modal.querySelector('.gated-modal__close');
|
||||||
|
|
||||||
|
// Open modal on [data-gated] click
|
||||||
|
document.addEventListener('click', function (e) {
|
||||||
|
var trigger = e.target.closest('[data-gated]');
|
||||||
|
if (!trigger) return;
|
||||||
|
e.preventDefault();
|
||||||
|
var materialId = trigger.dataset.gated;
|
||||||
|
var downloadUrl = trigger.dataset.downloadUrl;
|
||||||
|
// Set hidden field + store download URL
|
||||||
|
var hiddenField = modal.querySelector('input[name="material-id"]');
|
||||||
|
if (hiddenField) hiddenField.value = materialId;
|
||||||
|
modal.dataset.downloadUrl = downloadUrl || '';
|
||||||
|
modal.classList.add('gated-modal--open');
|
||||||
|
document.body.style.overflow = 'hidden';
|
||||||
|
});
|
||||||
|
|
||||||
|
function closeModal() {
|
||||||
|
modal.classList.remove('gated-modal--open');
|
||||||
|
document.body.style.overflow = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (closeBtn) closeBtn.addEventListener('click', closeModal);
|
||||||
|
if (overlay) overlay.addEventListener('click', closeModal);
|
||||||
|
|
||||||
|
// After CF7 successful submit — trigger download
|
||||||
|
document.addEventListener('wpcf7mailsent', function () {
|
||||||
|
if (modal.classList.contains('gated-modal--open') && modal.dataset.downloadUrl) {
|
||||||
|
window.open(modal.dataset.downloadUrl, '_blank');
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — js/sidebar-nav.js
|
||||||
|
*
|
||||||
|
* Sidebar navigation toggle behaviour.
|
||||||
|
* Placeholder for Task 3 — full sidebar implementation will extend this file.
|
||||||
|
*
|
||||||
|
* Behaviour:
|
||||||
|
* - Clicking the hamburger button toggles `.sidebar-nav--open` on the sidebar.
|
||||||
|
* - Simultaneously toggles `.sidebar-overlay` on <body> to show the dim overlay.
|
||||||
|
* - Clicking the overlay closes the sidebar.
|
||||||
|
*/
|
||||||
|
|
||||||
|
document.addEventListener( 'DOMContentLoaded', function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Guard: abort if there is no sidebar on this page.
|
||||||
|
var sidebar = document.querySelector( '.sidebar-nav' );
|
||||||
|
if ( ! sidebar ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hamburger = document.querySelector( '.sidebar-nav__toggle' );
|
||||||
|
var body = document.body;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open the sidebar and show the overlay.
|
||||||
|
*/
|
||||||
|
function openSidebar() {
|
||||||
|
sidebar.classList.add( 'sidebar-nav--open' );
|
||||||
|
body.classList.add( 'sidebar-overlay' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the sidebar and hide the overlay.
|
||||||
|
*/
|
||||||
|
function closeSidebar() {
|
||||||
|
sidebar.classList.remove( 'sidebar-nav--open' );
|
||||||
|
body.classList.remove( 'sidebar-overlay' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toggle sidebar state.
|
||||||
|
*/
|
||||||
|
function toggleSidebar() {
|
||||||
|
if ( sidebar.classList.contains( 'sidebar-nav--open' ) ) {
|
||||||
|
closeSidebar();
|
||||||
|
} else {
|
||||||
|
openSidebar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attach toggle to hamburger button (if present).
|
||||||
|
if ( hamburger ) {
|
||||||
|
hamburger.addEventListener( 'click', function ( e ) {
|
||||||
|
e.preventDefault();
|
||||||
|
toggleSidebar();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close sidebar when the overlay (body::after pseudo-element area) is clicked.
|
||||||
|
// We detect clicks on <body> that land outside the sidebar itself.
|
||||||
|
body.addEventListener( 'click', function ( e ) {
|
||||||
|
if (
|
||||||
|
body.classList.contains( 'sidebar-overlay' ) &&
|
||||||
|
! sidebar.contains( e.target ) &&
|
||||||
|
( ! hamburger || ! hamburger.contains( e.target ) )
|
||||||
|
) {
|
||||||
|
closeSidebar();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} );
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Скрипт первичной настройки WordPress для БИТ.WMS портала
|
||||||
|
# Запускать после docker-compose up -d
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
WP="docker compose -f $PROJECT_DIR/docker-compose.yml run --rm wpcli"
|
||||||
|
|
||||||
|
echo "=== Ожидание готовности базы данных (до 30 сек)... ==="
|
||||||
|
for i in $(seq 1 30); do
|
||||||
|
if docker compose -f "$PROJECT_DIR/docker-compose.yml" exec -T db mysqladmin ping -h localhost -u bitwms -pbitwms --silent 2>/dev/null; then
|
||||||
|
echo "БД готова!"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo " Попытка $i/30..."
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Установка WordPress ==="
|
||||||
|
$WP core install \
|
||||||
|
--url="http://localhost:8080" \
|
||||||
|
--title="БИТ.WMS — Экспертный портал" \
|
||||||
|
--admin_user=admin \
|
||||||
|
--admin_password=admin \
|
||||||
|
--admin_email=admin@bitwms.local \
|
||||||
|
--skip-email
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Базовые настройки ==="
|
||||||
|
$WP option update timezone_string "Asia/Yekaterinburg"
|
||||||
|
$WP option update date_format "d.m.Y"
|
||||||
|
$WP option update time_format "H:i"
|
||||||
|
$WP option update default_comment_status "closed"
|
||||||
|
$WP option update default_ping_status "closed"
|
||||||
|
$WP rewrite structure "/%postname%/" --hard
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Удаление дефолтного контента ==="
|
||||||
|
$WP post delete 1 --force 2>/dev/null || true
|
||||||
|
$WP post delete 2 --force 2>/dev/null || true
|
||||||
|
$WP post delete 3 --force 2>/dev/null || true
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Удаление ненужных плагинов ==="
|
||||||
|
$WP plugin delete akismet 2>/dev/null || true
|
||||||
|
$WP plugin delete hello 2>/dev/null || true
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Установка бесплатных плагинов ==="
|
||||||
|
$WP plugin install generatepress --activate
|
||||||
|
$WP plugin install contact-form-7 --activate
|
||||||
|
$WP plugin install popup-maker --activate
|
||||||
|
$WP plugin install wordpress-seo --activate
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Активация дочерней темы ==="
|
||||||
|
$WP theme activate bitwms-child
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Создание страниц ==="
|
||||||
|
FRONT_ID=$($WP post create --post_type=page --post_title="Главная" --post_status=publish --post_name="home" --page_template="page-templates/front-page.php" --porcelain)
|
||||||
|
BLOG_ID=$($WP post create --post_type=page --post_title="Блог" --post_status=publish --post_name="blog" --porcelain)
|
||||||
|
$WP post create --post_type=page --post_title="БИТ.WMS" --post_status=publish --post_name="bit-wms" --page_template="page-templates/page-bit-wms.php"
|
||||||
|
$WP post create --post_type=page --post_title="Контакты" --post_status=publish --post_name="contacts" --page_template="page-templates/page-contacts.php"
|
||||||
|
$WP post create --post_type=page --post_title="Политика конфиденциальности" --post_status=publish --post_name="privacy-policy"
|
||||||
|
$WP post create --post_type=page --post_title="Согласие на обработку данных" --post_status=publish --post_name="consent"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Настройка статической главной страницы ==="
|
||||||
|
$WP option update show_on_front "page"
|
||||||
|
$WP option update page_on_front "$FRONT_ID"
|
||||||
|
$WP option update page_for_posts "$BLOG_ID"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Создание рубрик для статей/новостей ==="
|
||||||
|
$WP term create category "Статьи" --slug=articles 2>/dev/null || true
|
||||||
|
$WP term create category "Новости" --slug=news 2>/dev/null || true
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Создание тестового контента ==="
|
||||||
|
|
||||||
|
# Тестовые кейсы
|
||||||
|
$WP post create --post_type=case --post_title="Автоматизация склада для ООО «Логистика Плюс»" --post_status=publish --post_excerpt="Внедрение БИТ.WMS на складе площадью 5000 м² с 10 000 SKU"
|
||||||
|
$WP post create --post_type=case --post_title="Оптимизация складских процессов для «ТехноПарк»" --post_status=publish --post_excerpt="Сокращение времени отбора заказов на 35% за 3 месяца"
|
||||||
|
$WP post create --post_type=case --post_title="Миграция с Excel на WMS для «Фуд Маркет»" --post_status=publish --post_excerpt="Переход от ручного учёта к автоматизированному управлению"
|
||||||
|
|
||||||
|
# Тестовые вебинары
|
||||||
|
$WP post create --post_type=webinar --post_title="Как выбрать WMS-систему для вашего склада" --post_status=publish --post_excerpt="Разбираем ключевые критерии выбора"
|
||||||
|
$WP post create --post_type=webinar --post_title="Оптимизация складских процессов с БИТ.WMS" --post_status=publish --post_excerpt="Живая демонстрация возможностей системы"
|
||||||
|
|
||||||
|
# Тестовые статьи
|
||||||
|
$WP post create --post_type=post --post_title="5 признаков того, что вашему складу нужна WMS" --post_status=publish --post_excerpt="Чек-лист для руководителя склада" --post_category=$($WP term list category --slug=articles --field=term_id 2>/dev/null || echo 1)
|
||||||
|
$WP post create --post_type=post --post_title="ROI от внедрения WMS: как считать и что ожидать" --post_status=publish --post_excerpt="Методика расчёта окупаемости" --post_category=$($WP term list category --slug=articles --field=term_id 2>/dev/null || echo 1)
|
||||||
|
|
||||||
|
# Тестовый курс
|
||||||
|
$WP post create --post_type=course --post_title="Курс: Управление складом с БИТ.WMS" --post_status=publish --post_excerpt="Полный курс для складских менеджеров"
|
||||||
|
|
||||||
|
# Тестовое мероприятие
|
||||||
|
$WP post create --post_type=event --post_title="Конференция «Склад будущего 2026»" --post_status=publish --post_excerpt="Ежегодная конференция по складской логистике"
|
||||||
|
|
||||||
|
# Тестовый материал
|
||||||
|
$WP post create --post_type=material --post_title="Чек-лист: Подготовка склада к внедрению WMS" --post_status=publish --post_excerpt="Скачайте PDF с пошаговым планом"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Обновление permalink ==="
|
||||||
|
$WP rewrite flush
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " WordPress настроен!"
|
||||||
|
echo " Сайт: http://localhost:8080"
|
||||||
|
echo " Админка: http://localhost:8080/wp-admin"
|
||||||
|
echo " Логин: admin / admin"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo " ВАЖНО: Премиум-плагины установите вручную через админку:"
|
||||||
|
echo " - GeneratePress Premium"
|
||||||
|
echo " - GenerateBlocks Pro"
|
||||||
|
echo " - ACF Pro"
|
||||||
|
echo "=========================================="
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — archive-case.php
|
||||||
|
*
|
||||||
|
* Archive template for the 'case' custom post type.
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
?>
|
||||||
|
<main class="archive-page">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="archive-page__title"><?php esc_html_e( 'Кейсы', 'bitwms-child' ); ?></h1>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php if ( have_posts() ) : ?>
|
||||||
|
<?php while ( have_posts() ) : the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
<?php else : ?>
|
||||||
|
<p><?php esc_html_e( 'Кейсы не найдены.', 'bitwms-child' ); ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
<?php the_posts_pagination( array( 'prev_text' => '←', 'next_text' => '→' ) ); ?>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<?php get_footer();
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — archive-course.php
|
||||||
|
*
|
||||||
|
* Archive template for the 'course' custom post type.
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
?>
|
||||||
|
<main class="archive-page">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="archive-page__title"><?php esc_html_e( 'Курсы', 'bitwms-child' ); ?></h1>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php if ( have_posts() ) : ?>
|
||||||
|
<?php while ( have_posts() ) : the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
<?php else : ?>
|
||||||
|
<p><?php esc_html_e( 'Курсы не найдены.', 'bitwms-child' ); ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
<?php the_posts_pagination( array( 'prev_text' => '←', 'next_text' => '→' ) ); ?>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<?php get_footer();
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — archive-event.php
|
||||||
|
*
|
||||||
|
* Archive template for the 'event' custom post type.
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
?>
|
||||||
|
<main class="archive-page">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="archive-page__title"><?php esc_html_e( 'Мероприятия', 'bitwms-child' ); ?></h1>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php if ( have_posts() ) : ?>
|
||||||
|
<?php while ( have_posts() ) : the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
<?php else : ?>
|
||||||
|
<p><?php esc_html_e( 'Мероприятия не найдены.', 'bitwms-child' ); ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
<?php the_posts_pagination( array( 'prev_text' => '←', 'next_text' => '→' ) ); ?>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<?php get_footer();
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — archive-material.php
|
||||||
|
*
|
||||||
|
* Archive template for the 'material' custom post type.
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
?>
|
||||||
|
<main class="archive-page">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="archive-page__title"><?php esc_html_e( 'Материалы', 'bitwms-child' ); ?></h1>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php if ( have_posts() ) : ?>
|
||||||
|
<?php while ( have_posts() ) : the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
<?php else : ?>
|
||||||
|
<p><?php esc_html_e( 'Материалы не найдены.', 'bitwms-child' ); ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
<?php the_posts_pagination( array( 'prev_text' => '←', 'next_text' => '→' ) ); ?>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<?php get_footer();
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — archive-webinar.php
|
||||||
|
*
|
||||||
|
* Archive template for the 'webinar' custom post type.
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
?>
|
||||||
|
<main class="archive-page">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="archive-page__title"><?php esc_html_e( 'Вебинары', 'bitwms-child' ); ?></h1>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php if ( have_posts() ) : ?>
|
||||||
|
<?php while ( have_posts() ) : the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
<?php else : ?>
|
||||||
|
<p><?php esc_html_e( 'Вебинары не найдены.', 'bitwms-child' ); ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
<?php the_posts_pagination( array( 'prev_text' => '←', 'next_text' => '→' ) ); ?>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<?php get_footer();
|
||||||
@@ -45,6 +45,7 @@ $bitwms_includes = array(
|
|||||||
'inc/enqueue.php',
|
'inc/enqueue.php',
|
||||||
'inc/cpt.php',
|
'inc/cpt.php',
|
||||||
'inc/acf-fields.php',
|
'inc/acf-fields.php',
|
||||||
|
'inc/ajax-filter.php',
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ( $bitwms_includes as $bitwms_file ) {
|
foreach ( $bitwms_includes as $bitwms_file ) {
|
||||||
@@ -70,3 +71,217 @@ add_action( 'generate_before_header', function () {
|
|||||||
add_action( 'generate_before_header', function () {
|
add_action( 'generate_before_header', function () {
|
||||||
get_template_part( 'templates/top-header' );
|
get_template_part( 'templates/top-header' );
|
||||||
}, 20 );
|
}, 20 );
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// 5. Custom footer (before GeneratePress footer, priority 5)
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
add_action( 'generate_before_footer_content', function () {
|
||||||
|
$theme_uri = get_stylesheet_directory_uri();
|
||||||
|
$current_year = gmdate( 'Y' );
|
||||||
|
?>
|
||||||
|
<div class="custom-footer">
|
||||||
|
<div class="container">
|
||||||
|
<div class="custom-footer__grid">
|
||||||
|
|
||||||
|
<!-- Col 1: Logo + contacts -->
|
||||||
|
<div class="custom-footer__col custom-footer__col--brand">
|
||||||
|
<a href="/" class="custom-footer__logo-link" aria-label="<?php esc_attr_e( 'БИТ.WMS — на главную', 'bitwms-child' ); ?>">
|
||||||
|
<img
|
||||||
|
src="<?php echo esc_url( $theme_uri . '/img/logo.svg' ); ?>"
|
||||||
|
alt="<?php esc_attr_e( 'БИТ.WMS', 'bitwms-child' ); ?>"
|
||||||
|
width="140"
|
||||||
|
height="40"
|
||||||
|
class="custom-footer__logo"
|
||||||
|
loading="lazy"
|
||||||
|
>
|
||||||
|
</a>
|
||||||
|
<address class="custom-footer__address">
|
||||||
|
<p><?php esc_html_e( 'г. Екатеринбург, ул. Хохрякова, 10, оф. 405', 'bitwms-child' ); ?></p>
|
||||||
|
<p>
|
||||||
|
<a href="<?php echo esc_url( 'tel:+73432000000' ); ?>">
|
||||||
|
<?php esc_html_e( '+7 (343) 200-00-00', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="<?php echo esc_url( 'mailto:wms@1bit.ru' ); ?>">
|
||||||
|
<?php esc_html_e( 'wms@1bit.ru', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</address>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Col 2: Разделы -->
|
||||||
|
<div class="custom-footer__col custom-footer__col--sections">
|
||||||
|
<h4><?php esc_html_e( 'Разделы', 'bitwms-child' ); ?></h4>
|
||||||
|
<ul>
|
||||||
|
<li><a href="<?php echo esc_url( '/cases/' ); ?>"><?php esc_html_e( 'Кейсы', 'bitwms-child' ); ?></a></li>
|
||||||
|
<li><a href="<?php echo esc_url( '/articles/' ); ?>"><?php esc_html_e( 'Статьи', 'bitwms-child' ); ?></a></li>
|
||||||
|
<li><a href="<?php echo esc_url( '/webinars/' ); ?>"><?php esc_html_e( 'Вебинары', 'bitwms-child' ); ?></a></li>
|
||||||
|
<li><a href="<?php echo esc_url( '/courses/' ); ?>"><?php esc_html_e( 'Курсы', 'bitwms-child' ); ?></a></li>
|
||||||
|
<li><a href="<?php echo esc_url( '/events/' ); ?>"><?php esc_html_e( 'Мероприятия', 'bitwms-child' ); ?></a></li>
|
||||||
|
<li><a href="<?php echo esc_url( '/materials/' ); ?>"><?php esc_html_e( 'Материалы', 'bitwms-child' ); ?></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Col 3: Продукты -->
|
||||||
|
<div class="custom-footer__col custom-footer__col--products">
|
||||||
|
<h4><?php esc_html_e( 'Продукты', 'bitwms-child' ); ?></h4>
|
||||||
|
<ul>
|
||||||
|
<li><a href="<?php echo esc_url( '/bitwms/' ); ?>"><?php esc_html_e( 'БИТ.WMS', 'bitwms-child' ); ?></a></li>
|
||||||
|
<li><a href="<?php echo esc_url( '/1c-wms/' ); ?>"><?php esc_html_e( '1C:WMS', 'bitwms-child' ); ?></a></li>
|
||||||
|
<li><a href="<?php echo esc_url( '/cleverence/' ); ?>"><?php esc_html_e( 'Клеверенс', 'bitwms-child' ); ?></a></li>
|
||||||
|
<li><a href="<?php echo esc_url( '/1c-tms/' ); ?>"><?php esc_html_e( '1C:TMS', 'bitwms-child' ); ?></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Col 4: Подписка -->
|
||||||
|
<div class="custom-footer__col custom-footer__col--subscribe">
|
||||||
|
<h4><?php esc_html_e( 'Подписка', 'bitwms-child' ); ?></h4>
|
||||||
|
<p class="custom-footer__subscribe-desc">
|
||||||
|
<?php esc_html_e( 'Получайте новые материалы на email', 'bitwms-child' ); ?>
|
||||||
|
</p>
|
||||||
|
<form class="footer-subscribe" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" novalidate>
|
||||||
|
<?php wp_nonce_field( 'bitwms_footer_subscribe', 'bitwms_subscribe_nonce' ); ?>
|
||||||
|
<input type="hidden" name="action" value="bitwms_footer_subscribe">
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
name="subscribe_email"
|
||||||
|
class="footer-subscribe__input"
|
||||||
|
placeholder="<?php esc_attr_e( 'ваш@email.ru', 'bitwms-child' ); ?>"
|
||||||
|
required
|
||||||
|
autocomplete="email"
|
||||||
|
aria-label="<?php esc_attr_e( 'Email для подписки', 'bitwms-child' ); ?>"
|
||||||
|
>
|
||||||
|
<button type="submit" class="btn btn--primary btn--sm footer-subscribe__btn">
|
||||||
|
<?php esc_html_e( 'OK', 'bitwms-child' ); ?>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- .custom-footer__grid -->
|
||||||
|
|
||||||
|
<div class="custom-footer__bottom">
|
||||||
|
<p>© <?php echo esc_html( $current_year ); ?> <?php esc_html_e( 'Первый Бит. Все права защищены.', 'bitwms-child' ); ?></p>
|
||||||
|
<div class="custom-footer__legal">
|
||||||
|
<a href="<?php echo esc_url( '/privacy-policy/' ); ?>">
|
||||||
|
<?php esc_html_e( 'Политика конфиденциальности', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
<a href="<?php echo esc_url( '/consent/' ); ?>">
|
||||||
|
<?php esc_html_e( 'Согласие на обработку данных', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div><!-- .custom-footer__bottom -->
|
||||||
|
|
||||||
|
</div><!-- .container -->
|
||||||
|
</div><!-- .custom-footer -->
|
||||||
|
<?php
|
||||||
|
}, 5 );
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// 6. Gated content modal (rendered in footer, priority 50)
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
add_action( 'wp_footer', function () {
|
||||||
|
?>
|
||||||
|
<div id="gated-modal" class="gated-modal">
|
||||||
|
<div class="gated-modal__overlay"></div>
|
||||||
|
<div class="gated-modal__content">
|
||||||
|
<button class="gated-modal__close" aria-label="Закрыть">×</button>
|
||||||
|
<h3>Скачать материал</h3>
|
||||||
|
<p>Укажите ваши данные для получения доступа к материалу</p>
|
||||||
|
<!-- CF7 shortcode will be added here after form creation in admin -->
|
||||||
|
<!-- echo do_shortcode('[contact-form-7 id="XXX" title="Скачать материал"]'); -->
|
||||||
|
<form class="gated-form" action="#" method="post">
|
||||||
|
<input type="hidden" name="material-id" value="" />
|
||||||
|
<input type="text" name="name" placeholder="Имя *" required />
|
||||||
|
<input type="email" name="email" placeholder="Email *" required />
|
||||||
|
<label class="demo-form__consent">
|
||||||
|
<input type="checkbox" required />
|
||||||
|
Согласен на <a href="/privacy-policy/" target="_blank">обработку персональных данных</a>
|
||||||
|
</label>
|
||||||
|
<button type="submit" class="btn btn-primary">Скачать</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php
|
||||||
|
}, 50 );
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// 6. Popup Maker — настраивается в админке WP > Popup Maker > Add New
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Popup Maker — настраивается в админке WP > Popup Maker > Add New:
|
||||||
|
*
|
||||||
|
* 1. Попап "Exit-intent — Подписка":
|
||||||
|
* - Содержимое: подписка на рассылку
|
||||||
|
* - Триггер: Exit Intent
|
||||||
|
* - Условия: все страницы
|
||||||
|
* - Показывать 1 раз за сессию
|
||||||
|
*
|
||||||
|
* 2. Попап "Таймер — Демо":
|
||||||
|
* - Содержимое: предложение демо БИТ.WMS
|
||||||
|
* - Триггер: Time Delay 60 сек
|
||||||
|
* - Условия: только страница БИТ.WMS
|
||||||
|
* - Показывать 1 раз за сессию
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// 7. JivoSite widget (placeholder — подставить реальный widget_id)
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
add_action( 'wp_footer', function () {
|
||||||
|
?>
|
||||||
|
<!-- JivoSite — подставить реальный widget_id -->
|
||||||
|
<!-- <script src="//code.jivo.ru/widget/XXXXXXXX" async></script> -->
|
||||||
|
<?php
|
||||||
|
}, 99 );
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// 8. Callback widget (placeholder — подставить реальный код виджета)
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
add_action( 'wp_footer', function () {
|
||||||
|
?>
|
||||||
|
<!-- Callback Widget — подставить реальный код виджета -->
|
||||||
|
<!-- <script src="https://cdn.callbackhunter.com/XXXXX.js" async></script> -->
|
||||||
|
<?php
|
||||||
|
}, 99 );
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// 9. Analytics — Яндекс.Метрика + GA4 (placeholder — подставить реальные ID)
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
add_action( 'wp_head', function () {
|
||||||
|
?>
|
||||||
|
<!-- Yandex.Metrika — подставить реальный ID счётчика -->
|
||||||
|
<!--
|
||||||
|
<script type="text/javascript">
|
||||||
|
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
|
||||||
|
m[i].l=1*new Date();
|
||||||
|
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
|
||||||
|
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
|
||||||
|
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||||
|
ym(XXXXXXXX, "init", {
|
||||||
|
clickmap:true,
|
||||||
|
trackLinks:true,
|
||||||
|
accurateTrackBounce:true,
|
||||||
|
webvisor:true
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<noscript><div><img src="https://mc.yandex.ru/watch/XXXXXXXX" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Google Analytics 4 — подставить реальный ID GA4 -->
|
||||||
|
<!--
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag(){dataLayer.push(arguments);}
|
||||||
|
gtag('js', new Date());
|
||||||
|
gtag('config', 'G-XXXXXXXXXX');
|
||||||
|
</script>
|
||||||
|
-->
|
||||||
|
<?php
|
||||||
|
}, 1 );
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — inc/ajax-filter.php
|
||||||
|
*
|
||||||
|
* AJAX handler for the content feed filter bar and "Load more" button.
|
||||||
|
* Registered for both logged-in and non-logged-in users.
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_action( 'wp_ajax_bitwms_filter', 'bitwms_ajax_filter_handler' );
|
||||||
|
add_action( 'wp_ajax_nopriv_bitwms_filter', 'bitwms_ajax_filter_handler' );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the AJAX filter/load-more request.
|
||||||
|
*
|
||||||
|
* Expected POST parameters:
|
||||||
|
* - post_type (string) — 'all' or one of: post, case, webinar, course, event, material
|
||||||
|
* - page (int) — page number (1-based)
|
||||||
|
* - nonce (string) — security nonce
|
||||||
|
*
|
||||||
|
* Returns JSON: { success: true, data: { html: "...", has_more: bool } }
|
||||||
|
*/
|
||||||
|
function bitwms_ajax_filter_handler() {
|
||||||
|
// Verify nonce.
|
||||||
|
if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'bitwms_filter_nonce' ) ) {
|
||||||
|
wp_send_json_error( array( 'message' => 'Security check failed.' ), 403 );
|
||||||
|
}
|
||||||
|
|
||||||
|
$valid_types = array( 'post', 'case', 'webinar', 'course', 'event', 'material' );
|
||||||
|
$all_post_types = $valid_types;
|
||||||
|
|
||||||
|
$raw_type = isset( $_POST['post_type'] ) ? sanitize_key( $_POST['post_type'] ) : 'all';
|
||||||
|
$page = isset( $_POST['page'] ) ? max( 1, (int) $_POST['page'] ) : 1;
|
||||||
|
|
||||||
|
if ( 'all' === $raw_type ) {
|
||||||
|
$post_type = $all_post_types;
|
||||||
|
} elseif ( in_array( $raw_type, $valid_types, true ) ) {
|
||||||
|
$post_type = array( $raw_type );
|
||||||
|
} else {
|
||||||
|
$post_type = $all_post_types;
|
||||||
|
}
|
||||||
|
|
||||||
|
$posts_per_page = 6;
|
||||||
|
|
||||||
|
$query = new WP_Query( array(
|
||||||
|
'post_type' => $post_type,
|
||||||
|
'posts_per_page' => $posts_per_page,
|
||||||
|
'paged' => $page,
|
||||||
|
'orderby' => 'date',
|
||||||
|
'order' => 'DESC',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
) );
|
||||||
|
|
||||||
|
$html = '';
|
||||||
|
$has_more = false;
|
||||||
|
|
||||||
|
if ( $query->have_posts() ) {
|
||||||
|
ob_start();
|
||||||
|
while ( $query->have_posts() ) {
|
||||||
|
$query->the_post();
|
||||||
|
get_template_part( 'templates/content-card' );
|
||||||
|
}
|
||||||
|
$html = ob_get_clean();
|
||||||
|
wp_reset_postdata();
|
||||||
|
|
||||||
|
$has_more = ( $page * $posts_per_page ) < $query->found_posts;
|
||||||
|
}
|
||||||
|
|
||||||
|
wp_send_json_success( array(
|
||||||
|
'html' => $html,
|
||||||
|
'has_more' => $has_more,
|
||||||
|
) );
|
||||||
|
}
|
||||||
@@ -16,13 +16,36 @@ add_action( 'wp_enqueue_scripts', 'bitwms_enqueue_scripts', 20 );
|
|||||||
|
|
||||||
function bitwms_enqueue_scripts() {
|
function bitwms_enqueue_scripts() {
|
||||||
$theme_version = wp_get_theme()->get( 'Version' );
|
$theme_version = wp_get_theme()->get( 'Version' );
|
||||||
|
$theme_uri = get_stylesheet_directory_uri();
|
||||||
|
|
||||||
// Sidebar navigation — loaded in footer (5th arg: true).
|
// Sidebar navigation — loaded in footer (5th arg: true).
|
||||||
wp_enqueue_script(
|
wp_enqueue_script(
|
||||||
'bitwms-sidebar-nav',
|
'bitwms-sidebar-nav',
|
||||||
get_stylesheet_directory_uri() . '/js/sidebar-nav.js',
|
$theme_uri . '/js/sidebar-nav.js',
|
||||||
array(), // no dependencies
|
array(), // no dependencies
|
||||||
$theme_version,
|
$theme_version,
|
||||||
true // load in footer
|
true // load in footer
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Gated content modal — loaded on all pages.
|
||||||
|
wp_enqueue_script( 'bitwms-gated-content', $theme_uri . '/js/gated-content.js', [], $theme_version, true );
|
||||||
|
|
||||||
|
// Content feed AJAX filter — front page only.
|
||||||
|
if ( is_front_page() ) {
|
||||||
|
wp_enqueue_script(
|
||||||
|
'bitwms-ajax-filter',
|
||||||
|
$theme_uri . '/js/ajax-filter.js',
|
||||||
|
array(),
|
||||||
|
$theme_version,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
wp_localize_script(
|
||||||
|
'bitwms-ajax-filter',
|
||||||
|
'bitwmsAjax',
|
||||||
|
array(
|
||||||
|
'url' => admin_url( 'admin-ajax.php' ),
|
||||||
|
'nonce' => wp_create_nonce( 'bitwms_filter_nonce' ),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — js/ajax-filter.js
|
||||||
|
*
|
||||||
|
* Handles filter button clicks and "Load more" for the content feed section.
|
||||||
|
* Communicates with the WordPress AJAX handler (bitwms_ajax_filter_handler).
|
||||||
|
*
|
||||||
|
* Global: bitwmsAjax { url: string, nonce: string }
|
||||||
|
*/
|
||||||
|
|
||||||
|
( function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
document.addEventListener( 'DOMContentLoaded', function () {
|
||||||
|
var filterBar = document.querySelector( '.filter-bar' );
|
||||||
|
var contentGrid = document.getElementById( 'content-grid' );
|
||||||
|
var loadMoreBtn = document.getElementById( 'load-more-btn' );
|
||||||
|
|
||||||
|
if ( ! filterBar || ! contentGrid ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentFilter = 'all';
|
||||||
|
var currentPage = 1;
|
||||||
|
var isLoading = false;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// Filter button click
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
filterBar.addEventListener( 'click', function ( e ) {
|
||||||
|
var btn = e.target.closest( '.filter-bar__btn' );
|
||||||
|
if ( ! btn ) return;
|
||||||
|
|
||||||
|
var filter = btn.getAttribute( 'data-filter' );
|
||||||
|
if ( filter === currentFilter ) return;
|
||||||
|
|
||||||
|
// Update active state.
|
||||||
|
filterBar.querySelectorAll( '.filter-bar__btn' ).forEach( function ( b ) {
|
||||||
|
b.classList.remove( 'filter-bar__btn--active' );
|
||||||
|
b.setAttribute( 'aria-selected', 'false' );
|
||||||
|
} );
|
||||||
|
btn.classList.add( 'filter-bar__btn--active' );
|
||||||
|
btn.setAttribute( 'aria-selected', 'true' );
|
||||||
|
|
||||||
|
currentFilter = filter;
|
||||||
|
currentPage = 1;
|
||||||
|
|
||||||
|
loadContent( false );
|
||||||
|
} );
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// Load more button click
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
loadMoreBtn.addEventListener( 'click', function () {
|
||||||
|
if ( isLoading ) return;
|
||||||
|
currentPage += 1;
|
||||||
|
loadContent( true );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// loadContent( append )
|
||||||
|
// append === false: replace grid content
|
||||||
|
// append === true: append to existing grid content
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
function loadContent( append ) {
|
||||||
|
if ( isLoading ) return;
|
||||||
|
isLoading = true;
|
||||||
|
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
loadMoreBtn.disabled = true;
|
||||||
|
loadMoreBtn.textContent = loadMoreBtn.getAttribute( 'data-loading' ) || 'Загрузка…';
|
||||||
|
}
|
||||||
|
|
||||||
|
var formData = new FormData();
|
||||||
|
formData.append( 'action', 'bitwms_filter' );
|
||||||
|
formData.append( 'nonce', bitwmsAjax.nonce );
|
||||||
|
formData.append( 'post_type', currentFilter );
|
||||||
|
formData.append( 'page', currentPage );
|
||||||
|
|
||||||
|
fetch( bitwmsAjax.url, {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData,
|
||||||
|
} )
|
||||||
|
.then( function ( response ) {
|
||||||
|
return response.json();
|
||||||
|
} )
|
||||||
|
.then( function ( data ) {
|
||||||
|
if ( ! data.success ) return;
|
||||||
|
|
||||||
|
var html = data.data.html;
|
||||||
|
var hasMore = data.data.has_more;
|
||||||
|
|
||||||
|
if ( append ) {
|
||||||
|
contentGrid.insertAdjacentHTML( 'beforeend', html );
|
||||||
|
} else {
|
||||||
|
contentGrid.innerHTML = html || '<p>Материалы не найдены.</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show/hide load-more button.
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
if ( hasMore ) {
|
||||||
|
loadMoreBtn.style.display = '';
|
||||||
|
loadMoreBtn.disabled = false;
|
||||||
|
loadMoreBtn.textContent = 'Загрузить ещё';
|
||||||
|
} else {
|
||||||
|
loadMoreBtn.style.display = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.catch( function ( err ) {
|
||||||
|
console.error( 'bitwms filter error:', err );
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
loadMoreBtn.disabled = false;
|
||||||
|
loadMoreBtn.textContent = 'Загрузить ещё';
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.finally( function () {
|
||||||
|
isLoading = false;
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} )();
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
var modal = document.getElementById('gated-modal');
|
||||||
|
if (!modal) return;
|
||||||
|
|
||||||
|
var overlay = modal.querySelector('.gated-modal__overlay');
|
||||||
|
var closeBtn = modal.querySelector('.gated-modal__close');
|
||||||
|
|
||||||
|
// Open modal on [data-gated] click
|
||||||
|
document.addEventListener('click', function (e) {
|
||||||
|
var trigger = e.target.closest('[data-gated]');
|
||||||
|
if (!trigger) return;
|
||||||
|
e.preventDefault();
|
||||||
|
var materialId = trigger.dataset.gated;
|
||||||
|
var downloadUrl = trigger.dataset.downloadUrl;
|
||||||
|
// Set hidden field + store download URL
|
||||||
|
var hiddenField = modal.querySelector('input[name="material-id"]');
|
||||||
|
if (hiddenField) hiddenField.value = materialId;
|
||||||
|
modal.dataset.downloadUrl = downloadUrl || '';
|
||||||
|
modal.classList.add('gated-modal--open');
|
||||||
|
document.body.style.overflow = 'hidden';
|
||||||
|
});
|
||||||
|
|
||||||
|
function closeModal() {
|
||||||
|
modal.classList.remove('gated-modal--open');
|
||||||
|
document.body.style.overflow = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (closeBtn) closeBtn.addEventListener('click', closeModal);
|
||||||
|
if (overlay) overlay.addEventListener('click', closeModal);
|
||||||
|
|
||||||
|
// After CF7 successful submit — trigger download
|
||||||
|
document.addEventListener('wpcf7mailsent', function () {
|
||||||
|
if (modal.classList.contains('gated-modal--open') && modal.dataset.downloadUrl) {
|
||||||
|
window.open(modal.dataset.downloadUrl, '_blank');
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,347 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Template Name: БИТ.WMS
|
||||||
|
*
|
||||||
|
* Product page for БИТ.WMS — warehouse management system.
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
?>
|
||||||
|
|
||||||
|
<main class="bit-wms-page">
|
||||||
|
|
||||||
|
<!-- =====================================================================
|
||||||
|
1. Hero
|
||||||
|
===================================================================== -->
|
||||||
|
<section class="bitwms-hero">
|
||||||
|
<div class="container">
|
||||||
|
<h1>БИТ.WMS</h1>
|
||||||
|
<p class="bitwms-hero__subtitle">Комплексное решение для управления складом</p>
|
||||||
|
<p class="bitwms-hero__description">
|
||||||
|
БИТ.WMS — профессиональная система управления складом от Первого Бита.
|
||||||
|
Автоматизируйте все процессы склада: от приёмки до отгрузки,
|
||||||
|
сократите ошибки и повысьте эффективность команды.
|
||||||
|
</p>
|
||||||
|
<div class="bitwms-hero__actions">
|
||||||
|
<a href="#demo-form" class="btn btn-primary">Заказать демо</a>
|
||||||
|
<a href="#" class="btn btn-outline" data-popup="download-presentation">Скачать презентацию</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section><!-- .bitwms-hero -->
|
||||||
|
|
||||||
|
<!-- =====================================================================
|
||||||
|
2. Features
|
||||||
|
===================================================================== -->
|
||||||
|
<section class="bitwms-features">
|
||||||
|
<div class="container">
|
||||||
|
<h2>Функции БИТ.WMS</h2>
|
||||||
|
<div class="features-grid">
|
||||||
|
|
||||||
|
<div class="feature-card">
|
||||||
|
<h3>Приёмка</h3>
|
||||||
|
<p>
|
||||||
|
Автоматическая идентификация товаров по штрихкоду или RFID, проверка
|
||||||
|
по накладной, фиксация расхождений в режиме реального времени.
|
||||||
|
</p>
|
||||||
|
<p class="feature-card__result">Сокращение времени приёмки до 40%</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="feature-card">
|
||||||
|
<h3>Размещение</h3>
|
||||||
|
<p>
|
||||||
|
Интеллектуальный подбор ячейки с учётом типа товара, условий хранения
|
||||||
|
и топологии склада. ABC-зонирование и адресное хранение.
|
||||||
|
</p>
|
||||||
|
<p class="feature-card__result">Оптимальное использование площади склада</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="feature-card">
|
||||||
|
<h3>Хранение</h3>
|
||||||
|
<p>
|
||||||
|
Контроль сроков годности, учёт партий и серийных номеров.
|
||||||
|
Управление остатками онлайн без ручных пересчётов.
|
||||||
|
</p>
|
||||||
|
<p class="feature-card__result">Актуальные остатки 24/7 без задержек</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="feature-card">
|
||||||
|
<h3>Отбор</h3>
|
||||||
|
<p>
|
||||||
|
Маршрутизация обходов, поддержка волновой сборки и мультиордерного
|
||||||
|
отбора. Голосовое подтверждение и работа с ТСД.
|
||||||
|
</p>
|
||||||
|
<p class="feature-card__result">Производительность отбора выше на 30%</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="feature-card">
|
||||||
|
<h3>Отгрузка</h3>
|
||||||
|
<p>
|
||||||
|
Автоматическая комплектация заказов, контроль весогабаритных характеристик,
|
||||||
|
формирование отгрузочных документов и интеграция с перевозчиками.
|
||||||
|
</p>
|
||||||
|
<p class="feature-card__result">Ноль ошибок при отгрузке</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="feature-card">
|
||||||
|
<h3>Инвентаризация</h3>
|
||||||
|
<p>
|
||||||
|
Циклическая и сплошная инвентаризация без остановки работы склада.
|
||||||
|
Автоматическое формирование ведомостей и актов расхождений.
|
||||||
|
</p>
|
||||||
|
<p class="feature-card__result">Инвентаризация без остановки склада</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- .features-grid -->
|
||||||
|
</div>
|
||||||
|
</section><!-- .bitwms-features -->
|
||||||
|
|
||||||
|
<!-- =====================================================================
|
||||||
|
3. Why us
|
||||||
|
===================================================================== -->
|
||||||
|
<section class="bitwms-why">
|
||||||
|
<div class="container">
|
||||||
|
<h2>Почему Первый Бит</h2>
|
||||||
|
<div class="why-grid">
|
||||||
|
|
||||||
|
<div class="why-grid__item">
|
||||||
|
<h3>Быстро</h3>
|
||||||
|
<p>
|
||||||
|
Запускаем проекты за недели, а не месяцы. Проверенная
|
||||||
|
методология внедрения и готовые отраслевые конфигурации.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="why-grid__item">
|
||||||
|
<h3>Просто</h3>
|
||||||
|
<p>
|
||||||
|
Интуитивный интерфейс, обучение персонала за 1–2 дня,
|
||||||
|
подробная документация на русском языке.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="why-grid__item">
|
||||||
|
<h3>Качественно</h3>
|
||||||
|
<p>
|
||||||
|
200+ успешных внедрений, 15+ лет экспертизы, собственная команда
|
||||||
|
разработки и поддержки без передачи на аутсорс.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="why-grid__item">
|
||||||
|
<h3>Открыто</h3>
|
||||||
|
<p>
|
||||||
|
Прозрачное ценообразование, фиксированные сроки и бюджет,
|
||||||
|
доступ к исходному коду и регулярные обновления.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- .why-grid -->
|
||||||
|
</div>
|
||||||
|
</section><!-- .bitwms-why -->
|
||||||
|
|
||||||
|
<!-- =====================================================================
|
||||||
|
4. Cases
|
||||||
|
===================================================================== -->
|
||||||
|
<section class="bitwms-cases">
|
||||||
|
<div class="container">
|
||||||
|
<h2>Кейсы внедрения</h2>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$cases_query = new WP_Query( array(
|
||||||
|
'post_type' => 'case',
|
||||||
|
'posts_per_page' => 3,
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'orderby' => 'date',
|
||||||
|
'order' => 'DESC',
|
||||||
|
) );
|
||||||
|
|
||||||
|
if ( $cases_query->have_posts() ) :
|
||||||
|
?>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php while ( $cases_query->have_posts() ) : $cases_query->the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
</div>
|
||||||
|
<?php
|
||||||
|
wp_reset_postdata();
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="bitwms-cases__more">
|
||||||
|
<a href="<?php echo esc_url( home_url( '/cases/' ) ); ?>" class="btn btn-outline">
|
||||||
|
Все кейсы
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section><!-- .bitwms-cases -->
|
||||||
|
|
||||||
|
<!-- =====================================================================
|
||||||
|
5. Other solutions
|
||||||
|
===================================================================== -->
|
||||||
|
<section class="bitwms-other">
|
||||||
|
<div class="container">
|
||||||
|
<h2>Возможно, вам будет интересно</h2>
|
||||||
|
<div class="other-grid">
|
||||||
|
|
||||||
|
<div class="other-card">
|
||||||
|
<h3 class="other-card__title">1C:WMS Логистика</h3>
|
||||||
|
<p class="other-card__description">
|
||||||
|
Типовое решение на базе 1С:Предприятие для автоматизации
|
||||||
|
складских процессов в малом и среднем бизнесе.
|
||||||
|
</p>
|
||||||
|
<a href="<?php echo esc_url( home_url( '/1c-wms-logistika/' ) ); ?>" class="btn btn-outline btn-sm">
|
||||||
|
Подробнее
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="other-card">
|
||||||
|
<h3 class="other-card__title">Клеверенс</h3>
|
||||||
|
<p class="other-card__description">
|
||||||
|
Мобильная автоматизация складских операций: маркировка, инвентаризация
|
||||||
|
и управление через мобильные устройства и ТСД.
|
||||||
|
</p>
|
||||||
|
<a href="<?php echo esc_url( home_url( '/kleverens/' ) ); ?>" class="btn btn-outline btn-sm">
|
||||||
|
Подробнее
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="other-card">
|
||||||
|
<h3 class="other-card__title">1C:TMS</h3>
|
||||||
|
<p class="other-card__description">
|
||||||
|
Система управления транспортной логистикой: планирование маршрутов,
|
||||||
|
контроль доставки и взаиморасчёты с перевозчиками.
|
||||||
|
</p>
|
||||||
|
<a href="<?php echo esc_url( home_url( '/1c-tms/' ) ); ?>" class="btn btn-outline btn-sm">
|
||||||
|
Подробнее
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- .other-grid -->
|
||||||
|
</div>
|
||||||
|
</section><!-- .bitwms-other -->
|
||||||
|
|
||||||
|
<!-- =====================================================================
|
||||||
|
6. Demo form
|
||||||
|
===================================================================== -->
|
||||||
|
<section class="bitwms-demo" id="demo-form">
|
||||||
|
<div class="container">
|
||||||
|
<h2>Заказать демо БИТ.WMS</h2>
|
||||||
|
<p class="bitwms-demo__description">
|
||||||
|
Оставьте заявку, и наш эксперт свяжется с вами в течение рабочего дня,
|
||||||
|
чтобы провести персональную демонстрацию системы.
|
||||||
|
Вы также можете заполнить подробную
|
||||||
|
<a href="<?php echo esc_url( home_url( '/anketa/' ) ); ?>">анкету</a>
|
||||||
|
для подготовки индивидуального предложения.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<form class="demo-form" method="post" action="" novalidate>
|
||||||
|
<?php wp_nonce_field( 'bitwms_demo_form', 'bitwms_demo_nonce' ); ?>
|
||||||
|
|
||||||
|
<div class="demo-form__grid">
|
||||||
|
|
||||||
|
<div class="demo-form__field">
|
||||||
|
<label class="demo-form__label" for="demo-name">
|
||||||
|
Имя <span class="demo-form__required" aria-hidden="true">*</span>
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
class="demo-form__input"
|
||||||
|
type="text"
|
||||||
|
id="demo-name"
|
||||||
|
name="demo_name"
|
||||||
|
placeholder="Иван Иванов"
|
||||||
|
required
|
||||||
|
autocomplete="name"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="demo-form__field">
|
||||||
|
<label class="demo-form__label" for="demo-company">
|
||||||
|
Компания
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
class="demo-form__input"
|
||||||
|
type="text"
|
||||||
|
id="demo-company"
|
||||||
|
name="demo_company"
|
||||||
|
placeholder="ООО Ромашка"
|
||||||
|
autocomplete="organization"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="demo-form__field">
|
||||||
|
<label class="demo-form__label" for="demo-phone">
|
||||||
|
Телефон <span class="demo-form__required" aria-hidden="true">*</span>
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
class="demo-form__input"
|
||||||
|
type="tel"
|
||||||
|
id="demo-phone"
|
||||||
|
name="demo_phone"
|
||||||
|
placeholder="+7 (999) 000-00-00"
|
||||||
|
required
|
||||||
|
autocomplete="tel"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="demo-form__field">
|
||||||
|
<label class="demo-form__label" for="demo-email">
|
||||||
|
E-mail <span class="demo-form__required" aria-hidden="true">*</span>
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
class="demo-form__input"
|
||||||
|
type="email"
|
||||||
|
id="demo-email"
|
||||||
|
name="demo_email"
|
||||||
|
placeholder="ivan@example.com"
|
||||||
|
required
|
||||||
|
autocomplete="email"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- .demo-form__grid -->
|
||||||
|
|
||||||
|
<div class="demo-form__field demo-form__field--full">
|
||||||
|
<label class="demo-form__label" for="demo-comment">
|
||||||
|
Комментарий
|
||||||
|
</label>
|
||||||
|
<textarea
|
||||||
|
class="demo-form__input demo-form__textarea"
|
||||||
|
id="demo-comment"
|
||||||
|
name="demo_comment"
|
||||||
|
rows="4"
|
||||||
|
placeholder="Расскажите о задачах вашего склада..."
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="demo-form__consent">
|
||||||
|
<label class="demo-form__consent-label">
|
||||||
|
<input
|
||||||
|
class="demo-form__checkbox"
|
||||||
|
type="checkbox"
|
||||||
|
name="demo_consent"
|
||||||
|
value="1"
|
||||||
|
required
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
Я соглашаюсь с обработкой персональных данных в соответствии
|
||||||
|
с <a href="<?php echo esc_url( home_url( '/privacy-policy/' ) ); ?>">политикой конфиденциальности</a>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-primary demo-form__submit">
|
||||||
|
Отправить заявку
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</form><!-- .demo-form -->
|
||||||
|
</div>
|
||||||
|
</section><!-- .bitwms-demo -->
|
||||||
|
|
||||||
|
</main><!-- .bit-wms-page -->
|
||||||
|
|
||||||
|
<?php get_footer(); ?>
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Template Name: Контакты
|
||||||
|
*
|
||||||
|
* Contacts page: two-column layout with contact info and contact form.
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
get_header();
|
||||||
|
?>
|
||||||
|
<main class="page-contacts">
|
||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<?php
|
||||||
|
// Page title from WordPress
|
||||||
|
if ( have_posts() ) :
|
||||||
|
while ( have_posts() ) :
|
||||||
|
the_post();
|
||||||
|
?>
|
||||||
|
<h1 class="page-contacts__title"><?php the_title(); ?></h1>
|
||||||
|
<?php
|
||||||
|
endwhile;
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="contacts-grid">
|
||||||
|
|
||||||
|
<!-- Left column: contact info -->
|
||||||
|
<div class="contacts-grid__info">
|
||||||
|
<h2><?php esc_html_e( 'Екатеринбург Проектный центр', 'bitwms-child' ); ?></h2>
|
||||||
|
|
||||||
|
<ul class="contacts-list">
|
||||||
|
<li class="contacts-list__item contacts-list__item--phone">
|
||||||
|
<strong><?php esc_html_e( 'Телефон:', 'bitwms-child' ); ?></strong>
|
||||||
|
<a href="<?php echo esc_url( 'tel:+73432000000' ); ?>">
|
||||||
|
<?php esc_html_e( '+7 (343) 200-00-00', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="contacts-list__item contacts-list__item--email">
|
||||||
|
<strong><?php esc_html_e( 'Email:', 'bitwms-child' ); ?></strong>
|
||||||
|
<a href="<?php echo esc_url( 'mailto:wms@1bit.ru' ); ?>">
|
||||||
|
<?php esc_html_e( 'wms@1bit.ru', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="contacts-list__item contacts-list__item--address">
|
||||||
|
<strong><?php esc_html_e( 'Адрес:', 'bitwms-child' ); ?></strong>
|
||||||
|
<address>
|
||||||
|
<?php esc_html_e( 'г. Екатеринбург, ул. Хохрякова, 10, оф. 405', 'bitwms-child' ); ?>
|
||||||
|
</address>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div><!-- .contacts-grid__info -->
|
||||||
|
|
||||||
|
<!-- Right column: contact form -->
|
||||||
|
<div class="contacts-grid__form">
|
||||||
|
<h2><?php esc_html_e( 'Напишите нам', 'bitwms-child' ); ?></h2>
|
||||||
|
|
||||||
|
<form class="contact-form" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" novalidate>
|
||||||
|
<?php wp_nonce_field( 'bitwms_contact_form', 'bitwms_contact_nonce' ); ?>
|
||||||
|
<input type="hidden" name="action" value="bitwms_contact_form">
|
||||||
|
|
||||||
|
<div class="contact-form__field">
|
||||||
|
<label for="contact-name" class="contact-form__label">
|
||||||
|
<?php esc_html_e( 'Ваше имя', 'bitwms-child' ); ?>
|
||||||
|
<span class="contact-form__required" aria-hidden="true">*</span>
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="contact-name"
|
||||||
|
name="contact_name"
|
||||||
|
class="contact-form__input"
|
||||||
|
placeholder="<?php esc_attr_e( 'Иван Иванов', 'bitwms-child' ); ?>"
|
||||||
|
required
|
||||||
|
autocomplete="name"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="contact-form__field">
|
||||||
|
<label for="contact-email" class="contact-form__label">
|
||||||
|
<?php esc_html_e( 'Email', 'bitwms-child' ); ?>
|
||||||
|
<span class="contact-form__required" aria-hidden="true">*</span>
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
id="contact-email"
|
||||||
|
name="contact_email"
|
||||||
|
class="contact-form__input"
|
||||||
|
placeholder="<?php esc_attr_e( 'ivan@company.ru', 'bitwms-child' ); ?>"
|
||||||
|
required
|
||||||
|
autocomplete="email"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="contact-form__field">
|
||||||
|
<label for="contact-message" class="contact-form__label">
|
||||||
|
<?php esc_html_e( 'Сообщение', 'bitwms-child' ); ?>
|
||||||
|
</label>
|
||||||
|
<textarea
|
||||||
|
id="contact-message"
|
||||||
|
name="contact_message"
|
||||||
|
class="contact-form__textarea"
|
||||||
|
rows="5"
|
||||||
|
placeholder="<?php esc_attr_e( 'Опишите вашу задачу или вопрос...', 'bitwms-child' ); ?>"
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="contact-form__field contact-form__field--checkbox">
|
||||||
|
<label class="contact-form__checkbox-label">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
name="contact_consent"
|
||||||
|
class="contact-form__checkbox"
|
||||||
|
required
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
<?php
|
||||||
|
printf(
|
||||||
|
/* translators: %1$s: open link tag, %2$s: close link tag */
|
||||||
|
esc_html__( 'Я согласен(а) с %1$sполитикой конфиденциальности%2$s и даю согласие на обработку персональных данных', 'bitwms-child' ),
|
||||||
|
'<a href="' . esc_url( '/privacy-policy/' ) . '" target="_blank" rel="noopener noreferrer">',
|
||||||
|
'</a>'
|
||||||
|
);
|
||||||
|
?>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="contact-form__submit">
|
||||||
|
<button type="submit" class="btn btn--primary">
|
||||||
|
<?php esc_html_e( 'Отправить сообщение', 'bitwms-child' ); ?>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div><!-- .contacts-grid__form -->
|
||||||
|
|
||||||
|
</div><!-- .contacts-grid -->
|
||||||
|
|
||||||
|
</div><!-- .container -->
|
||||||
|
</main><!-- .page-contacts -->
|
||||||
|
<?php get_footer();
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — single-case.php
|
||||||
|
*
|
||||||
|
* Single (detail) template for the 'case' custom post type.
|
||||||
|
*
|
||||||
|
* ACF fields used:
|
||||||
|
* case_client — text
|
||||||
|
* case_industry — text
|
||||||
|
* case_task — wysiwyg
|
||||||
|
* case_solution — wysiwyg
|
||||||
|
* case_result — wysiwyg
|
||||||
|
* case_quote — text
|
||||||
|
* case_gallery — gallery (array of image arrays)
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
the_post();
|
||||||
|
|
||||||
|
$client = get_field( 'case_client' );
|
||||||
|
$industry = get_field( 'case_industry' );
|
||||||
|
$task = get_field( 'case_task' );
|
||||||
|
$solution = get_field( 'case_solution' );
|
||||||
|
$result = get_field( 'case_result' );
|
||||||
|
$quote = get_field( 'case_quote' );
|
||||||
|
$gallery = get_field( 'case_gallery' );
|
||||||
|
?>
|
||||||
|
<main class="single-case">
|
||||||
|
<div class="container">
|
||||||
|
<article>
|
||||||
|
<h1><?php the_title(); ?></h1>
|
||||||
|
|
||||||
|
<?php if ( $client || $industry ) : ?>
|
||||||
|
<div class="single-case__meta">
|
||||||
|
<?php if ( $client ) : ?>
|
||||||
|
<span class="single-case__meta-item single-case__client">
|
||||||
|
<strong><?php esc_html_e( 'Клиент:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( $client ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ( $industry ) : ?>
|
||||||
|
<span class="single-case__meta-item single-case__industry">
|
||||||
|
<strong><?php esc_html_e( 'Отрасль:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( $industry ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ( $task ) : ?>
|
||||||
|
<div class="single-case__section single-case__task">
|
||||||
|
<h2><?php esc_html_e( 'Задача', 'bitwms-child' ); ?></h2>
|
||||||
|
<?php echo wp_kses_post( $task ); ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ( $solution ) : ?>
|
||||||
|
<div class="single-case__section single-case__solution">
|
||||||
|
<h2><?php esc_html_e( 'Решение', 'bitwms-child' ); ?></h2>
|
||||||
|
<?php echo wp_kses_post( $solution ); ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ( $result ) : ?>
|
||||||
|
<div class="single-case__section single-case__result">
|
||||||
|
<h2><?php esc_html_e( 'Результат', 'bitwms-child' ); ?></h2>
|
||||||
|
<?php echo wp_kses_post( $result ); ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ( $gallery ) : ?>
|
||||||
|
<div class="single-case__gallery">
|
||||||
|
<div class="gallery-grid">
|
||||||
|
<?php foreach ( $gallery as $image ) : ?>
|
||||||
|
<a href="<?php echo esc_url( $image['url'] ); ?>" target="_blank" rel="noopener">
|
||||||
|
<img
|
||||||
|
src="<?php echo esc_url( $image['sizes']['medium_large'] ?? $image['url'] ); ?>"
|
||||||
|
alt="<?php echo esc_attr( $image['alt'] ); ?>"
|
||||||
|
width="<?php echo esc_attr( $image['sizes']['medium_large-width'] ?? $image['width'] ); ?>"
|
||||||
|
height="<?php echo esc_attr( $image['sizes']['medium_large-height'] ?? $image['height'] ); ?>"
|
||||||
|
>
|
||||||
|
</a>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ( $quote ) : ?>
|
||||||
|
<blockquote class="single-case__quote">
|
||||||
|
<?php echo esc_html( $quote ); ?>
|
||||||
|
</blockquote>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<div class="single-case__cta">
|
||||||
|
<p><?php esc_html_e( 'Хотите такой же результат?', 'bitwms-child' ); ?></p>
|
||||||
|
<a href="<?php echo esc_url( home_url( '/bit-wms/#demo-form' ) ); ?>" class="btn btn-primary">
|
||||||
|
<?php esc_html_e( 'Закажите консультацию', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$related = new WP_Query( array(
|
||||||
|
'post_type' => 'case',
|
||||||
|
'posts_per_page' => 3,
|
||||||
|
'orderby' => 'rand',
|
||||||
|
'post__not_in' => array( get_the_ID() ),
|
||||||
|
) );
|
||||||
|
if ( $related->have_posts() ) :
|
||||||
|
?>
|
||||||
|
<section class="related-posts">
|
||||||
|
<h2><?php esc_html_e( 'Другие кейсы', 'bitwms-child' ); ?></h2>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php while ( $related->have_posts() ) : $related->the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<?php
|
||||||
|
wp_reset_postdata();
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<?php get_footer();
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — single-course.php
|
||||||
|
*
|
||||||
|
* Single (detail) template for the 'course' custom post type.
|
||||||
|
*
|
||||||
|
* ACF fields used:
|
||||||
|
* course_program — wysiwyg
|
||||||
|
* course_duration — text (e.g. "16 часов")
|
||||||
|
* course_format — text (e.g. "Онлайн")
|
||||||
|
* course_price — text (e.g. "35 000 ₽")
|
||||||
|
* course_register_url — url (optional; falls back to demo form)
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
the_post();
|
||||||
|
|
||||||
|
$program = get_field( 'course_program' );
|
||||||
|
$duration = get_field( 'course_duration' );
|
||||||
|
$format = get_field( 'course_format' );
|
||||||
|
$price = get_field( 'course_price' );
|
||||||
|
$register_url = get_field( 'course_register_url' ) ?: home_url( '/bit-wms/#demo-form' );
|
||||||
|
?>
|
||||||
|
<main class="single-course">
|
||||||
|
<div class="container">
|
||||||
|
<article>
|
||||||
|
<h1><?php the_title(); ?></h1>
|
||||||
|
|
||||||
|
<div class="single-course__meta">
|
||||||
|
<?php if ( $duration ) : ?>
|
||||||
|
<span class="single-course__meta-item">
|
||||||
|
<strong><?php esc_html_e( 'Продолжительность:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( $duration ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ( $format ) : ?>
|
||||||
|
<span class="single-course__meta-item">
|
||||||
|
<strong><?php esc_html_e( 'Формат:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( $format ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ( $price ) : ?>
|
||||||
|
<span class="single-course__meta-item single-course__price">
|
||||||
|
<strong><?php esc_html_e( 'Стоимость:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( $price ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if ( $program ) : ?>
|
||||||
|
<div class="single-course__section">
|
||||||
|
<h2><?php esc_html_e( 'Программа курса', 'bitwms-child' ); ?></h2>
|
||||||
|
<?php echo wp_kses_post( $program ); ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<div class="single-course__cta">
|
||||||
|
<a href="<?php echo esc_url( $register_url ); ?>" class="btn btn-primary">
|
||||||
|
<?php esc_html_e( 'Записаться', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$related = new WP_Query( array(
|
||||||
|
'post_type' => 'course',
|
||||||
|
'posts_per_page' => 3,
|
||||||
|
'orderby' => 'rand',
|
||||||
|
'post__not_in' => array( get_the_ID() ),
|
||||||
|
) );
|
||||||
|
if ( $related->have_posts() ) :
|
||||||
|
?>
|
||||||
|
<section class="related-posts">
|
||||||
|
<h2><?php esc_html_e( 'Другие курсы', 'bitwms-child' ); ?></h2>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php while ( $related->have_posts() ) : $related->the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<?php
|
||||||
|
wp_reset_postdata();
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<?php get_footer();
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — single-event.php
|
||||||
|
*
|
||||||
|
* Single (detail) template for the 'event' custom post type.
|
||||||
|
*
|
||||||
|
* ACF fields used:
|
||||||
|
* event_date — date picker (YYYY-MM-DD)
|
||||||
|
* event_location — text
|
||||||
|
* event_format — text (e.g. "Очно", "Онлайн", "Гибридный")
|
||||||
|
* event_program — wysiwyg
|
||||||
|
* event_register_url — url (optional; falls back to demo form)
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
the_post();
|
||||||
|
|
||||||
|
$event_date = get_field( 'event_date' );
|
||||||
|
$location = get_field( 'event_location' );
|
||||||
|
$format = get_field( 'event_format' );
|
||||||
|
$program = get_field( 'event_program' );
|
||||||
|
$register_url = get_field( 'event_register_url' ) ?: home_url( '/bit-wms/#demo-form' );
|
||||||
|
?>
|
||||||
|
<main class="single-event">
|
||||||
|
<div class="container">
|
||||||
|
<article>
|
||||||
|
<h1><?php the_title(); ?></h1>
|
||||||
|
|
||||||
|
<div class="single-event__meta">
|
||||||
|
<?php if ( $event_date ) : ?>
|
||||||
|
<span class="single-event__meta-item single-event__date">
|
||||||
|
<strong><?php esc_html_e( 'Дата:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( date_i18n( 'd.m.Y', strtotime( $event_date ) ) ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ( $location ) : ?>
|
||||||
|
<span class="single-event__meta-item single-event__location">
|
||||||
|
<strong><?php esc_html_e( 'Место:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( $location ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ( $format ) : ?>
|
||||||
|
<span class="single-event__meta-item single-event__format">
|
||||||
|
<strong><?php esc_html_e( 'Формат:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( $format ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if ( $program ) : ?>
|
||||||
|
<div class="single-event__section">
|
||||||
|
<h2><?php esc_html_e( 'Программа', 'bitwms-child' ); ?></h2>
|
||||||
|
<?php echo wp_kses_post( $program ); ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<div class="single-event__cta">
|
||||||
|
<a href="<?php echo esc_url( $register_url ); ?>" class="btn btn-primary">
|
||||||
|
<?php esc_html_e( 'Зарегистрироваться', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$related = new WP_Query( array(
|
||||||
|
'post_type' => 'event',
|
||||||
|
'posts_per_page' => 3,
|
||||||
|
'orderby' => 'rand',
|
||||||
|
'post__not_in' => array( get_the_ID() ),
|
||||||
|
) );
|
||||||
|
if ( $related->have_posts() ) :
|
||||||
|
?>
|
||||||
|
<section class="related-posts">
|
||||||
|
<h2><?php esc_html_e( 'Другие мероприятия', 'bitwms-child' ); ?></h2>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php while ( $related->have_posts() ) : $related->the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<?php
|
||||||
|
wp_reset_postdata();
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<?php get_footer();
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — single-webinar.php
|
||||||
|
*
|
||||||
|
* Single (detail) template for the 'webinar' custom post type.
|
||||||
|
*
|
||||||
|
* Two display modes depending on webinar_date vs today:
|
||||||
|
* Upcoming — webinar_date, webinar_speaker, webinar_program (wysiwyg), registration link.
|
||||||
|
* Past — webinar_video_embed (wysiwyg/oEmbed), webinar_presentation (file url), webinar_program.
|
||||||
|
*
|
||||||
|
* ACF fields used:
|
||||||
|
* webinar_date — date picker (YYYY-MM-DD)
|
||||||
|
* webinar_speaker — text
|
||||||
|
* webinar_program — wysiwyg
|
||||||
|
* webinar_register_url — url
|
||||||
|
* webinar_video_embed — wysiwyg (oembed or raw iframe)
|
||||||
|
* webinar_presentation — file (array with 'url' and 'filename')
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
get_header();
|
||||||
|
the_post();
|
||||||
|
|
||||||
|
$webinar_date = get_field( 'webinar_date' ); // e.g. '2026-05-10'
|
||||||
|
$speaker = get_field( 'webinar_speaker' );
|
||||||
|
$program = get_field( 'webinar_program' );
|
||||||
|
$register_url = get_field( 'webinar_register_url' );
|
||||||
|
$video_embed = get_field( 'webinar_video_embed' );
|
||||||
|
$presentation = get_field( 'webinar_presentation' );
|
||||||
|
|
||||||
|
$is_upcoming = $webinar_date && strtotime( $webinar_date ) > time();
|
||||||
|
?>
|
||||||
|
<main class="single-webinar">
|
||||||
|
<div class="container">
|
||||||
|
<article>
|
||||||
|
<h1><?php the_title(); ?></h1>
|
||||||
|
|
||||||
|
<div class="single-webinar__meta">
|
||||||
|
<?php if ( $webinar_date ) : ?>
|
||||||
|
<span class="single-webinar__date">
|
||||||
|
<strong><?php esc_html_e( 'Дата:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( date_i18n( 'd.m.Y', strtotime( $webinar_date ) ) ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ( $speaker ) : ?>
|
||||||
|
<span class="single-webinar__speaker">
|
||||||
|
<strong><?php esc_html_e( 'Спикер:', 'bitwms-child' ); ?></strong>
|
||||||
|
<?php echo esc_html( $speaker ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if ( ! $is_upcoming && $video_embed ) : ?>
|
||||||
|
<div class="single-webinar__video">
|
||||||
|
<?php echo wp_kses_post( $video_embed ); ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ( $program ) : ?>
|
||||||
|
<div class="single-webinar__section">
|
||||||
|
<h2><?php esc_html_e( 'Программа', 'bitwms-child' ); ?></h2>
|
||||||
|
<?php echo wp_kses_post( $program ); ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ( $is_upcoming && $register_url ) : ?>
|
||||||
|
<div class="single-webinar__cta">
|
||||||
|
<a href="<?php echo esc_url( $register_url ); ?>" class="btn btn-primary" target="_blank" rel="noopener">
|
||||||
|
<?php esc_html_e( 'Зарегистрироваться', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ( ! $is_upcoming && $presentation ) : ?>
|
||||||
|
<div class="single-webinar__presentation">
|
||||||
|
<a href="<?php echo esc_url( $presentation['url'] ); ?>" class="btn btn-secondary" download>
|
||||||
|
<?php esc_html_e( 'Скачать презентацию', 'bitwms-child' ); ?>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$related = new WP_Query( array(
|
||||||
|
'post_type' => 'webinar',
|
||||||
|
'posts_per_page' => 3,
|
||||||
|
'orderby' => 'rand',
|
||||||
|
'post__not_in' => array( get_the_ID() ),
|
||||||
|
) );
|
||||||
|
if ( $related->have_posts() ) :
|
||||||
|
?>
|
||||||
|
<section class="related-posts">
|
||||||
|
<h2><?php esc_html_e( 'Другие вебинары', 'bitwms-child' ); ?></h2>
|
||||||
|
<div class="content-grid">
|
||||||
|
<?php while ( $related->have_posts() ) : $related->the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<?php
|
||||||
|
wp_reset_postdata();
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<?php get_footer();
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — templates/content-card.php
|
||||||
|
*
|
||||||
|
* Universal content card used in the content feed section and AJAX responses.
|
||||||
|
* Reads the current post from The Loop (global $post).
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map post_type to label. For 'post' also check for "news" category.
|
||||||
|
$type_labels = array(
|
||||||
|
'case' => __( 'Кейс', 'bitwms-child' ),
|
||||||
|
'webinar' => __( 'Вебинар', 'bitwms-child' ),
|
||||||
|
'course' => __( 'Курс', 'bitwms-child' ),
|
||||||
|
'event' => __( 'Мероприятие', 'bitwms-child' ),
|
||||||
|
'material' => __( 'Материал', 'bitwms-child' ),
|
||||||
|
);
|
||||||
|
|
||||||
|
$post_type = get_post_type();
|
||||||
|
$badge_text = '';
|
||||||
|
|
||||||
|
if ( 'post' === $post_type ) {
|
||||||
|
if ( has_category( 'news' ) ) {
|
||||||
|
$badge_text = __( 'Новость', 'bitwms-child' );
|
||||||
|
} else {
|
||||||
|
$badge_text = __( 'Статья', 'bitwms-child' );
|
||||||
|
}
|
||||||
|
} elseif ( isset( $type_labels[ $post_type ] ) ) {
|
||||||
|
$badge_text = $type_labels[ $post_type ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trim excerpt to 15 words.
|
||||||
|
$excerpt = get_the_excerpt();
|
||||||
|
if ( $excerpt ) {
|
||||||
|
$words = explode( ' ', $excerpt );
|
||||||
|
$excerpt = implode( ' ', array_slice( $words, 0, 15 ) );
|
||||||
|
if ( count( $words ) > 15 ) {
|
||||||
|
$excerpt .= '…';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
<article class="content-card" data-post-type="<?php echo esc_attr( $post_type ); ?>">
|
||||||
|
<a href="<?php the_permalink(); ?>" class="content-card__link">
|
||||||
|
|
||||||
|
<div class="content-card__image">
|
||||||
|
<?php if ( has_post_thumbnail() ) : ?>
|
||||||
|
<?php the_post_thumbnail( 'medium_large', array( 'alt' => esc_attr( get_the_title() ) ) ); ?>
|
||||||
|
<?php else : ?>
|
||||||
|
<div class="content-card__placeholder" aria-hidden="true"></div>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="content-card__body">
|
||||||
|
<?php if ( $badge_text ) : ?>
|
||||||
|
<span class="badge"><?php echo esc_html( $badge_text ); ?></span>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<h3 class="content-card__title"><?php the_title(); ?></h3>
|
||||||
|
|
||||||
|
<?php if ( $excerpt ) : ?>
|
||||||
|
<p class="content-card__excerpt"><?php echo esc_html( $excerpt ); ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<div class="content-card__meta">
|
||||||
|
<time datetime="<?php echo esc_attr( get_the_date( 'Y-m-d' ) ); ?>">
|
||||||
|
<?php echo esc_html( get_the_date( 'd.m.Y' ) ); ?>
|
||||||
|
</time>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</article>
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Template part: Clients section
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
$clients = [
|
||||||
|
[
|
||||||
|
'name' => 'Клиент А',
|
||||||
|
'logo' => '',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Клиент Б',
|
||||||
|
'logo' => '',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Клиент В',
|
||||||
|
'logo' => '',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Клиент Г',
|
||||||
|
'logo' => '',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Клиент Д',
|
||||||
|
'logo' => '',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Клиент Е',
|
||||||
|
'logo' => '',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
?>
|
||||||
|
|
||||||
|
<section class="clients-section">
|
||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<h2>Нам доверяют</h2>
|
||||||
|
|
||||||
|
<div class="clients-section__grid">
|
||||||
|
<?php foreach ( $clients as $client ) : ?>
|
||||||
|
<div class="clients-section__item">
|
||||||
|
<?php if ( ! empty( $client['logo'] ) ) : ?>
|
||||||
|
<img
|
||||||
|
src="<?php echo esc_url( $client['logo'] ); ?>"
|
||||||
|
alt="<?php echo esc_attr( $client['name'] ); ?>"
|
||||||
|
loading="lazy"
|
||||||
|
>
|
||||||
|
<?php else : ?>
|
||||||
|
<span class="clients-section__placeholder">
|
||||||
|
<?php echo esc_html( $client['name'] ); ?>
|
||||||
|
</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div><!-- .clients-section__grid -->
|
||||||
|
|
||||||
|
</div><!-- .container -->
|
||||||
|
</section><!-- .clients-section -->
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — templates/section-filter.php
|
||||||
|
*
|
||||||
|
* Content feed section with tag-based filter bar and "Load more" button.
|
||||||
|
* Initial query fetches 6 posts across all 6 custom post types, ordered by date DESC.
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$filter_buttons = array(
|
||||||
|
'all' => __( 'Все', 'bitwms-child' ),
|
||||||
|
'post' => __( 'Статьи', 'bitwms-child' ),
|
||||||
|
'case' => __( 'Кейсы', 'bitwms-child' ),
|
||||||
|
'webinar' => __( 'Вебинары', 'bitwms-child' ),
|
||||||
|
'course' => __( 'Курсы', 'bitwms-child' ),
|
||||||
|
'event' => __( 'Мероприятия', 'bitwms-child' ),
|
||||||
|
'material'=> __( 'Материалы', 'bitwms-child' ),
|
||||||
|
);
|
||||||
|
|
||||||
|
$post_types = array( 'post', 'case', 'webinar', 'course', 'event', 'material' );
|
||||||
|
$posts_per_page = 6;
|
||||||
|
|
||||||
|
$initial_query = new WP_Query( array(
|
||||||
|
'post_type' => $post_types,
|
||||||
|
'posts_per_page' => $posts_per_page,
|
||||||
|
'orderby' => 'date',
|
||||||
|
'order' => 'DESC',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
) );
|
||||||
|
?>
|
||||||
|
|
||||||
|
<section class="content-feed">
|
||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<div class="filter-bar" role="tablist">
|
||||||
|
<?php foreach ( $filter_buttons as $value => $label ) : ?>
|
||||||
|
<button
|
||||||
|
class="filter-bar__btn<?php echo $value === 'all' ? ' filter-bar__btn--active' : ''; ?>"
|
||||||
|
data-filter="<?php echo esc_attr( $value ); ?>"
|
||||||
|
role="tab"
|
||||||
|
aria-selected="<?php echo $value === 'all' ? 'true' : 'false'; ?>"
|
||||||
|
>
|
||||||
|
<?php echo esc_html( $label ); ?>
|
||||||
|
</button>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="content-grid" id="content-grid">
|
||||||
|
<?php if ( $initial_query->have_posts() ) : ?>
|
||||||
|
<?php while ( $initial_query->have_posts() ) : $initial_query->the_post(); ?>
|
||||||
|
<?php get_template_part( 'templates/content-card' ); ?>
|
||||||
|
<?php endwhile; ?>
|
||||||
|
<?php wp_reset_postdata(); ?>
|
||||||
|
<?php else : ?>
|
||||||
|
<p><?php esc_html_e( 'Материалы не найдены.', 'bitwms-child' ); ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if ( $initial_query->found_posts > $posts_per_page ) : ?>
|
||||||
|
<div class="content-feed__more">
|
||||||
|
<button
|
||||||
|
class="btn btn--outline load-more-btn"
|
||||||
|
id="load-more-btn"
|
||||||
|
data-page="1"
|
||||||
|
data-filter="all"
|
||||||
|
>
|
||||||
|
<?php esc_html_e( 'Загрузить ещё', 'bitwms-child' ); ?>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Template part: Promo WMS section
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
|
||||||
|
<section class="promo-wms">
|
||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<h2>БИТ.WMS — комплексное решение для вашего склада</h2>
|
||||||
|
|
||||||
|
<div class="promo-wms__grid">
|
||||||
|
|
||||||
|
<div class="promo-wms__item">
|
||||||
|
<span class="promo-wms__icon">⚡</span>
|
||||||
|
<h3>Быстрое внедрение</h3>
|
||||||
|
<p>Знаем бизнес-задачи склада, запускаем проект за недели, а не месяцы</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="promo-wms__item">
|
||||||
|
<span class="promo-wms__icon">⚙</span>
|
||||||
|
<h3>Собственная разработка</h3>
|
||||||
|
<p>БИТ.WMS — продукт Первого Бита, гибко адаптируется под ваши процессы</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="promo-wms__item">
|
||||||
|
<span class="promo-wms__icon">✓</span>
|
||||||
|
<h3>Проверено временем</h3>
|
||||||
|
<p>200+ проектов внедрения, 15+ лет экспертизы в складской логистике</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="promo-wms__item">
|
||||||
|
<span class="promo-wms__icon">☆</span>
|
||||||
|
<h3>Прозрачные условия</h3>
|
||||||
|
<p>Открытая ценовая политика, понятные сроки и этапы</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- .promo-wms__grid -->
|
||||||
|
|
||||||
|
<div class="promo-wms__actions">
|
||||||
|
<a href="<?php echo esc_url( home_url( '/bit-wms/' ) ); ?>" class="btn btn-primary">
|
||||||
|
Подробнее о продукте
|
||||||
|
</a>
|
||||||
|
<a href="<?php echo esc_url( home_url( '/bit-wms/#demo-form' ) ); ?>" class="btn btn-outline">
|
||||||
|
Заказать демо
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- .container -->
|
||||||
|
</section><!-- .promo-wms -->
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Template part: Subscribe section
|
||||||
|
*
|
||||||
|
* @package bitwms-child
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
|
||||||
|
<section class="subscribe-section">
|
||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<h2>Получайте экспертные материалы по складской логистике на почту</h2>
|
||||||
|
|
||||||
|
<form class="subscribe-section__form" action="#" method="post" novalidate>
|
||||||
|
<input
|
||||||
|
class="subscribe-section__input"
|
||||||
|
type="email"
|
||||||
|
name="subscribe_email"
|
||||||
|
placeholder="Ваш e-mail"
|
||||||
|
required
|
||||||
|
aria-label="Адрес электронной почты"
|
||||||
|
>
|
||||||
|
<button type="submit" class="btn btn-primary">Подписаться</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<p class="subscribe-section__note">
|
||||||
|
Нажимая кнопку, вы соглашаетесь с <a href="<?php echo esc_url( home_url( '/privacy-policy/' ) ); ?>">политикой конфиденциальности</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div><!-- .container -->
|
||||||
|
</section><!-- .subscribe-section -->
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
https://place.lemma.ru/ - как шаблон структуры
|
||||||
|
https://blueyonder.com/ - как шаблон контент
|
||||||