From 1206bb8fd30f2b388fa3c97afa4d095d786f0c2a Mon Sep 17 00:00:00 2001 From: maksim Date: Fri, 6 Jun 2025 22:53:37 +0300 Subject: [PATCH] =?UTF-8?q?5933=20|=20=D0=BC=D0=BD=D0=BE=D0=B6=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=BE=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D0=BA=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B3=D0=BB=D0=B0=D1=81=D0=BD=D0=BE=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=D0=BC=20=D0=BD=D0=B0?= =?UTF-8?q?=20RU=20=D1=81=D1=82=D0=B5=D0=BD=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wp-content/themes/cosmopet/functions.php | 32 +- .../global-functions/core-functions.php | 89 +++++ .../global-functions/multisite-functions.php | 223 +++++++++-- .../footer/assets/css/gp-style-desktop.css | 2 +- .../modules/footer/assets/js/footer.js | 61 +-- .../modules/footer/module-controller.php | 375 +++++++++--------- .../modules/forms/module-ajax-controller.php | 4 +- .../modules/forms/module-controller.php | 60 +-- .../checkout/assets/css/checkout.css | 36 ++ .../components/checkout/assets/js/script.js | 173 +++++++- .../themes/cosmopet/templates/footer.twig | 132 +++--- .../templates/front-page/front-page.twig | 1 + .../themes/cosmopet/templates/header.twig | 38 +- .../themes/cosmopet/templates/layout.twig | 44 ++ .../archive-product/archive-product.twig | 8 +- .../cosmopet/woocommerce/assets/js/gp-main.js | 29 +- 16 files changed, 895 insertions(+), 412 deletions(-) diff --git a/wp-content/themes/cosmopet/functions.php b/wp-content/themes/cosmopet/functions.php index b6148f8..cd213f7 100644 --- a/wp-content/themes/cosmopet/functions.php +++ b/wp-content/themes/cosmopet/functions.php @@ -1200,6 +1200,7 @@ function remove_woocommerce_styles_on_checkout() { // Добавляем hreflang теги для cosmopet.shop add_action('wp_head', 'custom_hreflang_shop', 6); function custom_hreflang_shop() { + if (!is_admin() && function_exists('pll_get_post') && function_exists('pll_languages_list')) { // Защищаем от дублирования static $hreflang_added = false; if ($hreflang_added) { @@ -1207,12 +1208,34 @@ function custom_hreflang_shop() { } $hreflang_added = true; - $current_path = add_query_arg('', $_SERVER['REQUEST_URI']); + // Домены для языков $ru_domain = 'https://cosmopet-test-ru.cp.good-production.xyz'; $en_domain = 'https://cosmopet-test-ae.cp.good-production.xyz'; - echo '' . "\n"; - echo '' . "\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 '' . "\n"; + echo '' . "\n"; + } } add_action('wp_head', 'custom_checkout_padding'); @@ -1317,4 +1340,5 @@ function custom_handle_activation_request() { } } -} \ No newline at end of file +} + diff --git a/wp-content/themes/cosmopet/global-functions/core-functions.php b/wp-content/themes/cosmopet/global-functions/core-functions.php index 2638d0c..d917072 100644 --- a/wp-content/themes/cosmopet/global-functions/core-functions.php +++ b/wp-content/themes/cosmopet/global-functions/core-functions.php @@ -172,3 +172,92 @@ $zero = '0'; 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() +// ]); +// } + + diff --git a/wp-content/themes/cosmopet/global-functions/multisite-functions.php b/wp-content/themes/cosmopet/global-functions/multisite-functions.php index 2152328..b8b3cd8 100644 --- a/wp-content/themes/cosmopet/global-functions/multisite-functions.php +++ b/wp-content/themes/cosmopet/global-functions/multisite-functions.php @@ -1,40 +1,185 @@ - defined('SITE_DOMAIN') ? SITE_DOMAIN : null, - ]; - - return $context; -}); - - -// Отключаем канонические ссылки и hreflang от Yoast SEO -add_filter('wpseo_canonical', '__return_false'); -add_filter('wpseo_opengraph_url', '__return_false'); // Отключаем OG URL -add_filter('wpseo_add_x_default_hreflang', '__return_false'); // Отключаем hreflang от Yoast -add_filter('wpseo_disable_adjacent_rel_links', '__return_true'); // Отключаем соседние rel-ссылки - -// Добавляем каноническую ссылку -add_action('wp_head', 'custom_canonical_url', 5); -function custom_canonical_url() { - // Защищаем от дублирования - static $canonical_added = false; - if ($canonical_added) { - return; - } - $canonical_added = true; - - $current_url = home_url(add_query_arg('', $_SERVER['REQUEST_URI'])); - echo '' . "\n"; + defined('SITE_DOMAIN') ? SITE_DOMAIN : null, + ]; + + return $context; +}); + + +// Отключаем канонические ссылки и hreflang от Yoast SEO +add_filter('wpseo_canonical', '__return_false'); +add_filter('wpseo_opengraph_url', '__return_false'); // Отключаем OG URL +add_filter('wpseo_add_x_default_hreflang', '__return_false'); // Отключаем hreflang от Yoast +add_filter('wpseo_disable_adjacent_rel_links', '__return_true'); // Отключаем соседние rel-ссылки + +// Добавляем каноническую ссылку +add_action('wp_head', 'custom_canonical_url', 5); +function custom_canonical_url() { + if (!is_admin()) { + // Защищаем от дублирования + static $canonical_added = false; + if ($canonical_added) { + return; + } + $canonical_added = true; + + // Формируем текущий URL без лишних параметров + $current_url = trailingslashit(home_url($_SERVER['REQUEST_URI'])); + // Удаляем возможные параметры запроса, если они не нужны + $current_url = strtok($current_url, '?'); + echo '' . "\n"; + } +} + +add_action('wp_head', 'add_facebook_pixel'); +function add_facebook_pixel() { + ?> + + + + + 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(); + ?> + + 'Неверный 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' => '
' . $mini_cart . '
', + '.mini-profile__button--counter' => '
' . WC()->cart->get_cart_contents_count() . '
' + ); + + 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(); } \ No newline at end of file diff --git a/wp-content/themes/cosmopet/modules/footer/assets/css/gp-style-desktop.css b/wp-content/themes/cosmopet/modules/footer/assets/css/gp-style-desktop.css index f02a7b9..e966923 100644 --- a/wp-content/themes/cosmopet/modules/footer/assets/css/gp-style-desktop.css +++ b/wp-content/themes/cosmopet/modules/footer/assets/css/gp-style-desktop.css @@ -172,7 +172,7 @@ } .modal__login { - width: 412px; + width: 500px; } .modal__item.active { diff --git a/wp-content/themes/cosmopet/modules/footer/assets/js/footer.js b/wp-content/themes/cosmopet/modules/footer/assets/js/footer.js index 22e286c..bdd6ea3 100644 --- a/wp-content/themes/cosmopet/modules/footer/assets/js/footer.js +++ b/wp-content/themes/cosmopet/modules/footer/assets/js/footer.js @@ -63,12 +63,12 @@ $('.mini-profile__button--counter').addClass('disabled').html(response['cart_count']) } initCounters(); - let modal = document.querySelector('.modal'), + let modalF = document.querySelector('.modal'), aside = document.querySelector('.modal__aside'), device = window.screen.width; if(!$.cookie('gp-cosmopet-cartadd')){ - modal.classList.add('active'); + modalF.classList.add('active'); $('.modal__basket').addClass('active'); 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'); // 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(){ diff --git a/wp-content/themes/cosmopet/modules/footer/module-controller.php b/wp-content/themes/cosmopet/modules/footer/module-controller.php index 82f4e99..e1d0f4a 100644 --- a/wp-content/themes/cosmopet/modules/footer/module-controller.php +++ b/wp-content/themes/cosmopet/modules/footer/module-controller.php @@ -1,189 +1,188 @@ -<<<<<<< Updated upstream -Hello, {$first_name} {$last_name}!"; - } else { - $html = "

