5933 | множество правок согласно подзадачам на RU стенде

pull/28/head
parent 79aea38c69
commit 1206bb8fd3
  1. 30
      wp-content/themes/cosmopet/functions.php
  2. 89
      wp-content/themes/cosmopet/global-functions/core-functions.php
  3. 147
      wp-content/themes/cosmopet/global-functions/multisite-functions.php
  4. 2
      wp-content/themes/cosmopet/modules/footer/assets/css/gp-style-desktop.css
  5. 61
      wp-content/themes/cosmopet/modules/footer/assets/js/footer.js
  6. 1
      wp-content/themes/cosmopet/modules/footer/module-controller.php
  7. 4
      wp-content/themes/cosmopet/modules/forms/module-ajax-controller.php
  8. 60
      wp-content/themes/cosmopet/modules/forms/module-controller.php
  9. 36
      wp-content/themes/cosmopet/modules/shop/components/checkout/assets/css/checkout.css
  10. 173
      wp-content/themes/cosmopet/modules/shop/components/checkout/assets/js/script.js
  11. 112
      wp-content/themes/cosmopet/templates/footer.twig
  12. 1
      wp-content/themes/cosmopet/templates/front-page/front-page.twig
  13. 38
      wp-content/themes/cosmopet/templates/header.twig
  14. 44
      wp-content/themes/cosmopet/templates/layout.twig
  15. 8
      wp-content/themes/cosmopet/woocommerce/archive-product/archive-product.twig
  16. 15
      wp-content/themes/cosmopet/woocommerce/assets/js/gp-main.js

@ -1200,6 +1200,7 @@ function remove_woocommerce_styles_on_checkout() {
// Добавляем hreflang теги для cosmopet.shop // Добавляем hreflang теги для cosmopet.shop
add_action('wp_head', 'custom_hreflang_shop', 6); add_action('wp_head', 'custom_hreflang_shop', 6);
function custom_hreflang_shop() { function custom_hreflang_shop() {
if (!is_admin() && function_exists('pll_get_post') && function_exists('pll_languages_list')) {
// Защищаем от дублирования // Защищаем от дублирования
static $hreflang_added = false; static $hreflang_added = false;
if ($hreflang_added) { if ($hreflang_added) {
@ -1207,12 +1208,34 @@ function custom_hreflang_shop() {
} }
$hreflang_added = true; $hreflang_added = true;
$current_path = add_query_arg('', $_SERVER['REQUEST_URI']); // Домены для языков
$ru_domain = 'https://cosmopet-test-ru.cp.good-production.xyz'; $ru_domain = 'https://cosmopet-test-ru.cp.good-production.xyz';
$en_domain = 'https://cosmopet-test-ae.cp.good-production.xyz'; $en_domain = 'https://cosmopet-test-ae.cp.good-production.xyz';
echo '<link rel="alternate" hreflang="ru-RU" href="' . esc_url($ru_domain . $current_path) . '" />' . "\n"; // Текущий пост/страница
echo '<link rel="alternate" hreflang="en-AE" href="' . esc_url($en_domain . $current_path) . '" />' . "\n"; $current_post_id = get_the_ID();
if (!$current_post_id) {
// Для случаев, когда get_the_ID() не работает (например, архивы)
$current_path = trailingslashit($_SERVER['REQUEST_URI']);
$query_string = $_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : '';
$ru_url = $ru_domain . $current_path . $query_string;
$en_url = $en_domain . $current_path . $query_string;
} else {
// Получаем переводы поста/страницы
$ru_post_id = pll_get_post($current_post_id, 'ru');
$en_post_id = pll_get_post($current_post_id, 'en');
// Формируем URL с учетом перевода и параметров запроса
$query_string = $_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : '';
$ru_url = $ru_post_id ? get_permalink($ru_post_id) . $query_string : $ru_domain . trailingslashit($_SERVER['REQUEST_URI']) . $query_string;
$en_url = $en_post_id ? get_permalink($en_post_id) . $query_string : $en_domain . trailingslashit($_SERVER['REQUEST_URI']) . $query_string;
}
// Выводим hreflang-теги
echo '<link rel="alternate" hreflang="ru-RU" href="' . esc_url($ru_url) . '" />' . "\n";
echo '<link rel="alternate" hreflang="en-AE" href="' . esc_url($en_url) . '" />' . "\n";
}
} }
add_action('wp_head', 'custom_checkout_padding'); add_action('wp_head', 'custom_checkout_padding');
@ -1318,3 +1341,4 @@ function custom_handle_activation_request() {
} }
} }

