dev_10_fixbugs #35

Merged
Andrei-10 merged 14 commits from dev_10_fixbugs into master 2 months ago
  1. 1
      wp-content/themes/cosmopet/global-functions/core-functions.php
  2. 157
      wp-content/themes/cosmopet/global-functions/multisite-functions.php
  3. 24
      wp-content/themes/cosmopet/modules/forms/assets/js/form.js
  4. 11
      wp-content/themes/cosmopet/modules/forms/module-ajax-controller.php
  5. 57
      wp-content/themes/cosmopet/modules/layout/assets/css/gp-style-core.css
  6. 2
      wp-content/themes/cosmopet/modules/layout/assets/css/gp-style-normalize.css
  7. 1
      wp-content/themes/cosmopet/modules/layout/module-controller.php
  8. 8
      wp-content/themes/cosmopet/modules/popup/assets/js/modal.js
  9. 16
      wp-content/themes/cosmopet/modules/shop/components/single-product/assets/css/gp-style-core.css
  10. 12
      wp-content/themes/cosmopet/modules/shop/components/single-product/assets/css/gp-style-desktop.css
  11. 4
      wp-content/themes/cosmopet/modules/shop/components/single-product/assets/css/gp-style-tablet.css
  12. 55
      wp-content/themes/cosmopet/modules/shop/components/single-product/component-controller.php
  13. 50
      wp-content/themes/cosmopet/single-product.php
  14. 39
      wp-content/themes/cosmopet/templates/_blocks/shop/archive-product-tease.twig
  15. 1071
      wp-content/themes/cosmopet/templates/_pages/shop/product-single.twig
  16. 47
      wp-content/themes/cosmopet/templates/modal.twig
  17. 48
      wp-content/themes/cosmopet/templates/modal/to_know.twig
  18. 1
      wp-content/themes/cosmopet/templates/shop/index.php
  19. 63
      wp-content/themes/cosmopet/templates/shop/single-product.php
  20. 40
      wp-content/themes/cosmopet/woocommerce/assets/css/gp-style-core.css
  21. 1
      wp-content/themes/cosmopet/woocommerce/assets/css/gp-style-desktop.css
  22. 19
      wp-content/themes/cosmopet/woocommerce/single-product.php