Hello, {$first_name} {$last_name}!

"; - } - if (isset($tg_user['photo_url'])) { - $photo_url = htmlspecialchars($tg_user['photo_url']); - $html .= ""; - } - $html .= "

Log out

"; - } else { - $bot_username = BOT_USERNAME; - $html = ''; - } - if(!is_user_logged_in()) { - echo $html; - } -} - -add_action( 'wp_ajax_ontelegramauth', 'onTelegramAuth' ); -add_action( 'wp_ajax_nopriv_ontelegramauth', 'onTelegramAuth' ); - -function onTelegramAuth(){ - $tg_id = $_POST['userid']; - $tg_username = $_POST['username']; - $user = get_users( - array( - 'meta_key' => 'tg_account', - 'meta_value' => $tg_id - ) - ); - // $user = get_users( - // array( - // 'meta_key' => 'tg_username', - // 'meta_value' => $tg_username - // ) - // ); - - // Генерация пароля - $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890@#!()'; - $pass = array(); - $alphaLength = strlen($alphabet) - 1; - for ($i = 0; $i < 12; $i++) { - $n = rand(0, $alphaLength); - $pass[] = $alphabet[$n]; - } - $pass = implode($pass); - - if($user) { - $user_login = $user[0]->data->user_login; - $user_id = get_user_by( 'login', $user_login )->ID; - wp_set_password( $pass, get_user_by( 'login', $user_login )->ID ); - wp_signon( - array( - 'user_login' => $user_login, - 'user_password' => $pass, - 'remember' => 'on', - ) - ); - } else { - $user_id = wp_create_user( $tg_username, $pass, ''); - add_user_meta( $user_id, 'tg_account', $tg_id); - add_user_meta( $user_id, 'tg_username', $tg_username); - wp_update_user( [ - 'ID' => $user_id, - 'first_name' => $_POST['fname'], - 'last_name' => $_POST['lname'] - ] ); - wp_set_auth_cookie( $user_id, true ); - } - -} - -add_action( 'wp_ajax_linktelegram', 'linkTelegram' ); -add_action( 'wp_ajax_nopriv_linktelegram', 'linkTelegram' ); - -function linkTelegram(){ - $tg_id = $_POST['userid']; - $user_id = get_current_user_id(); - - add_user_meta( $user_id, 'tg_account', $tg_id); - wp_update_user( [ - 'ID' => $user_id, - 'first_name' => $_POST['fname'], - 'last_name' => $_POST['lname'] - ] ); -} - -add_action( 'wp_ajax_email_link', 'emailLink' ); -add_action( 'wp_ajax_nopriv_email_link', 'emailLink' ); -function emailLink(){ - - $email = $_POST['email']; - $user_id = get_current_user_id(); - - if(email_exists($email)){ - header("Content-Type: application/json"); - echo json_encode(array( - 'error' => esc_html__( 'Email is already registered', 'woodmart' ) - )); - exit(); - } else { - wp_update_user( [ - 'ID' => $user_id, - 'user_email' => $email - ] ); - } - - -} - - - -// Добавляем колонку Telegram в список пользователей -add_filter('manage_users_columns', 'add_tg_account_column'); -function add_tg_account_column($columns) { - $columns['tg_username'] = 'Telegram'; - return $columns; -} - -// Заполняем колонку данными -add_filter('manage_users_custom_column', 'add_tg_account_column_content', 10, 3); -function add_tg_account_column_content($value, $column_name, $user_id) { - if ('tg_username' == $column_name) { - $tg_account = get_user_meta($user_id, 'tg_username', true); - if ($tg_account) { - return '@' . esc_html($tg_account) . ''; - } - return 'не указан'; - } - return $value; -} - -// Делаем колонку сортируемой -add_filter('manage_users_sortable_columns', 'make_tg_account_column_sortable'); -function make_tg_account_column_sortable($columns) { - $columns['tg_username'] = 'tg_username'; - return $columns; -} - -// Обрабатываем сортировку -add_action('pre_get_users', 'handle_tg_account_sorting'); -function handle_tg_account_sorting($query) { - if (!is_admin() || !$query->is_main_query()) { - return; - } - - if ('tg_username' === $query->get('orderby')) { - $query->set('meta_key', 'tg_username'); - $query->set('orderby', 'meta_value'); - } -} - +Hello, {$first_name} {$last_name}!"; + } else { + $html = "

Hello, {$first_name} {$last_name}!

"; + } + if (isset($tg_user['photo_url'])) { + $photo_url = htmlspecialchars($tg_user['photo_url']); + $html .= ""; + } + $html .= "

Log out

"; + } else { + $bot_username = BOT_USERNAME; + $html = ''; + } + if(!is_user_logged_in()) { + echo $html; + } +} + +add_action( 'wp_ajax_ontelegramauth', 'onTelegramAuth' ); +add_action( 'wp_ajax_nopriv_ontelegramauth', 'onTelegramAuth' ); + +function onTelegramAuth(){ + $tg_id = $_POST['userid']; + $tg_username = $_POST['username']; + $user = get_users( + array( + 'meta_key' => 'tg_account', + 'meta_value' => $tg_id + ) + ); + // $user = get_users( + // array( + // 'meta_key' => 'tg_username', + // 'meta_value' => $tg_username + // ) + // ); + + // Генерация пароля + $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890@#!()'; + $pass = array(); + $alphaLength = strlen($alphabet) - 1; + for ($i = 0; $i < 12; $i++) { + $n = rand(0, $alphaLength); + $pass[] = $alphabet[$n]; + } + $pass = implode($pass); + + if($user) { + $user_login = $user[0]->data->user_login; + $user_id = get_user_by( 'login', $user_login )->ID; + wp_set_password( $pass, get_user_by( 'login', $user_login )->ID ); + wp_signon( + array( + 'user_login' => $user_login, + 'user_password' => $pass, + 'remember' => 'on', + ) + ); + } else { + $user_id = wp_create_user( $tg_username, $pass, ''); + add_user_meta( $user_id, 'tg_account', $tg_id); + add_user_meta( $user_id, 'tg_username', $tg_username); + wp_update_user( [ + 'ID' => $user_id, + 'first_name' => $_POST['fname'], + 'last_name' => $_POST['lname'] + ] ); + wp_set_auth_cookie( $user_id, true ); + } + +} + +add_action( 'wp_ajax_linktelegram', 'linkTelegram' ); +add_action( 'wp_ajax_nopriv_linktelegram', 'linkTelegram' ); + +function linkTelegram(){ + $tg_id = $_POST['userid']; + $user_id = get_current_user_id(); + + add_user_meta( $user_id, 'tg_account', $tg_id); + wp_update_user( [ + 'ID' => $user_id, + 'first_name' => $_POST['fname'], + 'last_name' => $_POST['lname'] + ] ); +} + +add_action( 'wp_ajax_email_link', 'emailLink' ); +add_action( 'wp_ajax_nopriv_email_link', 'emailLink' ); +function emailLink(){ + + $email = $_POST['email']; + $user_id = get_current_user_id(); + + if(email_exists($email)){ + header("Content-Type: application/json"); + echo json_encode(array( + 'error' => esc_html__( 'Email is already registered', 'woodmart' ) + )); + exit(); + } else { + wp_update_user( [ + 'ID' => $user_id, + 'user_email' => $email + ] ); + } + + +} + + + +// Добавляем колонку Telegram в список пользователей +add_filter('manage_users_columns', 'add_tg_account_column'); +function add_tg_account_column($columns) { + $columns['tg_username'] = 'Telegram'; + return $columns; +} + +// Заполняем колонку данными +add_filter('manage_users_custom_column', 'add_tg_account_column_content', 10, 3); +function add_tg_account_column_content($value, $column_name, $user_id) { + if ('tg_username' == $column_name) { + $tg_account = get_user_meta($user_id, 'tg_username', true); + if ($tg_account) { + return '@' . esc_html($tg_account) . ''; + } + return 'не указан'; + } + return $value; +} + +// Делаем колонку сортируемой +add_filter('manage_users_sortable_columns', 'make_tg_account_column_sortable'); +function make_tg_account_column_sortable($columns) { + $columns['tg_username'] = 'tg_username'; + return $columns; +} + +// Обрабатываем сортировку +add_action('pre_get_users', 'handle_tg_account_sorting'); +function handle_tg_account_sorting($query) { + if (!is_admin() || !$query->is_main_query()) { + return; + } + + if ('tg_username' === $query->get('orderby')) { + $query->set('meta_key', 'tg_username'); + $query->set('orderby', 'meta_value'); + } +} + ?> \ No newline at end of file diff --git a/wp-content/themes/cosmopet/modules/forms/module-ajax-controller.php b/wp-content/themes/cosmopet/modules/forms/module-ajax-controller.php index dacdfd5..445e0bd 100644 --- a/wp-content/themes/cosmopet/modules/forms/module-ajax-controller.php +++ b/wp-content/themes/cosmopet/modules/forms/module-ajax-controller.php @@ -13,12 +13,12 @@ add_action('wp_ajax_nopriv_contact_form', function() { }); add_action('wp_ajax_subscribe_form', function() { - $enabledHandlers = ['b24', 'email', 'mindbox']; + $enabledHandlers = ['b24', 'email']; process_form($enabledHandlers); }); add_action('wp_ajax_nopriv_subscribe_form', function() { - $enabledHandlers = ['b24', 'email', 'mindbox']; + $enabledHandlers = ['b24', 'email']; process_form($enabledHandlers); }); diff --git a/wp-content/themes/cosmopet/modules/forms/module-controller.php b/wp-content/themes/cosmopet/modules/forms/module-controller.php index b5aa7c3..144ebc3 100644 --- a/wp-content/themes/cosmopet/modules/forms/module-controller.php +++ b/wp-content/themes/cosmopet/modules/forms/module-controller.php @@ -34,43 +34,43 @@ class zohoHandler extends FormHandler { } } -class mindboxHandler extends FormHandler { - public function handle($data) { - // Отправка в стандартный обработчик (например, email) - error_log("Отправка в mindBox: " . json_encode($data)); - // if (is_string($data)) { - // parse_str($data, $parsedData); // Преобразуем строку в массив - // $data = $parsedData; - // } +// class mindboxHandler extends FormHandler { +// public function handle($data) { +// // Отправка в стандартный обработчик (например, email) +// error_log("Отправка в mindBox: " . json_encode($data)); +// // if (is_string($data)) { +// // parse_str($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( - // "email" => $data['email'], - // "subscriptions" => array( - // array( - // "pointOfContact"=> "Email" - // ), - // ), - // ); +// // $data = array( +// // "email" => $data['email'], +// // "subscriptions" => array( +// // array( +// // "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); - return parent::handle($data); - } -} +// // curl_close($ch); +// return parent::handle($data); +// } +// } class emailHandler extends FormHandler { public function handle($data) { @@ -113,9 +113,9 @@ class FormHandlerFactory { if (in_array('zoho', $enabledHandlers)) { $handler = new zohoHandler($handler); } - if (in_array('mindbox', $enabledHandlers)) { - $handler = new mindboxHandler($handler); - } + // if (in_array('mindbox', $enabledHandlers)) { + // $handler = new mindboxHandler($handler); + // } if (in_array('b24', $enabledHandlers)) { $handler = new b24Handler($handler); } diff --git a/wp-content/themes/cosmopet/modules/shop/components/checkout/assets/css/checkout.css b/wp-content/themes/cosmopet/modules/shop/components/checkout/assets/css/checkout.css index f3ee59b..808f7fe 100644 --- a/wp-content/themes/cosmopet/modules/shop/components/checkout/assets/css/checkout.css +++ b/wp-content/themes/cosmopet/modules/shop/components/checkout/assets/css/checkout.css @@ -1304,4 +1304,40 @@ .cdek-office-info{ 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; } \ No newline at end of file diff --git a/wp-content/themes/cosmopet/modules/shop/components/checkout/assets/js/script.js b/wp-content/themes/cosmopet/modules/shop/components/checkout/assets/js/script.js index 3035f2c..fafa1a1 100644 --- a/wp-content/themes/cosmopet/modules/shop/components/checkout/assets/js/script.js +++ b/wp-content/themes/cosmopet/modules/shop/components/checkout/assets/js/script.js @@ -130,7 +130,7 @@ jQuery(document).ready(function ($) { $('#billing_phone-error').addClass('active'); } if (errorMessage == 'Order pickup point not selected.' || errorMessage == 'Не выбран ПВЗ для доставки заказа.'){ - $('#pvz-error').html(errorMessage) + $('#pvz-error').html('Не выбран ПВЗ для доставки заказа.') $('#pvz-error').addClass('active'); } 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 = $('', { + class: 'active-filters__tag', + html: `${filter.name}: ${value} ×` + }); + $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('Ошибка при загрузке продуктов'); + } + }); + }); +}); + diff --git a/wp-content/themes/cosmopet/templates/footer.twig b/wp-content/themes/cosmopet/templates/footer.twig index 9478b5e..eba9552 100644 --- a/wp-content/themes/cosmopet/templates/footer.twig +++ b/wp-content/themes/cosmopet/templates/footer.twig @@ -75,7 +75,7 @@ - -