@ -172,3 +172,92 @@ $zero = '0';
<?php <?php
} }
// Подключение скриптов и стилей
// add_action('wp_enqueue_scripts', 'enqueue_checkout_scripts');
// function enqueue_checkout_scripts() {
// if (is_checkout()) {
// wp_enqueue_style('custom-checkout', get_template_directory_uri() . '/modules/shop/components/checkout/assets/css/checkout.css', [], '1.0.1');
// wp_enqueue_script('custom-checkout', get_template_directory_uri() . '/modules/shop/components/checkout/assets/js/script.js', ['jquery'], '1.0.1', true);
// wp_localize_script('custom-checkout', 'wc_checkout_params', [
// 'ajax_url' => admin_url('admin-ajax.php'),
// 'nonce' => wp_create_nonce('wc_checkout_nonce')
// ]);
// }
// }
// // AJAX-обработчик для обновления количества
// add_action('wp_ajax_update_cart_quantity', 'update_cart_quantity_callback');
// add_action('wp_ajax_nopriv_update_cart_quantity', 'update_cart_quantity_callback');
// function update_cart_quantity_callback() {
// check_ajax_referer('wc_checkout_nonce', 'nonce');
// $cart_item_key = sanitize_text_field($_POST['cart_item_key']);
// $quantity = intval($_POST['quantity']);
// if ($quantity > 0) {
// WC()->cart->set_quantity($cart_item_key, $quantity);
// } else {
// WC()->cart->remove_cart_item($cart_item_key);
// }
// WC()->cart->calculate_totals();
// // Подготовка фрагментов
// $fragments = [];
// // Обновление списка товаров
// ob_start();
// wc_get_template('checkout/form-checkout.php', [], '', get_template_directory() . '/woocommerce/');
// $fragments['.order-your__products'] = ob_get_clean();
// // Обновление секции итогов
// ob_start();
// woocommerce_checkout_coupon_form();
// woocommerce_order_review();
// $fragments['.order-your__calculation'] = ob_get_clean();
// // Подготовка цен для каждого товара
// $item_prices = [];
// foreach (WC()->cart->get_cart() as $item_key => $item) {
// $item_prices[$item_key] = WC()->cart->get_product_subtotal($item['data'], $item['quantity']);
// }
// wp_send_json_success([
// 'fragments' => $fragments,
// 'item_prices' => $item_prices,
// 'cart_total' => WC()->cart->get_cart_total()
// ]);
// }
// // AJAX-обработчик для удаления товара
// add_action('wp_ajax_remove_cart_item', 'remove_cart_item_callback');
// add_action('wp_ajax_nopriv_remove_cart_item', 'remove_cart_item_callback');
// function remove_cart_item_callback() {
// check_ajax_referer('wc_checkout_nonce', 'nonce');
// $cart_item_key = sanitize_text_field($_POST['cart_item_key']);
// WC()->cart->remove_cart_item($cart_item_key);
// WC()->cart->calculate_totals();
// // Подготовка фрагментов
// $fragments = [];
// // Обновление списка товаров
// ob_start();
// wc_get_template('checkout/form-checkout.php', [], '', get_template_directory() . '/woocommerce/');
// $fragments['.order-your__products'] = ob_get_clean();
// // Обновление секции итогов
// ob_start();
// woocommerce_checkout_coupon_form();
// woocommerce_order_review();
// $fragments['.order-your__calculation'] = ob_get_clean();
// wp_send_json_success([
// 'fragments' => $fragments,
// 'cart_total' => WC()->cart->get_cart_total()
// ]);
// }

