<?php /** * Legal Services Theme Functions */ // Theme setup function legal_services_setup() { add_theme_support('title-tag'); add_theme_support('post-thumbnails'); add_theme_support('custom-logo', [ 'height' => 80, 'width' => 200, 'flex-width' => true, ]); add_theme_support('html5', ['search-form', 'comment-form', 'comment-list', 'gallery', 'caption', 'style', 'script']); add_theme_support('automatic-feed-links'); register_nav_menus(['primary' => 'Главное меню']); } add_action('after_setup_theme', 'legal_services_setup'); // SEO: better document title function legal_services_seo_title($title) { if (is_front_page()) { return 'Юридические услуги в Нахабино — юрист Роман Лукин | Защита прав и консультации'; } if (is_page()) { $page_title = get_the_title(); return $page_title . ' | Юридические услуги в Нахабино'; } return $title; } add_filter('pre_get_document_title', 'legal_services_seo_title'); // Enqueue styles & scripts function legal_services_assets() { $theme_uri = get_template_directory_uri(); // Google Fonts (preconnect for performance) wp_enqueue_style('legal-fonts', 'https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700&family=Inter:wght@300;400;500;600;700&display=swap', [], null); // Main CSS wp_enqueue_style('legal-main', $theme_uri . '/assets/css/main.css', ['legal-fonts'], '1.3.0'); // Navigation JS (deferred via true) wp_enqueue_script('legal-nav', $theme_uri . '/assets/js/nav.js', [], '1.1.0', true); } add_action('wp_enqueue_scripts', 'legal_services_assets'); // Add preconnect hints for faster font loading function legal_services_resource_hints($urls, $relation_type) { if ('preconnect' === $relation_type) { $urls[] = ['href' => 'https://fonts.gstatic.com', 'crossorigin']; $urls[] = ['href' => 'https://fonts.googleapis.com']; } return $urls; } add_filter('wp_resource_hints', 'legal_services_resource_hints', 10, 2); // Custom page templates function legal_services_page_templates($templates) { $templates['page-home.php'] = 'Главная — Юридические услуги'; $templates['page-prices.php'] = 'Прайс — Юридические услуги'; $templates['page-docs.php'] = 'Образцы документов'; return $templates; } add_filter('theme_page_templates', 'legal_services_page_templates'); // Load template function legal_services_template($template) { if (is_page()) { $page_template = get_page_template_slug(); if ($page_template && locate_template($page_template)) { return locate_template($page_template); } } return $template; } add_filter('template_include', 'legal_services_template'); // Custom image sizes add_image_size('legal-hero', 1920, 800, true); add_image_size('legal-service', 600, 400, true); add_image_size('legal-testimonial', 150, 150, true); // === SEO: og:image fallback === function legal_services_og_image_fallback() { if (is_singular() && !has_post_thumbnail()) { echo '<meta property="og:image" content="' . esc_url(get_template_directory_uri()) . '/assets/images/hero-law-justice.jpg">' . "\n"; } } add_action('wp_head', 'legal_services_og_image_fallback', 5); // === Performance: remove emoji scripts (optional, keeps site fast) === function legal_services_disable_emoji() { remove_action('wp_head', 'print_emoji_detection_script', 7); remove_action('wp_print_styles', 'print_emoji_styles'); } add_action('init', 'legal_services_disable_emoji'); // === Register testimonial CPT (dynamic reviews with rating) === function legal_services_register_testimonials() { register_post_type('testimonial', [ 'labels' => [ 'name' => 'Отзывы', 'singular_name' => 'Отзыв', 'add_new' => 'Добавить отзыв', 'add_new_item' => 'Добавить новый отзыв', 'edit_item' => 'Редактировать отзыв', ], 'public' => true, 'menu_icon' => 'dashicons-star-filled', 'supports' => ['title', 'editor', 'thumbnail'], 'has_archive' => false, 'show_in_rest' => true, ]); } add_action('init', 'legal_services_register_testimonials'); // Meta fields: client name, role/case, rating, date function legal_services_testimonial_metaboxes() { add_meta_box('legal_testimonial_fields', 'Данны отзыва', 'legal_services_testimonial_fields_html', 'testimonial', 'normal', 'high'); } add_action('add_meta_boxes', 'legal_services_testimonial_metaboxes'); function legal_services_testimonial_fields_html($post) { wp_nonce_field('legal_testimonial_meta', 'legal_testimonial_meta_nonce'); $author = get_post_meta($post->ID, '_testimonial_author', true); $role = get_post_meta($post->ID, '_testimonial_role', true); $rating = get_post_meta($post->ID, '_testimonial_rating', true) ?: 5; $date = get_post_meta($post->ID, '_testimonial_date', true); echo '<p><label>Имя клиента:</label><br><input type="text" name="testimonial_author" value="' . esc_attr($author) . '" style="width:100%"></p>'; echo '<p><label>Тип дела / роль:</label><br><input type="text" name="testimonial_role" value="' . esc_attr($role) . '" style="width:100%"></p>'; echo '<p><label>Рейтинг (1–5):</label><br><input type="number" name="testimonial_rating" min="1" max="5" value="' . esc_attr($rating) . '"></p>'; echo '<p><label>Дата (например, март 2026):</label><br><input type="text" name="testimonial_date" value="' . esc_attr($date) . '" style="width:100%"></p>'; } function legal_services_save_testimonial($post_id) { if (!isset($_POST['legal_testimonial_meta_nonce']) || !wp_verify_nonce($_POST['legal_testimonial_meta_nonce'], 'legal_testimonial_meta')) return; if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (!current_user_can('edit_post', $post_id)) return; $fields = [ '_testimonial_author' => 'testimonial_author', '_testimonial_role' => 'testimonial_role', '_testimonial_rating' => 'testimonial_rating', '_testimonial_date' => 'testimonial_date', ]; foreach ($fields as $meta => $field) { if (isset($_POST[$field])) { update_post_meta($post_id, $meta, sanitize_text_field(wp_unslash($_POST[$field]))); } } } add_action('save_post_testimonial', 'legal_services_save_testimonial'); // Output testimonials: from CPT if present, otherwise static defaults function legal_services_testimonials_html() { $query = new WP_Query(['post_type' => 'testimonial', 'posts_per_page' => 6, 'orderby' => 'date', 'order' => 'DESC']); $images = [ 'testimonial-client1.jpg', 'testimonial-client2.jpg', 'testimonial-client3.jpg', 'testimonial-client4.jpg', 'testimonial-lawyer1.jpg', 'testimonial-lawyer2.jpg', ]; $defaults = [ ['author' => 'Александр', 'role' => 'Жилищный спор', 'date' => 'март 2026', 'text' => '«Юрист с первой консультации чётко объяснил все нюансы, разработал стратегию и уверенно довёл дело до результата. Огромное спасибо!»'], ['author' => 'Елена', 'role' => 'Семейный спор', 'date' => 'февраль 2026', 'text' => '«Помогли с разделом имущества после развода. Всё прошло быстро и без лишней волокиты. Рекомендую эту компанию!»'], ['author' => 'Дмитрий', 'role' => 'Семейное право', 'date' => 'январь 2026', 'text' => '«Взыскали алименты, вопрос решился быстрее, чем я рассчитывал. Грамотные и внимательные специалисты.»'], ['author' => 'Мария', 'role' => 'Защита прав потребителей', 'date' => 'декабрь 2025', 'text' => '«Защитили мои права как потребителя, вернули деньги за некачественный товар. Профессиональная работа!»'], ['author' => 'Константин', 'role' => 'Трудовой спор', 'date' => 'ноябрь 2025', 'text' => '«Помогли восстановиться на работе после незаконного увольнения. Очень благодарен за поддержку и результат.»'], ['author' => 'Анна', 'role' => 'Наследственное право', 'date' => 'октябрь 2025', 'text' => '«Разобрались в сложной ситуации по насест??у, восстановили срок принятия наследства. Спасибо за профессионализм!»'], ]; if ($query->have_posts()) { $i = 0; while ($query->have_posts()) { $query->the_post(); $author = get_post_meta(get_the_ID(), '_testimonial_author', true) ?: get_the_title(); $role = get_post_meta(get_the_ID(), '_testimonial_role', true); $rating = (int) get_post_meta(get_the_ID(), '_testimonial_rating', true) ?: 5; $date = get_post_meta(get_the_ID(), '_testimonial_date', true); $img = $images[$i % 6]; $thumb = get_the_post_thumbnail_url(get_the_ID(), 'legal-testimonial'); if ($thumb) $img = $thumb; echo '<div class="testimonial-card">' . '<div class="testimonial-avatar" style="background-image:url(\'' . esc_url($img) . '\')"></div>' . '<div class="testimonial-stars">' . str_repeat('★', $rating) . '</div>' . '<p class="testimonial-text">' . wp_kses_post(get_the_content()) . '</p>' . '<span class="testimonial-author">' . esc_html($author) . '</span>' . '<span class="testimonial-role">' . esc_html($role) . ($date ? ' · ' . esc_html($date) : '') . '</span>' . '</div>'; $i++; } wp_reset_postdata(); } else { foreach ($defaults as $i => $t) { echo '<div class="testimonial-card">' . '<div class="testimonial-avatar" style="background-image:url(\'' . esc_url(get_template_directory_uri() . '/assets/images/' . $images[$i]) . '\')"></div>' . '<div class="testimonial-stars">★★★★★</div>' . '<p class="testimonial-text">' . esc_html($t['text']) . '</p>' . '<span class="testimonial-author">' . esc_html($t['author']) . '</span>' . '<span class="testimonial-role">' . esc_html($t['role'] . ' · ' . $t['date']) . '</span>' . '</div>'; } } } // === Contact form handler: sends inquiries to the firm email === function legal_services_handle_form() { // Honeypot anti-spam: if filled, silently drop. if (!empty($_POST['website_field'])) { return; } $name = sanitize_text_field(wp_unslash($_POST['legal_name'] ?? '')); $phone = sanitize_text_field(wp_unslash($_POST['legal_phone'] ?? '')); $email = sanitize_email(wp_unslash($_POST['legal_email'] ?? '')); $subject = sanitize_text_field(wp_unslash($_POST['legal_subject'] ?? '')); $message = sanitize_textarea_field(wp_unslash($_POST['legal_message'] ?? '')); $date = sanitize_text_field(wp_unslash($_POST['legal_date'] ?? '')); $time = sanitize_text_field(wp_unslash($_POST['legal_time'] ?? '')); $redirect = wp_get_referer() ?: home_url('/#contact'); if (empty($name) || empty($phone)) { wp_safe_redirect(add_query_arg('form_status', 'error', $redirect)); exit; } $to = ['roman_lukin@mail.ru', 'romanluk2@yandex.ru']; $headers = ['Content-Type: text/plain; charset=UTF-8', 'Reply-To: ' . ($email ?: 'roman_lukin@mail.ru')]; $body = "Новая заявка с сайта lawyer-moscowa.ru\n\n" . "Имя: {$name}\n" . "Телефон: {$phone}\n" . ($email ? "Email: {$email}\n" : '') . ($subject ? "Услуга: {$subject}\n" : '') . ($date ? "Желаемая дата: {$date}\n" : '') . ($time ? "Желаемое время: {$time}\n" : '') . ($message ? "Сообщение:\n{$message}\n" : ''); wp_mail($to, 'Заявка с сайта: ' . ($subject ?: 'Обратный звонок'), $body, $headers); wp_safe_redirect(add_query_arg('form_status', 'success', $redirect)); exit; } add_action('admin_post_legal_contact_form', 'legal_services_handle_form'); add_action('admin_post_nopriv_legal_contact_form', 'legal_services_handle_form'); // === Contact form success/error notice (displayed by page templates) === function legal_services_form_notice() { if (isset($_GET['form_status'])) { if ($_GET['form_status'] === 'success') { echo '<div class="form-notice form-notice-success">Спасибо! Ваша заявка отправлена. Мы свяжемся с вами в ближайшее время.</div>'; } else { echo '<div class="form-notice form-notice-error">Пожалуйста, заполните обязательне поля: имя и телефон в формате +7 (XXX) XXX-XX-XX.</div>'; } } } // === JSON-LD LocalBusiness / AggregateRating === function legal_services_local_business_jsonld() { if (is_front_page()) { echo '<script type="application/ld+json">' . json_encode([ '@context' => 'https://schema.org', '@type' => 'LegalService', 'name' => 'Юридические услуги', 'url' => home_url('/'), 'telephone' => '+79269483466', 'email' => 'roman_lukin@mail.ru', 'priceRange' => 'от 2 000 ₽', 'areaServed' => ['Московская область', 'Москва', 'Нахабино', 'Красногорск'], 'address' => [ '@type' => 'PostalAddress', 'postalCode' => '143430', 'addressLocality' => 'Нахабино', 'addressRegion' => 'Московская область', 'streetAddress' => 'ул. Советская, д. 22А, оф. 12', 'addressCountry' => 'RU', ], 'openingHours' => ['Mo-Fr 09:00-17:00'], ]) . '</script>' . "\n"; } } add_action('wp_head', 'legal_services_local_business_jsonld', 20); // Sticky phone bar for mobile function legal_services_sticky_styles() { echo '<style> .sticky-phone { display:none; } @media (max-width:768px) { .sticky-phone { display:flex; position:fixed; bottom:0; left:0; right:0; z-index:9999; background:#1a237e; color:#fff; padding:10px 15px; align-items:center; justify-content:space-between; box-shadow:0 -2px 10px rgba(0,0,0,0.3); } .sticky-phone span { font-size:14px; font-weight:500; } .sticky-phone a { color:#fff; font-size:18px; font-weight:700; text-decoration:none; } .sticky-phone .sp-call { background:#FFD54F; color:#1a237e; padding:8px 20px; border-radius:8px; font-weight:700; font-size:16px; text-decoration:none; } .site-footer { margin-bottom:60px; } .footer-stats { display:flex; flex-wrap:wrap; justify-content:center; gap:16px; padding:12px 15px; } } </style>'; } add_action('wp_head', 'legal_services_sticky_styles'); function legal_services_sticky_html() { echo '<div class="sticky-phone"> <span>Юрист рядом</span> <a href="tel:+79269483466" class="sp-call">Позвонить</a> </div>'; } add_action('wp_footer', 'legal_services_sticky_html'); // Yandex.Metrika counter function legal_services_yandex_metrika() { ?> <!-- Yandex.Metrika counter --> <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(49807078, "init", { clickmap:true, referrer: document.referrer, url: location.href, accurateTrackBounce:true, trackLinks:true }); </script> <noscript><div><img src="https://mc.yandex.ru/watch/49807078" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <?php } add_action('wp_head', 'legal_services_yandex_metrika', 99); // Google Analytics (gtag.js) function legal_services_google_analytics() { ?> <script async src="https://www.googletagmanager.com/gtag/js?id=G-CTNJXE2BM3"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-CTNJXE2BM3'); </script> <?php } add_action('wp_head', 'legal_services_google_analytics', 100); // Sitemap // Robots.txt function legal_services_robots_txt($output) { $output .= "Sitemap: " . home_url('/sitemap.xml') . "\n"; return $output; } add_filter('robots_txt', 'legal_services_robots_txt'); // Webmaster verification (add your codes here) function legal_services_webmaster_verify() { // Yandex.Webmaster: replace content with your code // echo '<meta name="yandex-verification" content="XXXXXXXXXXXXXXXXXXXXXXXX" />'; // Google Search Console: replace content with your code // echo '<meta name="google-site-verification" content="XXXXXXXXXXXXXXXXXXXXXXXX" />'; } add_action('wp_head', 'legal_services_webmaster_verify', 0); function legal_services_sitemap() { if (preg_match('#^/sitemap.xml$#', $_SERVER['REQUEST_URI'])) { header('Content-Type: application/xml; charset=UTF-8'); $base = 'http://lawyer-moscowa.ru'; echo '<?xml version="1.0" encoding="UTF-8"?>' . " "; echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . " "; echo '<url><loc>' . $base . '/</loc><lastmod>' . date('Y-m-d') . '</lastmod><changefreq>weekly</changefreq><priority>1.0</priority></url>' . " "; echo '<url><loc>' . $base . '/prajc/</loc><lastmod>' . date('Y-m-d') . '</lastmod><changefreq>monthly</changefreq><priority>0.8</priority></url>' . " "; echo '<url><loc>' . $base . '/obraztsy-dokumentov/</loc><lastmod>' . date('Y-m-d') . '</lastmod><changefreq>monthly</changefreq><priority>0.8</priority></url>' . " "; echo '<url><loc>' . $base . '/privacy-policy/</loc><lastmod>' . date('Y-m-d') . '</lastmod><changefreq>yearly</changefreq><priority>0.3</priority></url>' . " "; echo '</urlset>'; exit; } } add_action('init', 'legal_services_sitemap');