@ -167,96 +167,97 @@ if($site_env->site_mode == 'production' and $site_env->site_region == 'ae') {
currency: currency
});
// Событие для Google Analytics
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'add_to_cart',
'ecommerce': {
'currency': currency,
'value': parseFloat(priceElement) * quantity,
'items': [{
'item_id': productId,
'item_name': productName,
'price': parseFloat(priceElement),
'quantity': quantity
}]
}
});
// Событие для Google Analytics
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'add_to_cart',
'ecommerce': {
'currency': currency,
'value': parseFloat(priceElement) * quantity,
'items': [{
'item_id': productId,
'item_name': productName,
'price': parseFloat(priceElement),
'quantity': quantity
}]
}
});
});
});
</script>
<?php
});
</script>
<?php
}
// 2. Событие Purchase (Покупка)
if (is_wc_endpoint_url('order-received')) {
$order_id = absint(get_query_var('order-received'));
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order || ($order->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()
];
}
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
fbq('track', 'Purchase', {
value: <?php echo $order->get_total(); ?>,
currency: '<?php echo $order->get_currency(); ?>',
content_ids: [<?php echo implode(',', array_column($items, 'item_id')); ?>],
content_type: 'product'
});
// 2. Событие Purchase (Покупка)
if (is_wc_endpoint_url('order-received')) {
$order_id = absint(get_query_var('order-received'));
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order || ($order->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()
];
}
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
fbq('track', 'Purchase', {
value: <?php echo $order->get_total(); ?>,
currency: '<?php echo $order->get_currency(); ?>',
content_ids: [<?php echo implode(',', array_column($items, 'item_id')); ?>],
content_type: 'product'
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'purchase',
'ecommerce': {
'currency': '<?php echo $order->get_currency(); ?>',
'value': <?php echo $order->get_total(); ?>,
'items': <?php echo json_encode($items); ?>
}
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'purchase',
'ecommerce': {
'currency': '<?php echo $order->get_currency(); ?>',
'value': <?php echo $order->get_total(); ?>,
'items': <?php echo json_encode($items); ?>
}
});
</script>
<?php
}
});
</script>
<?php
}
// 3. Событие AddPaymentInfo
if (is_checkout() && !is_wc_endpoint_url('order-received')) {
$currency = get_woocommerce_currency();
$cart_total = WC()->cart ? WC()->cart->get_total('edit') : 0;
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
fbq('track', 'AddPaymentInfo', {
value: <?php echo $cart_total; ?>,
currency: '<?php echo $currency; ?>'
});
// 3. Событие AddPaymentInfo
if (is_checkout() && !is_wc_endpoint_url('order-received')) {
$currency = get_woocommerce_currency();
$cart_total = WC()->cart ? WC()->cart->get_total('edit') : 0;
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
fbq('track', 'AddPaymentInfo', {
value: <?php echo $cart_total; ?>,
currency: '<?php echo $currency; ?>'
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'add_payment_info',
'ecommerce': {
'currency': '<?php echo $currency; ?>',
'value': <?php echo $cart_total; ?>
}
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'add_payment_info',
'ecommerce': {
'currency': '<?php echo $currency; ?>',
'value': <?php echo $cart_total; ?>
}
});
</script>
<?php
}
});
</script>
<?php
}
}
}
// Отключаем кэширование для страниц товаров
add_action('template_redirect', function() {
if (is_product()) {

@ -73,6 +73,28 @@ jQuery(document).ready(function($) {
});
}
});
$('.modal__form-sub').on('submit', function (e) {
e.preventDefault();
var email = $(this).find('input[name="email"]').val()
var data = $(this).serialize()
$.ajax({
type: 'post',
url: woocommerce_params.ajax_url,
data: data,
beforeSend: function (response) {
},
complete: function (response) {
$('.modal__to-know').removeClass('active')
$('#sub-result-email').html(email)
$('.modal__to-know-submit').addClass('active').css('filter', 'blur(0px)')
},
success: function (response) {
},
});
});
});
const metaLocale = document.querySelector('meta[property="og:locale"]');
@ -141,3 +163,5 @@ const localeValue = metaLocale.getAttribute('content');
errorMessage.remove();
});
}