@ -28,6 +28,7 @@ add_filter('wpseo_disable_adjacent_rel_links', '__return_true'); // Отключ
// Добавляем каноническую ссылку // Добавляем каноническую ссылку
add_action('wp_head', 'custom_canonical_url', 5); add_action('wp_head', 'custom_canonical_url', 5);
function custom_canonical_url() { function custom_canonical_url() {
if (!is_admin()) {
// Защищаем от дублирования // Защищаем от дублирования
static $canonical_added = false; static $canonical_added = false;
if ($canonical_added) { if ($canonical_added) {
@ -35,6 +36,150 @@ function custom_canonical_url() {
} }
$canonical_added = true; $canonical_added = true;
$current_url = home_url(add_query_arg('', $_SERVER['REQUEST_URI'])); // Формируем текущий URL без лишних параметров
$current_url = trailingslashit(home_url($_SERVER['REQUEST_URI']));
// Удаляем возможные параметры запроса, если они не нужны
$current_url = strtok($current_url, '?');
echo '<link rel="canonical" href="' . esc_url($current_url) . '" />' . "\n"; echo '<link rel="canonical" href="' . esc_url($current_url) . '" />' . "\n";
} }
}
add_action('wp_head', 'add_facebook_pixel');
function add_facebook_pixel() {
?>
<!-- Meta Pixel Code -->
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '1791804684725971');
fbq('track', 'PageView');
</script>
<noscript>
<img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=1791804684725971&ev=PageView&noscript=1"/>
</noscript>
<!-- End Meta Pixel Code -->
<?php
}
add_action('woocommerce_thankyou', 'send_purchase_to_metrika');
function send_purchase_to_metrika($order_id) {
if (!$order_id) return; // Проверка, что заказ существует
$order = wc_get_order($order_id);
if ($order->get_status() !== 'processing' && $order->get_status() !== 'completed') return; // Отправляем только для оплаченных заказов
$items = [];
foreach ($order->get_items() as $item) {
$product = $item->get_product();
$items[] = [
'id' => $product->get_id(),
'name' => $product->get_name(),
'price' => $product->get_price(),
'quantity' => $item->get_quantity()
];
}
// Получаем валюту заказа
$currency = $order->get_currency();
?>
<script>
window.dataLayer = window.dataLayer || [];
dataLayer.push({
'ecommerce': {
'purchase': {
'actionField': {
'id': '<?php echo $order_id; ?>',
'revenue': '<?php echo $order->get_total(); ?>',
'currency': '<?php echo $currency; ?>'
},
'products': <?php echo json_encode($items); ?>
}
}
});
// Яндекс.Метрика
yaCounter96481053.reachGoal('purchase', {
'order_id': '<?php echo $order_id; ?>',
'order_price': '<?php echo $order->get_total(); ?>',
'currency': '<?php echo $currency; ?>',
'items': <?php echo json_encode($items); ?>
});
// Facebook Pixel
fbq('track', 'Purchase', {
value: <?php echo $order->get_total(); ?>,
currency: '<?php echo $currency; ?>',
content_ids: [<?php echo implode(',', array_column($items, 'id')); ?>],
content_type: 'product'
});
</script>
<?php
}
// Отключаем кэширование для страниц товаров
add_action('template_redirect', function() {
if (is_product()) {
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
}
});
// Обработчик AJAX
add_action('wp_ajax_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
function woocommerce_ajax_add_to_cart() {
error_log('AJAX handler called'); // Отладка: логируем вызов
$product_id = isset($_POST['product_id']) ? absint($_POST['product_id']) : 0;
$quantity = isset($_POST['quantity']) ? absint($_POST['quantity']) : 1;
error_log('Received product_id: ' . $product_id . ', quantity: ' . $quantity); // Отладка
if (!$product_id) {
error_log('Invalid product_id received'); // Отладка
wp_send_json_error(array('message' => 'Неверный ID товара'));
wp_die();
}
$passed_validation = apply_filters('woocommerce_add_to_cart_validation', true, $product_id, $quantity);
if ($passed_validation) {
$added = WC()->cart->add_to_cart($product_id, $quantity);
if ($added) {
error_log('Product added to cart: ' . $product_id); // Отладка
// Подготавливаем фрагменты корзины
ob_start();
woocommerce_mini_cart();
$mini_cart = ob_get_clean();
// Фрагменты для стандартной корзины и кастомного счетчика
$fragments = array(
'div.widget_shopping_cart_content' => '<div class="widget_shopping_cart_content">' . $mini_cart . '</div>',
'.mini-profile__button--counter' => '<div class="mini-profile__button--counter">' . WC()->cart->get_cart_contents_count() . '</div>'
);
wp_send_json_success(array(
'message' => 'Товар успешно добавлен в корзину',
'fragments' => apply_filters('woocommerce_add_to_cart_fragments', $fragments),
'cart_hash' => apply_filters('woocommerce_add_to_cart_hash', WC()->cart->get_cart_hash(), array())
));
} else {
error_log('Failed to add product to cart: ' . $product_id); // Отладка
wp_send_json_error(array('message' => 'Не удалось добавить товар в корзину'));
}
} else {
error_log('Validation failed for product: ' . $product_id); // Отладка
wp_send_json_error(array('message' => 'Ошибка валидации товара'));
}
wp_die();
}

@ -172,7 +172,7 @@
} }
.modal__login { .modal__login {
width: 412px; width: 500px;
} }
.modal__item.active { .modal__item.active {

@ -63,12 +63,12 @@
$('.mini-profile__button--counter').addClass('disabled').html(response['cart_count']) $('.mini-profile__button--counter').addClass('disabled').html(response['cart_count'])
} }
initCounters(); initCounters();
let modal = document.querySelector('.modal'), let modalF = document.querySelector('.modal'),
aside = document.querySelector('.modal__aside'), aside = document.querySelector('.modal__aside'),
device = window.screen.width; device = window.screen.width;
if(!$.cookie('gp-cosmopet-cartadd')){ if(!$.cookie('gp-cosmopet-cartadd')){
modal.classList.add('active'); modalF.classList.add('active');
$('.modal__basket').addClass('active'); $('.modal__basket').addClass('active');
let thisContentElement = document.querySelector('.modal__basket'); let thisContentElement = document.querySelector('.modal__basket');
@ -645,66 +645,9 @@ toggleHeader('#pc-menu','.header__menu-block','.header__pc-menu', '.white', 'whi
toggleHeader('#phone-menu','.header__menu-block','.header__phone-menu', '.white', 'white'); toggleHeader('#phone-menu','.header__menu-block','.header__phone-menu', '.white', 'white');
// header // header
// modal
modalOpen('.button--filter', '.modal__filter');
modalOpen('.basket-open', '.modal__basket');
modalOpen('.login-open', '.modal__login');
modalOpen('.open-to-know', '.modal__to-know');
modalClose('.modal__close');
modalClose('.modal-form-sub__close');
let modal = document.querySelector('.modal');
modal.onclick = function (event) {
let target = event.target;
if (target.classList.contains('modal')) {
let aside = target.querySelector('.modal__aside'),
modalItem = target.querySelector('.modal__item.active');
aside.style.width = '0px';
setTimeout(() => {
modalItem.style.cssText = '';
modalItem.classList.remove('active');
target.classList.remove('active');
}, 300);
}
}
// modal
// toggle
toggleOpenX('.toggle', '.toggle__title', '.toggle__content', '.toggle__block-content', true);
// toggle
// radio-button
// let radioButtons = document.querySelectorAll('.radio-button');
// radioButtons.forEach(radioBlock => {
// let buttons = radioBlock.querySelectorAll('.button');
// buttons.forEach(button => {
// let input = radioBlock.querySelector('.radio-button__input');
// button.onclick = function (e) {
// e.preventDefault();
// buttons.forEach(thisButton => {
// if (thisButton.classList.contains('active')) {
// thisButton.classList.remove('active')
// }
// })
// let text = button.textContent.trim();
// button.classList.toggle('active');
// input.value = text;
// }
// })
// })
// radio-button
function initOverlay(){ function initOverlay(){

@ -13,12 +13,12 @@ add_action('wp_ajax_nopriv_contact_form', function() {
}); });
add_action('wp_ajax_subscribe_form', function() { add_action('wp_ajax_subscribe_form', function() {
$enabledHandlers = ['b24', 'email', 'mindbox']; $enabledHandlers = ['b24', 'email'];
process_form($enabledHandlers); process_form($enabledHandlers);
}); });
add_action('wp_ajax_nopriv_subscribe_form', function() { add_action('wp_ajax_nopriv_subscribe_form', function() {
$enabledHandlers = ['b24', 'email', 'mindbox']; $enabledHandlers = ['b24', 'email'];
process_form($enabledHandlers); process_form($enabledHandlers);
}); });

@ -34,43 +34,43 @@ class zohoHandler extends FormHandler {
} }
} }
class mindboxHandler extends FormHandler { // class mindboxHandler extends FormHandler {
public function handle($data) { // public function handle($data) {
// Отправка в стандартный обработчик (например, email) // // Отправка в стандартный обработчик (например, email)
error_log("Отправка в mindBox: " . json_encode($data)); // error_log("Отправка в mindBox: " . json_encode($data));
// if (is_string($data)) { // // if (is_string($data)) {
// parse_str($data, $parsedData); // Преобразуем строку в массив // // parse_str($data, $parsedData); // Преобразуем строку в массив
// $data = $parsedData; // // $data = $parsedData;
// } // // }
// $url = 'https://api.mindbox.ru/v3/operations/async?endpointId=cosmopet.Website&operation=DobavleniePolzovatelyaSSajta'; // // $url = 'https://api.mindbox.ru/v3/operations/async?endpointId=cosmopet.Website&operation=DobavleniePolzovatelyaSSajta';
// $data = array( // // $data = array(
// "email" => $data['email'], // // "email" => $data['email'],
// "subscriptions" => array( // // "subscriptions" => array(
// array( // // array(
// "pointOfContact"=> "Email" // // "pointOfContact"=> "Email"
// ), // // ),
// ), // // ),
// ); // // );
// $data_string = json_encode(array("customer" =>$data)); // // $data_string = json_encode(array("customer" =>$data));
// $ch = curl_init($url); // // $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); // // curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
// curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); // // curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// $result = curl_exec($ch); // // $result = curl_exec($ch);
// curl_close($ch); // // curl_close($ch);
return parent::handle($data); // return parent::handle($data);
} // }
} // }
class emailHandler extends FormHandler { class emailHandler extends FormHandler {
public function handle($data) { public function handle($data) {
@ -113,9 +113,9 @@ class FormHandlerFactory {
if (in_array('zoho', $enabledHandlers)) { if (in_array('zoho', $enabledHandlers)) {
$handler = new zohoHandler($handler); $handler = new zohoHandler($handler);
} }
if (in_array('mindbox', $enabledHandlers)) { // if (in_array('mindbox', $enabledHandlers)) {
$handler = new mindboxHandler($handler); // $handler = new mindboxHandler($handler);
} // }
if (in_array('b24', $enabledHandlers)) { if (in_array('b24', $enabledHandlers)) {
$handler = new b24Handler($handler); $handler = new b24Handler($handler);
} }

@ -1305,3 +1305,39 @@
.cdek-office-info{ .cdek-office-info{
display: none; display: none;
} }
.quantity-control {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
}
.quantity-decrease, .quantity-increase {
background: #f0f0f0;
border: none;
padding: 5px 10px;
cursor: pointer;
font-size: 16px;
border-radius: 4px;
}
.quantity-decrease:hover, .quantity-increase:hover {
background: #e0e0e0;
}
.quantity-input {
width: 50px;
text-align: center;
border: 1px solid #ccc;
border-radius: 4px;
padding: 5px;
}
.remove-item {
background: #ff4d4d;
color: white;
border: none;
padding: 5px 10px;
cursor: pointer;
border-radius: 4px;
}
.remove-item:hover {
background: #e63939;
}

@ -130,7 +130,7 @@ jQuery(document).ready(function ($) {
$('#billing_phone-error').addClass('active'); $('#billing_phone-error').addClass('active');
} }
if (errorMessage == 'Order pickup point not selected.' || errorMessage == 'Не выбран ПВЗ для доставки заказа.'){ if (errorMessage == 'Order pickup point not selected.' || errorMessage == 'Не выбран ПВЗ для доставки заказа.'){
$('#pvz-error').html(errorMessage) $('#pvz-error').html('Не выбран ПВЗ для доставки заказа.')
$('#pvz-error').addClass('active'); $('#pvz-error').addClass('active');
} }
if (errorMessage == 'adress_error'){ if (errorMessage == 'adress_error'){
@ -159,3 +159,174 @@ jQuery(document).ready(function ($) {
}) })
}); });
jQuery(document).ready(function($) {
// Функция для получения активных фильтров из URL
function getActiveFilters() {
const params = new URLSearchParams(window.location.search);
const filters = [];
params.forEach((value, key) => {
if (key.startsWith('filter_') || key === 'min_price' || key === 'max_price') {
let filterName = key.replace('filter_', '').replace('_', ' ');
let filterValue = value.split(',').map(val => decodeURIComponent(val.replace(/\+/g, ' ')));
if (key === 'min_price') {
filterName = 'Цена от';
filterValue = [value + ' ₽'];
} else if (key === 'max_price') {
filterName = 'Цена до';
filterValue = [value + ' ₽'];
}
filters.push({
key: key,
name: filterName.charAt( W1).toUpperCase() + filterName.slice(1),
values: filterValue
});
}
});
return filters;
}
// Функция для отображения активных фильтров
function displayActiveFilters() {
const $filterList = $('.active-filters__list');
const $filterContainer = $('.active-filters');
const $clearButton = $('.active-filters__clear');
$filterList.empty();
const activeFilters = getActiveFilters();
if (activeFilters.length > 0) {
$filterContainer.show();
$clearButton.show();
activeFilters.forEach(filter => {
filter.values.forEach(value => {
const $filterTag = $('<span>', {
class: 'active-filters__tag',
html: `${filter.name}: ${value} <span class="active-filters__remove" data-key="${filter.key}" data-value="${value}">&times;</span>`
});
$filterList.append($filterTag);
});
});
W2 else {
$filterContainer.hide();
$clearButton.hide();
}
}
// Инициализация при загрузке страницы
displayActiveFilters();
// Обновление фильтров после AJAX-фильтрации
$(document).on('wcpf_after_filtering', function() {
displayActiveFilters();
});
// Удаление фильтра
$(document).on('click', '.active-filters__remove', function() {
const key = $(this).data('key');
const value = $(this).data('value');
const params = new URLSearchParams(window.location.search);
if (key === 'min_price' || key === 'max_price') {
params.delete(key);
} else {
let values = params.get(key) ? params.get(key).split(',') : [];
values = values.filter(val => decodeURIComponent(val.replace(/\+/g, ' ')) !== value);
if (values.length > 0) {
params.set(key, values.join(','));
} else {
params.delete(key);
}
}
const newUrl = window.location.pathname + (params.toString() ? '?' + params.toString() : '');
window.history.pushState({}, '', newUrl);
// Запуск AJAX-фильтрации
$.ajax({
url: wc_checkout_params.ajax_url,
type: 'POST',
data: {
action: 'wcpf_filter',
query: params.toString(),
category_id: $('#load-more-products').data('category_id'),
category_type: $('#load-more-products').data('category_type')
},
success: function(response) {
if (response.success) {
$('.product__main').html(response.data.products);
displayActiveFilters();
$(document.body).trigger('wc_fragments_refreshed');
}
},
error: function() {
alert('Ошибка при обновлении фильтров');
}
});
});
// Очистка всех фильтров
$(document).on('click', '.active-filters__clear', function() {
const params = new URLSearchParams(window.location.search);
const newUrl = window.location.pathname;
window.history.pushState({}, '', newUrl);
$.ajax({
url: wc_checkout_params.ajax_url,
type: 'POST',
data: {
action: 'wcpf_filter',
query: '',
category_id: $('#load-more-products').data('category_id'),
category_type: $('#load-more-products').data('category_type')
},
success: function(response) {
if (response.success) {
$('.product__main').html(response.data.products);
displayActiveFilters();
$(document.body).trigger('wc_fragments_refreshed');
}
},
error: function() {
alert('Ошибка при очистке фильтров');
}
});
});
// Обработка загрузки дополнительных продуктов
$(document).on('click', '#load-more-products', function() {
const $button = $(this);
const categoryId = $button.data('category_id');
const categoryType = $button.data('category_type');
const page = parseInt($button.data('page') || 1) + 1;
$.ajax({
url: wc_checkout_params.ajax_url,
type: 'POST',
data: {
action: 'load_more_products',
category_id: categoryId,
category_type: categoryType,
page: page,
query: window.location.search
},
success: function(response) {
if (response.success) {
$('.product__main').append(response.data.products);
$button.data('page', page);
if (!response.data.has_more) {
$button.hide();
}
}
},
error: function() {
alert('Ошибка при загрузке продуктов');
}
});
});
});

@ -75,7 +75,7 @@
</div> </div>
<div class="mform mform-offer" style="display: none;"> <div class="mform mform-offer modal-offer" style="display: none;">
<div class="mform-content"> <div class="mform-content">
<div class="close-button">&times;</div> <div class="close-button">&times;</div>
<h2 class="mform-title">ПРЕДЛОЖИТЕ СТАТЬЮ</h2> <h2 class="mform-title">ПРЕДЛОЖИТЕ СТАТЬЮ</h2>
@ -101,7 +101,7 @@
<button type="submit" class="submit-button">Отправить</button> <button type="submit" class="submit-button">Отправить</button>
</div> </div>
<div class="author-image"> <div class="author-image">
<img src="/wp-content/uploads/2025/04/rectangle.png" alt="Автор"> <img src="/wp-content/uploads/2025/06/rectangle.png" alt="Автор">
</div> </div>
</form> </form>
</div> </div>
@ -170,57 +170,85 @@
}); });
}); });
// Находим все элементы с классом login-open
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const loginButtons = document.querySelectorAll('.login-open'); // Общая функция для открытия модальных окон
function modalOpen(triggerSelector, modalSelector) {
// Добавляем обработчик события для каждой кнопки const triggers = document.querySelectorAll(triggerSelector);
loginButtons.forEach(button => { const modalLogin = document.querySelector('.modal');
button.addEventListener('click', function(event) { const modalItem = document.querySelector(modalSelector);
event.preventDefault(); // Предотвращаем стандартное действие (если это ссылка) const modalAside = modalItem ? modalItem.querySelector('.modal__aside') : null;
// Находим элементы модального окна triggers.forEach(trigger => {
const modal = document.querySelector('.modal'); trigger.addEventListener('click', (e) => {
const modalAside = document.querySelector('.modal__aside'); e.preventDefault(); // Предотвращаем стандартное поведение
const modalLogin = document.querySelector('.modal__login');
// Сбрасываем стили и классы для всех модальных окон
document.querySelectorAll('.modal__item').forEach(item => {
item.classList.remove('active');
item.style.cssText = ''; // Сбрасываем opacity, filter и другие стили
const aside = item.querySelector('.modal__aside');
if (aside) {
aside.style.width = '';
}
});
// Добавляем классы active // Открываем нужное модальное окно
if (modalLogin && modalItem) {
modal.classList.add('active'); modal.classList.add('active');
modalLogin.classList.add('active'); modalItem.classList.add('active');
modalItem.style.opacity = '1'; // Устанавливаем видимость
// Устанавливаем ширину для modal__aside modalItem.style.filter = 'blur(0px)'; // Убираем размытие
modalAside.style.width = '412px'; if (modalAside) {
modalAside.style.width = '500px'; // Устанавливаем ширину
}
}
}); });
}); });
}
// Опционально: добавляем функцию закрытия модального окна // Общая функция для закрытия модальных окон
// Например, при клике на фон или кнопку закрытия function modalClose(closeSelector) {
const closeButtons = document.querySelectorAll('.modal-close'); const closes = document.querySelectorAll(closeSelector);
const modal = document.querySelector('.modal'); const modalLogin = document.querySelector('.modal');
// Закрытие по клику на кнопку закрытия closes.forEach(close => {
closeButtons.forEach(button => { close.addEventListener('click', () => {
button.addEventListener('click', closeModal); document.querySelectorAll('.modal__item').forEach(item => {
item.classList.remove('active');
item.style.cssText = ''; // Сбрасываем opacity, filter и другие стили
const aside = item.querySelector('.modal__aside');
if (aside) {
aside.style.width = '';
}
}); });
if (modalLogin) {
// Закрытие по клику на фон (если клик не на модальное окно) modal.classList.remove('active');
modal.addEventListener('click', function(event) {
if (event.target === modal) {
closeModal();
} }
}); });
});
}
function closeModal() { // Обработчик клика по фону модального окна
const modal = document.querySelector('.modal'); const modalLogin = document.querySelector('.modal');
const modalAside = document.querySelector('.modal__aside'); if (modalLogin) {
const modalLogin = document.querySelector('.modal__login'); modal.addEventListener('click', (event) => {
if (event.target.classList.contains('modal')) {
// Удаляем классы active const modalItem = modal.querySelector('.modal__item.active');
if (modalItem) {
const aside = modalItem.querySelector('.modal__aside');
if (aside) {
aside.style.width = '0px';
}
modalItem.style.opacity = '0'; // Анимация закрытия
modalItem.style.filter = 'blur(10px)';
setTimeout(() => {
modalItem.classList.remove('active');
modalItem.style.cssText = ''; // Сбрасываем все стили после анимации
modal.classList.remove('active'); modal.classList.remove('active');
modalLogin.classList.remove('active'); }, 300);
}
// Сбрасываем ширину }
modalAside.style.width = ''; });
} }
}); });
</script> </script>

