['mode' => 'production', 'region' => 'ru'], 'cosmopet.ae' => ['mode' => 'production', 'region' => 'ae'], 'cosmopet-test-dumb.cp.good-production.xyz' => ['mode' => 'develope', 'region' => 'ru'], 'cosmopet-test-ru.cp.good-production.xyz' => ['mode' => 'develope', 'region' => 'ru'], 'cosmopet-test-ae.cp.good-production.xyz' => ['mode' => 'develope', 'region' => 'ae'], ]; $host = strtolower($host ?: $_SERVER['SERVER_NAME']); $config = $map[$host] ?? ['mode' => 'develope', 'region' => 'unknown']; $this->site_mode = $config['mode']; $this->site_region = $config['region']; } } add_filter('timber/twig', function (\Twig\Environment $twig) { $site_env = new SiteEnvironment(); $twig->addGlobal('site_region', $site_env->site_region); $twig->addGlobal('site_mode', $site_env->site_mode); return $twig; }); /* End | Работа с проверкой мультисайтовости и стендов */ add_filter('woocommerce_currency_symbol', 'change_aed_currency_symbol', 10, 2); function change_aed_currency_symbol($currency_symbol, $currency) { if ($currency == 'AED') { $currency_symbol = 'AED'; } return $currency_symbol; } add_filter('timber/context', function($context) { // Передаем все нужные константы в контекст Twig $context['CONSTANTS'] = [ 'DOMAIN' => 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(); ?> get_status() !== 'processing' && $order->get_status() !== 'completed')) return; $items = []; foreach ($order->get_items() as $item) { $product = $item->get_product(); $items[] = [ 'item_id' => $product->get_id(), 'item_name' => $product->get_name(), 'price' => $product->get_price(), 'quantity' => $item->get_quantity() ]; } ?> cart ? WC()->cart->get_total('edit') : 0; ?> admin_url('admin-ajax.php') )); // Inline CSS wp_enqueue_style('woocommerce-custom-styles', get_template_directory_uri() . '/style.css', array(), '1.0'); $custom_css = " .single_add_to_cart_button.loading { opacity: 0.5; cursor: not-allowed; position: relative; } .single_add_to_cart_button.loading:after { content: ''; display: inline-block; width: 16px; height: 16px; border: 2px solid #fff; border-radius: 50%; border-top-color: transparent; animation: spin 1s linear infinite; position: absolute; right: 10px; } @keyframes spin { 100% { transform: rotate(360deg); } } "; wp_add_inline_style('woocommerce-custom-styles', $custom_css); } } // Отключаем кэширование для страниц товаров 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' => '
' . $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(); }}