@@ -28,7 +27,12 @@ {{ function('pll_e', 'Продукция') }} {% endif %}

- + diff --git a/wp-content/themes/cosmopet/woocommerce/assets/js/gp-main.js b/wp-content/themes/cosmopet/woocommerce/assets/js/gp-main.js index e011909..438dc06 100644 --- a/wp-content/themes/cosmopet/woocommerce/assets/js/gp-main.js +++ b/wp-content/themes/cosmopet/woocommerce/assets/js/gp-main.js @@ -138,26 +138,25 @@ toggleHeader('#phone-menu','.header__menu-block','.header__phone-menu', '.white' // 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 modalWindow = document.querySelector('.modal'); // Изменено с modal на modalWindow -let modal = document.querySelector('.modal'); - -modal.onclick = function (event) { +modalWindow.onclick = function (event) { let target = event.target; if (target.classList.contains('modal')) { let aside = target.querySelector('.modal__aside'), - modalItem = target.querySelector('.modal__item.active'), - body = document.querySelector('body'); - - aside.style.width = '0px'; - body.classList.remove('overflow-hidden'); - setTimeout(() => { - modalItem.style.cssText = ''; - modalItem.classList.remove('active'); - target.classList.remove('active'); - }, 300); + modalItem = target.querySelector('.modal__item.active'); + + aside.style.width = '0px'; + setTimeout(() => { + modalItem.style.cssText = ''; + modalItem.classList.remove('active'); + target.classList.remove('active'); + }, 300); } } @@ -195,7 +194,7 @@ radioButtons.forEach(radioBlock => { }) // radio-button -overlay + let products = document.querySelectorAll('.product__item'); products.forEach(productItem => { @@ -222,7 +221,7 @@ products.forEach(productItem => { } }) -overlay + // select