Task 6881 | исправил карточку товара

pull/36/head
parent 0584522ccf
commit 4e6a703392
  1. 11
      wp-content/themes/cosmopet/modules/profile/module-ajax-controller.php
  2. 4
      wp-content/themes/cosmopet/modules/shop/components/catalog/assets/css/catalog.css
  3. 89
      wp-content/themes/cosmopet/modules/shop/components/catalog/assets/js/filters.js
  4. 4
      wp-content/themes/cosmopet/modules/shop/components/catalog/assets/js/gp-main.js
  5. 3
      wp-content/themes/cosmopet/temp-functions/woocommerce-logic.php
  6. 9
      wp-content/themes/cosmopet/templates/_blocks/shop/archive-product-tease.twig
  7. 101
      wp-content/themes/cosmopet/templates/_pages/shop/archive-product.twig
  8. 9
      wp-content/themes/cosmopet/templates/archive-product/archive-product-ajaxload.twig
  9. 128
      wp-content/themes/cosmopet/templates/archive-product/archive-product-tease.twig

@ -138,11 +138,6 @@ add_action('wp_ajax_update_subscription_address', 'handle_subscription_address_u
add_action('wp_ajax_nopriv_update_subscription_address', 'handle_subscription_address_update'); add_action('wp_ajax_nopriv_update_subscription_address', 'handle_subscription_address_update');
function handle_subscription_address_update() { function handle_subscription_address_update() {
error_log('=== [AJAX] Запуск update_subscription_address ===');
error_log('[AJAX] Nonce из формы: ' . ($_POST['address_nonce'] ?? 'none'));
error_log('[AJAX] Проверка nonce: ' . (wp_verify_nonce($_POST['address_nonce'], 'update_subscription_address') ? 'OK' : 'FAIL'));
if (!isset($_POST['address_nonce']) || !wp_verify_nonce($_POST['address_nonce'], 'update_subscription_address')) { if (!isset($_POST['address_nonce']) || !wp_verify_nonce($_POST['address_nonce'], 'update_subscription_address')) {
error_log('[AJAX] Ошибка nonce'); error_log('[AJAX] Ошибка nonce');
wp_send_json_error(['message' => pll__('Ошибка безопасности. Обновите страницу.')]); wp_send_json_error(['message' => pll__('Ошибка безопасности. Обновите страницу.')]);
@ -158,8 +153,6 @@ function handle_subscription_address_update() {
$city = sanitize_text_field($_POST['city'] ?? ''); $city = sanitize_text_field($_POST['city'] ?? '');
$comment = sanitize_textarea_field($_POST['comment'] ?? ''); $comment = sanitize_textarea_field($_POST['comment'] ?? '');
error_log("[AJAX] Получено: ID={$subscription_id}, Address={$address_1}, City={$city}, Comment={$comment}");
if (!$subscription_id || empty($address_1)) { if (!$subscription_id || empty($address_1)) {
wp_send_json_error(['message' => pll__('Недостаточно данных.')]); wp_send_json_error(['message' => pll__('Недостаточно данных.')]);
} }
@ -177,6 +170,8 @@ function handle_subscription_address_update() {
$subscription->set_customer_note($comment); $subscription->set_customer_note($comment);
$subscription->save(); $subscription->save();
error_log('[AJAX] Подписка обновлена: ' . $subscription_id);
wp_send_json_success(['message' => pll__('Адрес доставки успешно обновлён.')]); wp_send_json_success(['message' => pll__('Адрес доставки успешно обновлён.')]);
} }

@ -806,9 +806,7 @@ display: none;
text-align: right; text-align: right;
color: var(--text-black); color: var(--text-black);
} }
.product-item-overlay__price::after{
content: 'AED';
}
.product-item-overlay__block-button{ .product-item-overlay__block-button{
margin-top: 32px; margin-top: 32px;
} }

@ -0,0 +1,89 @@
document.addEventListener("DOMContentLoaded", () => {
const filterButtons = document.querySelectorAll('.product-tagitem');
filterButtons.forEach(button => {
button.addEventListener('click', () => {
const slug = button.dataset.slug;
const taxonomy = button.dataset.taxonomy;
const param = 'wpf_filter_' + taxonomy;
const url = new URL(window.location.href);
const params = new URLSearchParams(url.search);
if (params.has(param)) {
let values = params.get(param).split(',');
values = values.filter(v => v !== slug);
if (values.length > 0) {
params.set(param, values.join(','));
} else {
params.delete(param);
}
url.search = params.toString();
window.location.href = url.toString();
}
});
});
// Обработка клика на теги активных фильтров
document.querySelectorAll('.active-filter-tag').forEach(tag => {
tag.addEventListener('click', function(e) {
e.preventDefault();
const slug = this.dataset.filterSlug;
const taxonomy = this.dataset.filterTaxonomy;
const urlParam = 'wpf_filter_' + taxonomy.replace('pa_', '');
const url = new URL(window.location.href);
const params = new URLSearchParams(url.search);
if (params.has(urlParam)) {
const currentValue = params.get(urlParam);
// Разделяем значения, учитывая как закодированные, так и обычные разделители
let values = currentValue.split(/\||%7C|,/);
// Декодируем и фильтруем значения
const newValues = values.filter(v => {
return decodeURIComponent(v.trim()) !== slug.trim();
});
// Обновляем URL параметры
if (newValues.length > 0) {
// Используем | как разделитель (можно заменить на ',', если нужно)
params.set(urlParam, newValues.join('|'));
} else {
params.delete(urlParam);
// Дополнительно очищаем связанные параметры
if (urlParam.includes('price')) {
params.delete('wpf_min_price');
params.delete('wpf_max_price');
}
params.delete('wpf_fbv');
}
// Обновляем URL и перезагружаем страницу
url.search = params.toString();
window.location.href = url.href;
}
});
});
// Обработка кнопки "Очистить все"
const clearAllBtn = document.querySelector('.active-filters__clear');
if (clearAllBtn) {
clearAllBtn.addEventListener('click', () => {
const url = new URL(window.location.href);
const params = new URLSearchParams(url.search);
for (const key of Array.from(params.keys())) {
if (key.startsWith('wpf_')) {
params.delete(key);
}
}
url.search = params.toString();
window.location.href = url.toString();
});
}
});

@ -38,7 +38,7 @@ jQuery(document).ready(function ($) {
// Обновляем цену без символа валюты (он добавляется через ::after) // Обновляем цену без символа валюты (он добавляется через ::after)
console.log(price * qty.val()) console.log(price * qty.val())
product.find('.product-item-overlay__price').html((price * qty.val())); product.find('.product-item-overlay__price-val').html((price * qty.val()));
}); });
@ -50,7 +50,7 @@ jQuery(document).ready(function ($) {
let id = $(this).data('product_id'); let id = $(this).data('product_id');
let qty = product.find('.counter__input').val(); let qty = product.find('.counter__input').val();
console.log('qty', price * qty) console.log('qty', price * qty)
window.t = product.find('.product-item-overlay__price') window.t = product.find('.product-item-overlay__price-val')
console.log(t) console.log(t)
var new_price = price * Number(qty) var new_price = price * Number(qty)
product.find('.product-item-overlay__price').html(new_price + ' '); product.find('.product-item-overlay__price').html(new_price + ' ');

@ -302,3 +302,6 @@ function custom_get_wc_notices() {
'html' => $html, 'html' => $html,
]); ]);
} }