@ -6,6 +6,7 @@
{% block content %} {% block content %}
<section class="home"> <section class="home">
<h1 class="home__title invisible">КОРМ БУДУЩЕГО ДЛЯ ВАШЕГО ПИТОМЦА</h1>
<div class="container"> <div class="container">
<div class="home__swiper"> <div class="home__swiper">
<div class="swiper-wrapper"> <div class="swiper-wrapper">

@ -17,27 +17,27 @@
class="header-pc-menu__title">{% if current_lang == 'ru' %}Кошкам{% elseif current_lang == 'en' %}For cats{% endif %}</a> class="header-pc-menu__title">{% if current_lang == 'ru' %}Кошкам{% elseif current_lang == 'en' %}For cats{% endif %}</a>
<ul class="header-pc-menu__list"> <ul class="header-pc-menu__list">
<li class="header-pc-menu__list-li"> <li class="header-pc-menu__list-li">
<a href="/shop/">{% if current_lang == 'ru' %}Корм{% elseif current_lang == 'en' %}Food{% endif %}</a> <a href="/product-category/cat-food/">{% if current_lang == 'ru' %}Корм{% elseif current_lang == 'en' %}Food{% endif %}</a>
</li> </li>
<li class="header-pc-menu__list-li"> <li class="header-pc-menu__list-li">
<a href="/shop/">{% if current_lang == 'ru' %}Лакомства{% elseif current_lang == 'en' %}Treats{% endif %}</a> <a href="/product-category/lakomstva-dlya-koshek/">{% if current_lang == 'ru' %}Лакомства{% elseif current_lang == 'en' %}Treats{% endif %}</a>
</li> </li>
<li class="header-pc-menu__list-li"> <li class="header-pc-menu__list-li">
<a href="/shop/">{% if current_lang == 'ru' %}Аксессуары{% elseif current_lang == 'en' %}Accessories{% endif %}</a> <a href="/product-category/aksessuary/">{% if current_lang == 'ru' %}Аксессуары{% elseif current_lang == 'en' %}Accessories{% endif %}</a>
</li> </li>
</ul> </ul>
</div> </div>
<div class="header-pc-menu__item"> <div class="header-pc-menu__item">
<a href="#" class="header-pc-menu__title">{% if current_lang == 'ru' %}Собакам{% elseif current_lang == 'en' %}For dogs{% endif %}</a> <a href="/shop/" class="header-pc-menu__title">{% if current_lang == 'ru' %}Собакам{% elseif current_lang == 'en' %}For dogs{% endif %}</a>
<ul class="header-pc-menu__list"> <ul class="header-pc-menu__list">
<li class="header-pc-menu__list-li"> <li class="header-pc-menu__list-li">
<a href="/shop/">{% if current_lang == 'ru' %}Корм{% elseif current_lang == 'en' %}Food{% endif %}</a> <a href="/product-category/dog-food/">{% if current_lang == 'ru' %}Корм{% elseif current_lang == 'en' %}Food{% endif %}</a>
</li> </li>
<li class="header-pc-menu__list-li"> <li class="header-pc-menu__list-li">
<a href="/shop/">{% if current_lang == 'ru' %}Лакомства{% elseif current_lang == 'en' %}Treats{% endif %}</a> <a href="/product-category/lakomstva-dlya-sobak/">{% if current_lang == 'ru' %}Лакомства{% elseif current_lang == 'en' %}Treats{% endif %}</a>
</li> </li>
<li class="header-pc-menu__list-li"> <li class="header-pc-menu__list-li">
<a href="/shop/">{% if current_lang == 'ru' %}Аксессуары{% elseif current_lang == 'en' %}Accessories{% endif %}</a> <a href="/product-category/aksessuary/">{% if current_lang == 'ru' %}Аксессуары{% elseif current_lang == 'en' %}Accessories{% endif %}</a>
</li> </li>
</ul> </ul>
</div> </div>
@ -60,30 +60,30 @@
class="header-phone-menu__category">Кошкам</a> class="header-phone-menu__category">Кошкам</a>
<ul class="header-phone-menu__list"> <ul class="header-phone-menu__list">
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a href="/shop/">Корм</a> <a href="/product-category/cat-food/">Корм</a>
</li> </li>
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a <a
href="/shop/">Лакомства</a> href="/product-category/lakomstva-dlya-koshek/">Лакомства</a>
</li> </li>
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a <a
href="/shop/">Аксессуары</a> href="/product-category/aksessuary/">Аксессуары</a>
</li> </li>
</ul> </ul>
<a href="/shop/" <a href="/shop/"
class="header-phone-menu__category">Собакам</a> class="header-phone-menu__category">Собакам</a>
<ul class="header-phone-menu__list"> <ul class="header-phone-menu__list">
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a href="/shop/">Корм</a> <a href="/product-category/dog-food/">Корм</a>
</li> </li>
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a <a
href="/shop/">Лакомства</a> href="/product-category/lakomstva-dlya-sobak/">Лакомства</a>
</li> </li>
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a <a
href="/shop/">Аксессуары</a> href="/product-category/aksessuary/">Аксессуары</a>
</li> </li>
</ul> </ul>
</div> </div>
@ -96,26 +96,26 @@
cats</a> cats</a>
<ul class="header-phone-menu__list"> <ul class="header-phone-menu__list">
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a href="/shop/">Food</a> <a href="/product-category/cat-food/">Food</a>
</li> </li>
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a href="/shop/">Treats</a> <a href="/product-category/lakomstva-dlya-koshek/">Treats</a>
</li> </li>
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a href="/shop/">Accessory</a> <a href="/product-category/aksessuary/">Accessory</a>
</li> </li>
</ul> </ul>
<a href="/shop/" class="header-phone-menu__category">For <a href="/shop/" class="header-phone-menu__category">For
dogs</a> dogs</a>
<ul class="header-phone-menu__list"> <ul class="header-phone-menu__list">
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a href="/shop/">Food</a> <a href="/product-category/dog-food/">Food</a>
</li> </li>
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a href="/shop/">Treats</a> <a href="/product-category/lakomstva-dlya-sobak/">Treats</a>
</li> </li>
<li class="header-phone-menu__list-item"> <li class="header-phone-menu__list-item">
<a href="/shop/">Accessory</a> <a href="/product-category/aksessuary/">Accessory</a>
</li> </li>
</ul> </ul>
</div> </div>