@ -23,6 +23,17 @@ add_action('wp_ajax_nopriv_subscribe_form', function() {
});
add_action('wp_ajax_to_know_form', function() {
$enabledHandlers = ['b24'];
process_form($enabledHandlers);
});
add_action('wp_ajax_nopriv_to_know_form', function() {
$enabledHandlers = ['b24'];
process_form($enabledHandlers);
});
function process_form($enabledHandlers) {
$formData = $_POST['formData'];
$handler = FormHandlerFactory::getHandler($enabledHandlers);

@ -578,34 +578,6 @@ textarea{
.button--red-48-px{
border-radius: 48px;
}
.to-know{
width: 100%;
padding: 12px;
display: flex;
justify-content: center;
border: none;
transition: opacity .2s ease-out;
}
.to-know:hover{
opacity: .8;
}
.to-know p{
padding-bottom: 4px;
font-family: var(--font-family);
font-weight: 700;
font-size: 20px;
line-height: 120%;
color: var(--text-black);
border-bottom: 1px var(--text-black) solid;
cursor: pointer;
}
.to-know--background-none{
background: none;
}
@ -1352,7 +1324,7 @@ textarea{
.checkbox.active .checkbox__state{
background-color: var(--background-black);
background-image: url(../img/svg/main/arrow-selected-white.svg);
background-image: url(../../../../static/img/svg/main/arrow-selected-white.svg);
background-repeat: no-repeat;
background-position: center;
}
@ -1699,35 +1671,8 @@ textarea{
.button--red-48-px{
border-radius: 48px;
}
.to-know{
/* width: 100%; */
padding: 12px 24px 7px 24px;
display: flex;
justify-content: center;
border: none;
transition: opacity .2s ease-out;
text-decoration: none;
}
.to-know:hover{
opacity: .8;
}
.to-know p{
padding-bottom: 4px;
font-family: var(--font-family);
font-weight: 700;
font-size: 20px;
line-height: 120%;
color: var(--text-black);
border-bottom: 1px var(--text-black) solid;
cursor: pointer;
}
.to-know--background-none{
background: none;
}

@ -68,7 +68,7 @@ input[type=number]::-webkit-outer-spin-button {
}
main.wrapper{
padding-top: 40px;
padding-top: 70px;
}
.checkout-inline-error-message{

@ -10,4 +10,5 @@ include_module('header');
include_component('shop', 'cart');
include_module('shop');
include_module('popup');
include_module('forms');
include_module('footer');

@ -92,5 +92,9 @@ window.addEventListener('resize', () => {
modalOpen('.basket-open', '.modal__basket');
modalOpen('.open-to-know', '.modal__to-know');
modalOpen('.login-open', '.modal__login');
modalClose('.modal__close');
});
modalClose('.modal__close, .m__close');
});
jQuery('[data-pname]').on('click', function(){
jQuery('#sub_product_name').val(jQuery(this).data('pname'))
})

@ -951,6 +951,7 @@ button{
display: flex;
align-items: start;
flex-wrap: wrap;
}
.compound__item{
margin: 5px;
@ -1083,18 +1084,17 @@ button{
}
.to-know{
/* width: 100%; */
padding: 12px 24px 7px 24px;
display: flex;
justify-content: center;
border: none;
transition: opacity .2s ease-out;
text-decoration: none;
text-transform: uppercase;
}
.product__item .to-know{
margin-right: auto;
margin-left: auto;
width: auto;
display: flex;
}
.to-know--start{
justify-content: start;
padding-left: 0;

@ -553,7 +553,6 @@ main{
font-size: 20px;
line-height: 200%;
text-transform: uppercase;
color: var(--text-black);
}
.product-item__price p::after{
@ -593,8 +592,8 @@ main{
.product__item.hiding .product-item__images{
filter: grayscale(1)
}
.product__item.hiding .product-item__price{
color: var(--text-grey);
.product__item.hiding .product-item__price p{
color: #999;
}
.product-item__overlay{
position: absolute;
@ -843,6 +842,7 @@ main{
}
.detail__image--width-perc-100{
width: calc(100% - 24px);
height: 600px;
}
@ -1061,6 +1061,12 @@ main{
.detail__catalot .product__item{
width: calc(100% - 24px);
}
@media (max-width: 640px) {
.detail__catalot .product__item{
width: calc(100%);
}
}
.detail__images-phone{
display: none;
}

@ -1,5 +1,9 @@
/* Стили для планшетов */
@media only screen and (max-width: 1200px) {
.product__main{
margin: 36px 0 0;
}
/* header */
main{
padding-top: 64px;

@ -1,11 +1,6 @@
<?php
// add_filter('timber/context', function($context) {
// $context['test'] = 111111111;
// return $context;
// });
// $product->is_type('variable')
$product;
$product_type;
$context_for_twig;
@ -103,3 +98,53 @@ add_filter('timber/context', function ($context) use ($context_for_twig) {
return array_merge($context, $context_for_twig);
});
$context = Timber::get_context();
$post = Timber::get_post();
$context['post'] = $post;
$context['wc_breadcrumbs'] = array();
if (function_exists('woocommerce_breadcrumb')) {
$args = array(
'delimiter' => '',
'wrap_before' => '',
'wrap_after' => '',
'before' => '',
'after' => '',
'home' => _x('Home', 'breadcrumb', 'woocommerce'),
);
$breadcrumbs = new WC_Breadcrumb();
$breadcrumbs->generate();
$formatted_breadcrumbs = array();
foreach ($breadcrumbs->get_breadcrumb() as $crumb) {
$formatted_breadcrumbs[] = array(
'text' => $crumb[0],
'url' => $crumb[1]
);
}
$context['wc_breadcrumbs'] = $formatted_breadcrumbs;
}
$product_id = get_the_ID();
$product = wc_get_product($product_id);
$context['product'] = $product;
$context['related_products'] = array();
$related_products_ids = wc_get_related_products($product_id, 5);
if ($related_products_ids) {
foreach ($related_products_ids as $related_id) {
$related_product = wc_get_product($related_id);
if ($related_product) {
$context['related_products'][] = $related_product;
}
}
}
Timber::render('_pages/shop/product-single.twig', $context);

@ -8,53 +8,5 @@ if (is_product()) {
include_module('shop');
include_component('shop', 'single-product');
$context = Timber::get_context();
$post = Timber::get_post();
$context['post'] = $post;
$context['wc_breadcrumbs'] = array();
if (function_exists('woocommerce_breadcrumb')) {
$args = array(
'delimiter' => '',
'wrap_before' => '',
'wrap_after' => '',
'before' => '',
'after' => '',
'home' => _x('Home', 'breadcrumb', 'woocommerce'),
);
$breadcrumbs = new WC_Breadcrumb();
$breadcrumbs->generate();
$formatted_breadcrumbs = array();
foreach ($breadcrumbs->get_breadcrumb() as $crumb) {
$formatted_breadcrumbs[] = array(
'text' => $crumb[0],
'url' => $crumb[1]
);
}
$context['wc_breadcrumbs'] = $formatted_breadcrumbs;
}
$product_id = get_the_ID();
$product = wc_get_product($product_id);
$context['product'] = $product;
$context['related_products'] = array();
$related_products_ids = wc_get_related_products($product_id, 5);
if ($related_products_ids) {
foreach ($related_products_ids as $related_id) {
$related_product = wc_get_product($related_id);
if ($related_product) {
$context['related_products'][] = $related_product;
}
}
}
Timber::render('modules/shop/components/single-product/component-template.twig', $context);
}

@ -2,8 +2,9 @@
{% 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">
{% set stock_status = post.meta('_stock_status') == 'instock' %}
<div class="product__item {% if not stock_status == 'instock' %}hiding{% endif %}">
<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">
@ -22,18 +23,46 @@
</a>
<div class="product-item__content-card">
<div class="compound">
{% set for_whom = fn('wc_get_product_terms', post.id, 'pa_for-whom') %}
{% for option in for_whom %}
{% set term = get_term(option) %}
<a href="/for-whom/{{ term.slug }}" class="compound__item">{{ term.name }}</a>
{% endfor %}
{% 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 %}
{% set package_weight = fn('wc_get_product_terms', post.id, 'pa_package-weight') %}
{% for option in package_weight %}
{% set term = get_term(option) %}
<a href="/package-weight/{{ term.slug }}" class="compound__item">{{ term.name }}</a>
{% endfor %}
{% set features = fn('wc_get_product_terms', post.id, 'pa_features') %}
{% for option in features %}
{% set term = get_term(option) %}
<a href="/features/{{ 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>
<p>{{ post._price() }} {{ fn('get_woocommerce_currency_symbol') }}</p>
{% if post._regular_price() and post._regular_price() > post._price() %}
<div class="product-item__price-disc">
<p class="product-item__price-sale__text">
{{ post._regular_price() }} {{ fn('get_woocommerce_currency_symbol') }}
</p>
<p class="product-item__price-sale__perc">
- {{ ((1 - post._price() / post._regular_price()) * 100)|round(0, 'floor') }} %
</p>
</div>
{% endif %}
</div>
{% set stock_status = post.meta('_stock_status') == 'instock' %}
{% if stock_status == 'instock' %}
<div class="product-item__bye">
<button class="button button--white button--100-perc open-overlay">

@ -16,52 +16,7 @@
{% include 'modal/basket.twig' %}
<div class="modal__item modal__to-know modal__item--no-title">
<button class="modal__close">
<img src="/wp-content/themes/cosmopet/static/img/svg/main/black-x.svg" alt="">
</button>
<div class="modal__header">
<p class="modal__small-title">{{ fn ('pll_e', 'Узнать о поступлении') }}</p>
<p class="modal__text">
{{ fn ('pll_e', 'Оставьте свой e-mail, и мы оповестим вас, когда продукт появится') }}
</p>
<form action="" class="modal__form-sub">
<div class="label">
<label for="mail" class="label__title">
{{ fn ('pll_e', 'mail') }}
</label>
</div>
<input type="text" class="form__input" id="mail" placeholder="Email">
<div class="checkbox checkbox--small">
<div class="checkbox__state"></div>
<input type="checkbox" name="" id="" class="checkbox__input">
<label for="" class="checkbox__label">
{{ fn ('pll_e', 'Я ознакомился с <a href="#">политикой обработки персональных данных</a> и <a href="#">пользовательским соглашением') }}</a>
</label>
</div>
<input type="submit" value="Оставить почту" class="button button--white button--red-48-px button--100-perc active modal-form-sub__submit">
</form>
</div>
</div>
<div class="modal__item modal__to-know-submit modal__item--no-title">
<button class="modal__close">
<img src="/wp-content/themes/cosmopet/static/img/svg/main/black-x.svg" alt="">
</button>
<div class="modal__header">
<p class="modal__small-title">{{ fn ('pll_e', 'Подписка на товар оформлена') }}</p>
<p class="modal__text">
{{ fn ('pll_e', 'На ваш e-mail <span id="email_current"></span> придет письмо, как только продукт появится в наличии.') }}
</p>
<button class="button button--white button--red-48-px button--100-perc active modal-form-sub__submit">
{{ fn ('pll_e', 'Продолжить покупки') }}
</button>
</div>
</div>
{% include 'modal/to_know.twig' %}
{% include 'modal/login.twig' %}
</aside>

@ -0,0 +1,48 @@
<div class="modal__item modal__to-know modal__item--no-title">
<button class="modal__close">
<img src="/wp-content/themes/cosmopet/static/img/svg/main/black-x.svg" alt="">
</button>
<div class="modal__header">
<p class="modal__small-title">{{ fn ('pll_e', 'Узнать о поступлении') }}</p>
<p class="modal__text">
{{ fn ('pll_e', 'Оставьте свой e-mail, и мы оповестим вас, когда продукт появится') }}
</p>
<form action="" class="modal__form-sub">
<div class="label">
<label for="mail" class="label__title">
{{ fn ('pll_e', 'mail') }}
</label>
</div>
<input type="hidden" name="sub_product" value="" id="sub_product_name">
<input type="hidden" name="action" value="to_know_form">
<input type="text" class="form__input" id="mail" placeholder="Email">
<div class="checkbox checkbox--small active">
<div class="checkbox__state"></div>
<input type="checkbox" name="" checked id="" class="checkbox__input">
<label for="" class="checkbox__label">
{{ fn ('pll_e', 'Я ознакомился с <a href="#">политикой обработки персональных данных</a> и <a href="#">пользовательским соглашением') }}</a>
</label>
</div>
<input type="submit" value="Оставить почту" class="button button--white button--red-48-px button--100-perc active modal-form-sub__submit">
</form>
</div>
</div>
<div class="modal__item modal__to-know-submit modal__item--no-title">
<button class="modal__close">
<img src="/wp-content/themes/cosmopet/static/img/svg/main/black-x.svg" alt="">
</button>
<div class="modal__header">
<p class="modal__small-title">{{ fn ('pll_e', 'Подписка на товар оформлена') }}</p>
<p class="modal__text">
{{ fn ('pll_e', 'На ваш e-mail <span id="email_current"></span> придет письмо, как только продукт появится в наличии.') }}
</p>
<button class="button button--white button--red-48-px button--100-perc active modal-form-sub__submit m__close">
{{ fn ('pll_e', 'Продолжить покупки') }}
</button>
</div>
</div>

@ -1,63 +0,0 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if (is_product()) {
include_module('shop');
include_component('shop', 'single-product');
$context = Timber::get_context();
$post = Timber::get_post();
$context['post'] = $post;
$context['wc_breadcrumbs'] = array();
if (function_exists('woocommerce_breadcrumb')) {
$args = array(
'delimiter' => '',
'wrap_before' => '',
'wrap_after' => '',
'before' => '',
'after' => '',
'home' => _x('Home', 'breadcrumb', 'woocommerce'),
);
$breadcrumbs = new WC_Breadcrumb();
$breadcrumbs->generate();
$formatted_breadcrumbs = array();
foreach ($breadcrumbs->get_breadcrumb() as $crumb) {
$formatted_breadcrumbs[] = array(
'text' => $crumb[0],
'url' => $crumb[1]
);
}
$context['wc_breadcrumbs'] = $formatted_breadcrumbs;
}
$product_id = get_the_ID();
$product = wc_get_product($product_id);
$context['product'] = $product;
$context['related_products'] = array();
$related_products_ids = wc_get_related_products($product_id, 5);
if ($related_products_ids) {
foreach ($related_products_ids as $related_id) {
$related_product = wc_get_product($related_id);
if ($related_product) {
$context['related_products'][] = $related_product;
}
}
}
Timber::render('modules/shop/components/single-product/component-template.twig', $context);
}

@ -876,8 +876,7 @@ button{
width: 16px;
aspect-ratio: 1;
background-image: url(../img/svg/main/arrow-selected-white.svg);
background-image: url(../../static/img/svg/main/arrow-selected-white.svg);
background-repeat: no-repeat;
background-position: center;
}
@ -1258,7 +1257,7 @@ button{
.wpfFilterContent ul li input[type="checkbox"]:checked {
background-color: var(--background-black);
background-image: url(../img/svg/main/arrow-selected-white.svg);
background-image: url(../../static/img/svg/main/arrow-selected-white.svg);
background-repeat: no-repeat;
background-position: center;
}
@ -1305,4 +1304,39 @@ button{
background: none;
}
.compound{
flex-wrap: wrap;
}
.product__item.hiding .product-item__price p {
color: #999;
}
.product-item__price-disc, .product-item__price {
display: flex;
align-items: center;
gap: 20px;
}
.product-item__price-disc, .product-item__price{
display: flex;
align-items: center;
gap: 20px;
}
.product-item__price-sale__perc{
font-size: 20px;
text-transform: uppercase;
color: #FA0505;
}
.product-item__price-sale__text {
text-decoration: line-through;
color: #999999;
font-size: 18px;
}
.product-item__price-sale__perc::after{
display: none;
}

@ -545,7 +545,6 @@ main{
font-size: 20px;
line-height: 200%;
text-transform: uppercase;
color: var(--text-black);
}
/* .product-item__price p::after{
content: '₽';

@ -1,19 +0,0 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
get_header();
$template_path = 'templates/shop/single-product.php';
if (file_exists(get_template_directory() . '/' . $template_path)) {
include_once get_template_directory() . '/' . $template_path;
} else {
while (have_posts()) : the_post();
wc_get_template_part('content', 'single-product');
endwhile;
}
get_footer();
Loading…
Cancel
Save