@ -133,18 +133,21 @@
<div class="counter"> <div class="counter">
<button class="counter__button minus"> <button class="counter__button minus">
<img src="{{ theme.link }}/woocommerce/assets/img/svg/main/minus.svg" alt=""> <img src="{{ theme.link }}/static/img/svg/main/minus.svg" alt="">
</button> </button>
<input type="text" class="counter__input" value="1"> <input type="text" class="counter__input" value="1">
<button class="counter__button plus"> <button class="counter__button plus">
<img src="{{ theme.link }}/woocommerce/assets/img/svg/main/plus.svg" alt=""> <img src="{{ theme.link }}/static/img/svg/main/plus.svg" alt="">
</button> </button>
</div> </div>
</div> </div>
</div> </div>
<p class="product-item-overlay__price"> <p class="product-item-overlay__price">
<span class="product-item-overlay__price-val">
{{ post._price() }} {{ post._price() }}
</p> </span>&nbsp;<span class="product-item-overlay__price-cur">
{{ fn('get_woocommerce_currency_symbol') }}
</span>
<div class="product-item-overlay__block-button"> <div class="product-item-overlay__block-button">
<div class="product-item-overlay__button"> <div class="product-item-overlay__button">
{{ function('get_add_to_cart_button', post.id) }} {{ function('get_add_to_cart_button', post.id) }}