@ -7,6 +7,50 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Top.Mail.Ru counter -->
<script type="text/javascript">
var _tmr = window._tmr || (window._tmr = []);
_tmr.push({id: "3569464", type: "pageView", start: (new Date()).getTime()});
(function (d, w, id) {
if (d.getElementById(id)) return;
var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;
ts.src = "https://top-fwz1.mail.ru/js/code.js";
var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};
if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }
})(document, window, "tmr-code");
</script>
<noscript><div><img src="https://top-fwz1.mail.ru/counter?id=3569464;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div></noscript>
<!-- /Top.Mail.Ru counter -->
<!-- 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(96481053, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true,
webvisor:true,
ecommerce:"dataLayer"
});
window.dataLayer = window.dataLayer || [];
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/96481053" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<meta name="yandex-verification" content="2109bb636b61b248" />
<script>
(function(w,d,u){
var s=d.createElement('script');s.async=true;s.src=u+'?'+(Date.now()/60000|0);
var h=d.getElementsByTagName('script')[0];h.parentNode.insertBefore(s,h);
})(window,document,'https://cdn-ru.bitrix24.ru/b33297602/crm/tag/call.tracker.js');
</script>
</head> </head>
<body class="{{bodyClass}}"> <body class="{{bodyClass}}">

@ -18,7 +18,6 @@
{% endif %} {% endif %}
</div> </div>
<div class="product"> <div class="product">
<div class="product__header"> <div class="product__header">
<h1 class="product__title"> <h1 class="product__title">
@ -28,7 +27,12 @@
{{ function('pll_e', 'Продукция') }} {{ function('pll_e', 'Продукция') }}
{% endif %} {% endif %}
</h1> </h1>
<div class="active-filters" style="display: none;">
<div class="active-filters__list"></div>
<button class="active-filters__clear button button--white" style="display: none;">
{{ function('pll_e', 'Очистить все') }}
</button>
</div>
<button class="button button--gradient button--high button--icon button--filter"> <button class="button button--gradient button--high button--icon button--filter">
{{ function('pll_e', 'Фильтры') }} {{ function('pll_e', 'Фильтры') }}
</button> </button>

