feat: add contacts page template and custom footer

This commit is contained in:
2026-04-03 01:16:50 +05:00
parent 7ff8d06780
commit fe22b37b0e
3 changed files with 742 additions and 0 deletions
@@ -71,3 +71,109 @@ 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>&copy; <?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 );
@@ -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();
+494
View File
@@ -826,6 +826,500 @@ body.sidebar-overlay::after {
} }
} }
/* ==========================================================================
Archive pages — CPT archive-*.php
========================================================================== */
.archive-page {
padding: 60px 0;
}
.archive-page__title {
margin: 0 0 32px;
}
/* ==========================================================================
Single CPT pages — single-case, single-webinar, single-course, single-event
========================================================================== */
.single-case,
.single-webinar,
.single-course,
.single-event {
padding: 60px 0;
}
/* --- Case meta bar --- */
.single-case__meta {
display: flex;
gap: 24px;
margin-bottom: 40px;
padding-bottom: 24px;
border-bottom: 1px solid var(--color-gray-light);
}
/* --- Case / webinar / course / event content sections --- */
.single-case__section,
.single-webinar__section,
.single-course__section,
.single-event__section {
margin-bottom: 40px;
}
.single-case__section h2,
.single-webinar__section h2,
.single-course__section h2,
.single-event__section h2 {
font-size: 1.5rem;
margin: 0 0 16px;
}
/* --- Webinar / course / event meta bars --- */
.single-webinar__meta,
.single-course__meta,
.single-event__meta {
display: flex;
flex-wrap: wrap;
gap: 24px;
margin-bottom: 40px;
padding-bottom: 24px;
border-bottom: 1px solid var(--color-gray-light);
}
/* --- Gallery grid (case) --- */
.gallery-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
margin-bottom: 40px;
}
.gallery-grid img {
width: 100%;
height: auto;
display: block;
}
/* --- Blockquote (case) --- */
.single-case__quote {
border-left: 4px solid var(--color-primary);
padding: 24px 32px;
margin: 40px 0;
background: var(--color-gray-light);
font-style: italic;
font-size: 1.125rem;
}
/* --- CTA blocks --- */
.single-case__cta,
.single-webinar__cta,
.single-course__cta,
.single-event__cta {
padding: 40px 0;
border-top: 1px solid var(--color-gray-light);
}
/* --- Related posts section --- */
.related-posts {
padding: 60px 0 0;
border-top: 1px solid var(--color-gray-light);
}
/* --- Webinar video embed --- */
.single-webinar__video {
margin-bottom: 40px;
}
.single-webinar__video iframe {
width: 100%;
aspect-ratio: 16 / 9;
border: 0;
}
/* --- Presentation download --- */
.single-webinar__presentation {
margin-top: 24px;
}
/* ==========================================================================
Pagination — the_posts_pagination()
========================================================================== */
.nav-links {
display: flex;
gap: 8px;
justify-content: center;
margin-top: 32px;
}
.page-numbers {
padding: 8px 16px;
border: 1px solid var(--color-gray-light);
text-decoration: none;
color: var(--color-black);
transition: background 0.2s, color 0.2s;
}
.page-numbers:hover {
background: var(--color-gray-light);
}
.page-numbers.current {
background: var(--color-black);
color: var(--color-white);
border-color: var(--color-black);
}
/* ==========================================================================
Responsive — CPT templates
========================================================================== */
@media (max-width: 1024px) {
.gallery-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 767px) {
.single-case__meta,
.single-webinar__meta,
.single-course__meta,
.single-event__meta {
flex-direction: column;
gap: 12px;
}
.gallery-grid {
grid-template-columns: 1fr;
}
.single-case__quote {
padding: 16px 20px;
font-size: 1rem;
}
}
/* ==========================================================================
Contacts page
========================================================================== */
.page-contacts {
padding: 60px 0;
}
.page-contacts__title {
margin-bottom: 0;
}
.contacts-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 48px;
margin-top: 32px;
}
.contacts-list {
list-style: none;
margin: 24px 0 0;
padding: 0;
}
.contacts-list__item {
margin-bottom: 16px;
font-size: 1rem;
line-height: 1.5;
}
.contacts-list__item address {
display: inline;
font-style: normal;
}
.contacts-list__item a {
color: var(--color-primary);
text-decoration: none;
}
.contacts-list__item a:hover {
text-decoration: underline;
}
/* Contact form */
.contact-form__field {
margin-bottom: 20px;
}
.contact-form__label {
display: block;
font-size: 0.875rem;
font-weight: var(--font-weight-bold);
margin-bottom: 6px;
}
.contact-form__required {
color: var(--color-primary);
margin-left: 2px;
}
.contact-form__input,
.contact-form__textarea {
display: block;
width: 100%;
padding: 10px 14px;
font-family: var(--font-family-base);
font-size: 1rem;
line-height: 1.5;
color: var(--color-black);
background: var(--color-white);
border: 2px solid var(--color-gray-light);
border-radius: 4px;
transition: border-color var(--transition-base);
box-sizing: border-box;
}
.contact-form__input:focus,
.contact-form__textarea:focus {
outline: none;
border-color: var(--color-primary);
}
.contact-form__textarea {
resize: vertical;
min-height: 120px;
}
.contact-form__field--checkbox {
display: flex;
align-items: flex-start;
gap: 10px;
}
.contact-form__checkbox-label {
display: flex;
align-items: flex-start;
gap: 10px;
font-size: 0.875rem;
line-height: 1.5;
cursor: pointer;
}
.contact-form__checkbox {
flex-shrink: 0;
margin-top: 3px;
width: 16px;
height: 16px;
accent-color: var(--color-primary);
cursor: pointer;
}
.contact-form__checkbox-label a {
color: var(--color-primary);
text-decoration: underline;
}
.contact-form__submit {
margin-top: 8px;
}
@media (max-width: 767px) {
.contacts-grid {
grid-template-columns: 1fr;
gap: 40px;
}
}
/* ==========================================================================
Custom footer
========================================================================== */
.custom-footer {
border-top: 1px solid var(--color-gray-light);
padding: 48px 0 24px;
background: var(--color-white);
}
.custom-footer__grid {
display: grid;
grid-template-columns: 2fr 1fr 1fr 1.5fr;
gap: 32px;
margin-bottom: 32px;
}
/* Col 1 — brand */
.custom-footer__logo-link {
display: inline-block;
margin-bottom: 20px;
}
.custom-footer__logo {
display: block;
max-width: 140px;
height: auto;
}
.custom-footer__address {
font-style: normal;
font-size: 0.875rem;
line-height: 1.6;
color: var(--color-gray-text);
}
.custom-footer__address p {
margin: 0 0 6px;
}
.custom-footer__address a {
color: var(--color-gray-text);
text-decoration: none;
}
.custom-footer__address a:hover {
color: var(--color-primary);
}
/* Col headings */
.custom-footer__col h4 {
font-size: 0.875rem;
font-weight: var(--font-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
margin: 0 0 16px;
color: var(--color-black);
}
/* Col nav lists */
.custom-footer__col ul {
list-style: none;
margin: 0;
padding: 0;
}
.custom-footer__col ul li {
font-size: 0.875rem;
margin-bottom: 10px;
}
.custom-footer__col a {
color: var(--color-gray-text);
text-decoration: none;
transition: color var(--transition-base);
}
.custom-footer__col a:hover {
color: var(--color-primary);
}
/* Col 4 — subscribe */
.custom-footer__subscribe-desc {
font-size: 0.875rem;
color: var(--color-gray-text);
margin: 0 0 12px;
line-height: 1.5;
}
.footer-subscribe {
display: flex;
gap: 8px;
align-items: stretch;
}
.footer-subscribe__input {
flex: 1;
min-width: 0;
padding: 8px 12px;
font-family: var(--font-family-base);
font-size: 0.875rem;
color: var(--color-black);
background: var(--color-white);
border: 2px solid var(--color-gray-light);
border-radius: 4px;
transition: border-color var(--transition-base);
box-sizing: border-box;
}
.footer-subscribe__input:focus {
outline: none;
border-color: var(--color-primary);
}
.footer-subscribe__btn,
.btn--sm {
padding: 8px 16px;
font-size: 0.875rem;
white-space: nowrap;
flex-shrink: 0;
}
/* Bottom bar */
.custom-footer__bottom {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 24px;
border-top: 1px solid var(--color-gray-light);
font-size: 0.75rem;
color: var(--color-gray-text);
}
.custom-footer__bottom p {
margin: 0;
}
.custom-footer__legal {
display: flex;
gap: 24px;
}
.custom-footer__legal a {
color: var(--color-gray-text);
text-decoration: none;
transition: color var(--transition-base);
}
.custom-footer__legal a:hover {
color: var(--color-primary);
}
/* Footer responsive */
@media (max-width: 1024px) {
.custom-footer__grid {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 767px) {
.custom-footer__grid {
grid-template-columns: 1fr;
gap: 32px;
}
.custom-footer__bottom {
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.custom-footer__legal {
flex-direction: column;
gap: 8px;
}
.footer-subscribe {
flex-direction: column;
}
.footer-subscribe__btn {
width: 100%;
}
}
/* ========================================================================== /* ==========================================================================
Task 10: БИТ.WMS product page Task 10: БИТ.WMS product page
========================================================================== */ ========================================================================== */