@ -4,14 +4,6 @@
{% block content %} {% block content %}
{% if site_region == 'ru' %}
<style>
.product-item-overlay__price::after{
content: '₽';
}
</style>
{% endif %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="/" class="breadcrumbs__item"> <a href="/" class="breadcrumbs__item">
{{ function('pll_e', 'Главная') }} {{ function('pll_e', 'Главная') }}
@ -74,97 +66,4 @@
</div> </div>
</div> </div>
<script>
document.addEventListener("DOMContentLoaded", () => {
const filterButtons = document.querySelectorAll('.product-tagitem');
filterButtons.forEach(button => {
button.addEventListener('click', () => {
const slug = button.dataset.slug;
const taxonomy = button.dataset.taxonomy;
const param = 'wpf_filter_' + taxonomy;
const url = new URL(window.location.href);
const params = new URLSearchParams(url.search);
if (params.has(param)) {
let values = params.get(param).split(',');
values = values.filter(v => v !== slug);
if (values.length > 0) {
params.set(param, values.join(','));
} else {
params.delete(param);
}
url.search = params.toString();
window.location.href = url.toString();
}
});
});
// Обработка клика на теги активных фильтров
document.querySelectorAll('.active-filter-tag').forEach(tag => {
tag.addEventListener('click', function(e) {
e.preventDefault();
const slug = this.dataset.filterSlug;
const taxonomy = this.dataset.filterTaxonomy;
const urlParam = 'wpf_filter_' + taxonomy.replace('pa_', '');
const url = new URL(window.location.href);
const params = new URLSearchParams(url.search);
if (params.has(urlParam)) {
const currentValue = params.get(urlParam);
// Разделяем значения, учитывая как закодированные, так и обычные разделители
let values = currentValue.split(/\||%7C|,/);
// Декодируем и фильтруем значения
const newValues = values.filter(v => {
return decodeURIComponent(v.trim()) !== slug.trim();
});
// Обновляем URL параметры
if (newValues.length > 0) {
// Используем | как разделитель (можно заменить на ',', если нужно)
params.set(urlParam, newValues.join('|'));
} else {
params.delete(urlParam);
// Дополнительно очищаем связанные параметры
if (urlParam.includes('price')) {
params.delete('wpf_min_price');
params.delete('wpf_max_price');
}
params.delete('wpf_fbv');
}
// Обновляем URL и перезагружаем страницу
url.search = params.toString();
window.location.href = url.href;
}
});
});
// Обработка кнопки "Очистить все"
const clearAllBtn = document.querySelector('.active-filters__clear');
if (clearAllBtn) {
clearAllBtn.addEventListener('click', () => {
const url = new URL(window.location.href);
const params = new URLSearchParams(url.search);
for (const key of Array.from(params.keys())) {
if (key.startsWith('wpf_')) {
params.delete(key);
}
}
url.search = params.toString();
window.location.href = url.toString();
});
}
});
</script>
{% endblock %} {% endblock %}

@ -1,9 +0,0 @@
{% for post in posts %}
{% include 'archive-product/archive-product-tease.twig' with {post: post} %}
{% endfor %}
{% if not ended %}
<button class="button button--white" id="load-more-products" data-category_id="{{ get_category }}" data-category_type="{{ get_category_type }}">
{{ function('pll_e', 'Загрузить еще') }}
</button>
{% endif %}

@ -1,128 +0,0 @@
{% if post.id is defined and post.id %}
{% set cur_product = fn('wc_get_product', post.id) %}
{% set attrs = post.product.get_attributes() %}
{% set cur_weight = function('get_product_info', post.id, 'weight') %}
<div class="product__item">
<div class="product-item__label">
{% if post.date('Y-m-d') >= criteria_for_new_product %}
<span class="product-item-label__tag product-item-label__tag--new">
{{ function('pll_e', 'Новинка') }}
</span>
{% endif %}
{% if post._sale_price %}
<span class="product-item-label__tag product-item-label__tag--sale">
{{ function('pll_e', 'Распродажа %') }}
</span>
{% endif %}
</div>
<a href="{{ post.link }}" class="product-item__product-card">
<img src="{{ post.thumbnail.src('shop_single') }}" alt="{{ post.title }}" class="product-item__images">
</a>
<div class="product-item__content-card">
<div class="compound">
{% set compound = fn('wc_get_product_terms', post.id, 'pa_compound') %}
{% for option in compound %}
{% set term = get_term(option) %}
<a href="/compound/{{ term.slug }}" class="compound__item">{{ term.name }}</a>
{% endfor %}
</div>
<a href="{{ post.link }}" class="product-item__title">{{ post.title }}</a>
<div class="product-item__price">
<p>{{ post._price() }} {{ fn('get_woocommerce_currency_symbol') }}</p>
</div>
{% set stock_status = fn('wc_get_product_stock_status', post.id) %}
{% if stock_status == 'instock' %}
<div class="product-item__bye">
<button class="button button--white button--100-perc open-overlay">
{{ function('pll_e', 'Купить') }}
</button>
</div>
{% else %}
<button data-pname="{{ post.title }}" class="to-know button--100-perc open-to-know">
<p>{{ function('pll_e', 'Узнать о поступлении') }}</p>
</button>
{% endif %}
</div>
<div class="product-item__overlay">
<div class="product-item-overlay__header">
<a href="{{ post.link }}" class="product-item__title">{{ post.title }}</a>
<ul class="product-item-overlay__tags">
{% set features = fn('wc_get_product_terms', post.id, 'pa_features') %}
{% for option in features %}
{% set term = get_term(option) %}
<li>{{ term.name }}</li>
{% endfor %}
</ul>
</div>
<form class="product-item__form" method="post" action="/send-telegram.php">
<div class="product-item-overlay__input-block">
{% set collection = fn('wc_get_product_terms', post.id, 'pa_collection') %}
{% if collection %}
<div class="product-item-overlay__field">
<p class="product-item-overlay-field__title">{{ fn('pll_e', 'Объем') }}</p>
<div class="select">
<input type="text" class="select__state" value="{{ cur_weight }}" readonly data-product_id="{{post.id}}" data-product_price="{{ post._price() }}">
<div class="state__block">
<ul class="state__content">
{% for option in collection %}
{% set term = get_term(option) %}
{% set siblings = function('get_collection_siblings' , term.id) %}
{% for sibling in siblings %}
{% set weight = function('get_product_info', sibling.ID, 'weight') %}
{% set class = '' %}
{% if weight == cur_weight %}
{% set class = 'active' %}
{% endif %}
<li>
<button class="state__button {{ class }}" data-product_id="{{sibling.ID}}" data-product_price="{{ function('get_product_info', sibling.ID, 'price') }}">
{{ weight }}
</button>
</li>
{% endfor %}
{% endfor %}
</ul>
</div>
</div>
</div>
{% endif %}
<div class="product-item-overlay__field">
<p class="product-item-overlay-field__title">{{ fn('pll_e', 'Количество') }}</p>
<div class="counter">
<button class="counter__button minus">
<img src="{{ theme.link }}/woocommerce/assets/img/svg/main/minus.svg" alt="">
</button>
<input type="text" class="counter__input" value="1">
<button class="counter__button plus">
<img src="{{ theme.link }}/woocommerce/assets/img/svg/main/plus.svg" alt="">
</button>
</div>
</div>
</div>
<p class="product-item-overlay__price">
{{ post._price() }}
</p>
<div class="product-item-overlay__block-button">
<div class="product-item-overlay__button">
{{ function('get_add_to_cart_button', post.id) }}
</div>
<div class="product-item-overlay__more_button">
<a class="to-know button--100-perc" href="{{ post.link }}">
<p>{{ function('pll_e', 'Подробнее') }}</p>
</a>
</div>
</div>
</form>
</div>
</div>
{% endif %}
Loading…
Cancel
Save