@ -138,21 +138,20 @@ toggleHeader('#phone-menu','.header__menu-block','.header__phone-menu', '.white'
// modal // modal
modalOpen('.button--filter', '.modal__filter'); modalOpen('.button--filter', '.modal__filter');
modalOpen('.basket-open', '.modal__basket'); modalOpen('.basket-open', '.modal__basket');
modalOpen('.login-open', '.modal__login');
modalOpen('.open-to-know', '.modal__to-know'); modalOpen('.open-to-know', '.modal__to-know');
modalClose('.modal__close'); modalClose('.modal__close');
modalClose('.modal-form-sub__close');
let modalWindow = document.querySelector('.modal'); // Изменено с modal на modalWindow
let modal = document.querySelector('.modal'); modalWindow.onclick = function (event) {
modal.onclick = function (event) {
let target = event.target; let target = event.target;
if (target.classList.contains('modal')) { if (target.classList.contains('modal')) {
let aside = target.querySelector('.modal__aside'), let aside = target.querySelector('.modal__aside'),
modalItem = target.querySelector('.modal__item.active'), modalItem = target.querySelector('.modal__item.active');
body = document.querySelector('body');
aside.style.width = '0px'; aside.style.width = '0px';
body.classList.remove('overflow-hidden');
setTimeout(() => { setTimeout(() => {
modalItem.style.cssText = ''; modalItem.style.cssText = '';
modalItem.classList.remove('active'); modalItem.classList.remove('active');
@ -195,7 +194,7 @@ radioButtons.forEach(radioBlock => {
}) })
// radio-button // radio-button
overlay
let products = document.querySelectorAll('.product__item'); let products = document.querySelectorAll('.product__item');
products.forEach(productItem => { products.forEach(productItem => {
@ -222,7 +221,7 @@ products.forEach(productItem => {
} }
}) })
overlay
// select // select

Loading…
Cancel
Save