Feat | profile add subscriptions pages

Co-authored-by: Your Name <you@example.com>
Reviewed-on: #27
pull/28/head
Andrei-10 3 months ago
parent 2891d78fd2
commit 7a78ffbbff
  1. 121
      wp-content/themes/cosmopet/functions.php
  2. 1615
      wp-content/themes/cosmopet/global-functions/multilang-functions.php
  3. 19
      wp-content/themes/cosmopet/global-functions/multisite-functions.php
  4. 4
      wp-content/themes/cosmopet/modules/footer/assets/css/gp-style-desktop.css
  5. 2
      wp-content/themes/cosmopet/modules/footer/module-controller.php
  6. 11
      wp-content/themes/cosmopet/modules/layout/assets/css/gp-style-core.css
  7. 67
      wp-content/themes/cosmopet/modules/layout/assets/js/gp-cabinet.js
  8. 158
      wp-content/themes/cosmopet/modules/profile/assets/css/profile.css
  9. 305
      wp-content/themes/cosmopet/modules/profile/assets/js/profile.js
  10. 7
      wp-content/themes/cosmopet/modules/profile/components/profile/component-controller.php
  11. 143
      wp-content/themes/cosmopet/modules/profile/components/subscription_single/component-controller.php
  12. 107
      wp-content/themes/cosmopet/modules/profile/components/subscriptions/component-controller.php
  13. 1
      wp-content/themes/cosmopet/modules/profile/module-ajax-controller.php
  14. 1
      wp-content/themes/cosmopet/modules/profile/module-controller.php
  15. 329
      wp-content/themes/cosmopet/modules/shop/components/cart/assets/js/cart.js
  16. 4
      wp-content/themes/cosmopet/modules/shop/components/single-product/component-template.twig
  17. 17
      wp-content/themes/cosmopet/page.php
  18. 55
      wp-content/themes/cosmopet/static/assets/js/telegram-auth.js
  19. 4
      wp-content/themes/cosmopet/static/front-page/css/style.css
  20. BIN
      wp-content/themes/cosmopet/static/img/pet/mini-cat.png
  21. 11
      wp-content/themes/cosmopet/templates/front-page/front-page.twig
  22. 2
      wp-content/themes/cosmopet/templates/pet-card.twig
  23. 611
      wp-content/themes/cosmopet/templates/profile/profile-base.twig
  24. 106
      wp-content/themes/cosmopet/templates/profile/profile-orders.twig
  25. 133
      wp-content/themes/cosmopet/templates/profile/profile-subs-single.twig
  26. 78
      wp-content/themes/cosmopet/templates/profile/profile-subs.twig
  27. 432
      wp-content/themes/cosmopet/templates/profile/profile.twig
  28. 16
      wp-content/themes/cosmopet/templates/shop/bestsellers.twig
  29. 4
      wp-content/themes/cosmopet/woocommerce/archive-product/archive-product.twig
  30. 0
      wp-content/themes/cosmopet/woocommerce/myaccount/my-subscriptions.php

@ -1195,25 +1195,7 @@ function remove_woocommerce_styles_on_checkout() {
}
}
// Отключаем канонические ссылки и 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 '<link rel="canonical" href="' . esc_url($current_url) . '" />' . "\n";
}
// Добавляем hreflang теги для cosmopet.shop
add_action('wp_head', 'custom_hreflang_shop', 6);
@ -1233,3 +1215,106 @@ function custom_hreflang_shop() {
echo '<link rel="alternate" hreflang="en-AE" href="' . esc_url($en_domain . $current_path) . '" />' . "\n";
}
add_action('wp_head', 'custom_checkout_padding');
function custom_checkout_padding() {
// Проверяем, что это страница Checkout
if (is_checkout() && !is_admin()) {
?>
<style type="text/css">
main.wrapper {
padding-top: 100px;
padding-bottom: 50px;
}
</style>
<?php
}
}
// Отправка кода и проверка Email
add_action( 'wp_ajax_email_activate', 'send_activation_email' );
add_action( 'wp_ajax_nopriv_email_activate', 'send_activation_email' );
function send_activation_email() {
error_log(123);
$user = wp_get_current_user();
$activation_key = sha1($user->user_email . time()); // Generate a unique activation key
update_field('uuid', $activation_key, 'user_' . get_current_user_id()); // Save the key in user meta
$activation_link = home_url("/activate/$activation_key");
if(pll_current_language() === 'ru'){
$subject = "Активация аккаунта COSMOPET -".$string;
$message = " Остался последний шаг!\n
Пройдите по ссылке для активации аккаунта:\n
".$activation_link;
} else {
$subject = "Account activation COSMOPET -".$string;
$message = "Last step!\n
Follow the link to activate your account\n
".$activation_link;
}
wp_mail($user->user_email, $subject, $message);
}
add_action('init', 'custom_register_activation_endpoint');
function custom_register_activation_endpoint() {
add_rewrite_rule('^activate/([^/]*)/?', 'index.php?activation_key=$matches[1]', 'top');
add_rewrite_tag('%activation_key%', '([^&]+)');
}
add_action('template_redirect', 'custom_handle_activation_request');
add_action('template_redirect', 'custom_handle_activation_request');
function get_user_by_acf_field_value($field_value) {
// Prepare the arguments for WP_User_Query
$args = array(
'meta_query' => array(
array(
'key' => 'uuid', // Change to your ACF field key
'value' => $field_value,
'compare' => '=', // You can use other comparison operators if needed
),
),
);
// Execute the query
$user_query = new WP_User_Query($args);
// Check for results
if (!empty($user_query->get_results())) {
return $user_query->get_results(); // Returns an array of WP_User objects
} else {
return null; // No users found
}
}
function custom_handle_activation_request() {
if (get_query_var('activation_key')) {
$activation_key = sanitize_text_field(get_query_var('activation_key'));
$users = get_user_by_acf_field_value($activation_key);
if ($users) {
foreach ($users as $user) {
$user->set_bio();
// delete_user_meta($user->ID, 'uuid'); // Clean up the activation key
update_field('uuid', '', 'user_' . $user->ID);
update_field('activated', true, 'user_' . $user->ID);
wp_set_auth_cookie($user->ID);
wp_redirect('/my-account/'); // Redirect to the homepage or a custom page
var_dump($user);
exit;
}
}
}
}

@ -19,3 +19,22 @@ add_filter('timber/context', function($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 '<link rel="canonical" href="' . esc_url($current_url) . '" />' . "\n";
}

@ -200,3 +200,7 @@
width: 32px;
aspect-ratio: 1;
}
.login_btn {
margin-bottom: 24px;
}

@ -9,7 +9,7 @@ add_filter('timber/context', function($context) {
return $context;
});
define('BOT_USERNAME', 'cosmopetbot_bot');
define('BOT_USERNAME', 'cosmopet_test_AE_bot');
function getTelegramUserData() {

@ -2062,3 +2062,14 @@ textarea{
.wc-block-checkout__form.wc-block-components-form .wc-blocks-components-select .wc-blocks-components-select__select{
border-radius: 10px;
}
.mt-m-3{
margin-top: -3rem;
}
@media (max-width: 768px) {
.mt-m-3{
margin-top: 1rem;
}
}

@ -1,67 +0,0 @@
// 'use strict';
// import * as fun from './_gp-function.js';
// let widthPhoneCabinet = 1200;
// fun.toggleOpenX('.cabinet-card__order', '.cabinet-card-order__open-detail', '.cabinet-card-order__detail', '.cabinet-card-order__block-detail');
// fun.modalFormOpen('.form-open');
// fun.closeModalForm('.modal-form__close');
// fun.closeModalForm('.modal-form__button-close');
// controlCabinet('.cabinet-control__button', '.cabinet', widthPhoneCabinet);
// function controlCabinet(buttons, main, minWidth){
// let thisWidth = window.innerWidth;
// let thisMain = document.querySelector(main);
// let thisButtons = document.querySelectorAll(buttons);
// thisButtons.forEach(e => {
// e.onclick = function (element){
// let thisContent = document.querySelector(`.cabinet__${e.dataset.cabinet}`);
// let newHeight = thisContent.clientHeight + 48;
// let thisButton = element.target;
// thisMain.style.height = `${newHeight}px`
// if (!thisContent.classList.contains('active')) {
// thisMain.querySelector('.active').classList.remove('active');
// thisContent.classList.add('active');
// setTimeout(() => {
// thisMain.style.height = 'auto';
// if (thisMain.querySelector('.hide')) {
// thisMain.querySelector('.hide').classList.remove('hide');
// }
// thisMain.querySelector('.active').classList.add('hide');
// }, 200);
// }
// thisButtons.forEach(e => {
// e.classList.remove('active');
// })
// thisButton.classList.add('active');
// }
// })
// }
// let modal = document.querySelector('.modal');
// modal.onclick = function (eventModal) {
// let thisTarget = eventModal.target;
// if (thisTarget.classList.contains('modal')) {
// thisTarget.classList.remove('active');
// if (!thisTarget.querySelector('.modal-map.active')) {
// thisTarget.querySelector('.modal-form.active').classList.remove('active');
// }else{
// thisTarget.querySelector('.modal-map.active').classList.remove('active');
// }
// }
// }

@ -8,7 +8,6 @@ justify-content: space-between;
.cabinet__control{
margin: 24px;
margin-bottom: 0;
display: none;
}
.cabinet-control__button{
@ -741,7 +740,7 @@ padding-left: 0 !important;
bottom: 48px;
}
.cabinet-card-order-detail-short__item{
margin-left: -27px;
margin-left: 10px;
}
.cabinet-card-order-detail-short__item:first-child{
margin-left: 0;
@ -3085,4 +3084,157 @@ padding-left: 5px;
position: relative;
top: 112px;
z-index: 100;
}
}
.cabinet__control--column {
flex-direction: column;
}
.form-input__tabs--white{
padding: 3px;
border: 1px solid var(--text-3);
background: var(--white);
width: 100%;
}
.form-input__tabs--white .form-input-tabs__button.active{
background: var(--gradient-turquoise);
}
.form-input-tabs__button {
width: 100%;
padding: 10px;
font-family: var(--font-family);
font-weight: 400;
font-size: 20px;
line-height: 120%;
color: var(--text-black);
text-align: center;
border-radius: 18px;
z-index: 2;
transition: background-color .2s ease-out;
}
@media (max-width: 1200px) {
.cabinet__profile .form-input__tabs{
display: none;
}
}
.subscription{
margin-top: 12px;
}
.subscription__item{
padding: 12px 0;
display: flex;
justify-content: space-between;
border-bottom: 1px solid #999;
}
.subscription__item{
font-size: 20px;
}
.subscription__add{
color: var(--text-black);
}
.subscription__add-header{
}
.subscription__add-title{
font-size: 24px;
}
.subscription__add-content{
padding: 24px 0 12px 0;
}
.subscription__add-product{
align-items: start;
}
.subscription__add-product > *:nth-child(3){
margin-left: auto;
align-items: center;
}
.subscription__add .cabinet-card-order-detail-main-product-description__what {
font-size: 16px;
line-height: 125%;
}
.subscription__add .cabinet-card-order-detail-main-product-description__with-what {
font-weight: 500;
font-size: 16px;
}
.subscription__add .cabinet-card-order-detail-main-product__count{
font-weight: 700;
font-size: 16px;
line-height: 100%;
}
.subscription__add .cabinet-card-order-detail-main-product__price{
font-weight: 500;
font-size: 20px;
line-height: 120%;
}
.subscription__add{
width: 100%;
}
@media only screen and (max-width: 720px) {
.subscription__item{
flex-direction: column;
}
.subscription__item > p:first-child{
font-size: 16px;
color: var(--text-6);
}
.subscription__item > p:last-child{
margin-top: 6px;
}
.subscription__add-title {
font-size: 20px;
}
.subscription__add-product{
flex-wrap: wrap;
}
.subscription__add-product > *:not(:first-child){
padding-top: 0;
}
.subscription__add-product .cabinet-card-order-detail-main-product__img{
width: 73px;
height: 66px;
}
.subscription__add-product .cabinet-card-order-detail-main-product-description__what{
font-size: 12px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.subscription__add-product .cabinet-card-order-detail-main-product-description__with-what{
margin-top: 8px;
font-size: 12px;
}
.subscription__add-product .cabinet-card-order-detail-main-product__description {
width: calc(100% - 73px);
}
.subscription__add-product .cabinet-card-order-detail-main-product__content{
position: static;
margin-top: -10px;
margin-left: auto;
width: calc(100% - 73px);
display: flex;
justify-content: space-between;
align-items: center;
}
.subscription__add-product .cabinet-card-order-detail-main-product__count{
position: static;
font-size: 12px;
}
.subscription__add-product .cabinet-card-order-detail-main-product__price{
position: static;
font-size: 16px;
}
}

@ -4,141 +4,6 @@
let widthPhoneCabinet = 1200;
toggleOpenX('.cabinet-card__order', '.cabinet-card-order__open-detail', '.cabinet-card-order__detail', '.cabinet-card-order__block-detail');
// modalFormOpen('.form-open');
// closeModalForm('.modal-form__close');
// closeModalForm('.modal-form__button-close');
controlCabinet('.cabinet-control__button', '.cabinet', widthPhoneCabinet);
function controlCabinet(buttons, main, minWidth){
let thisWidth = window.innerWidth;
let thisMain = document.querySelector(main);
let thisButtons = document.querySelectorAll(buttons);
thisButtons.forEach(e => {
e.onclick = function (element){
let thisContent = document.querySelector(`.cabinet__${e.dataset.cabinet}`);
let newHeight = thisContent.clientHeight + 48;
let thisButton = element.target;
thisMain.style.height = `${newHeight}px`
if (!thisContent.classList.contains('active')) {
thisMain.querySelector('.active').classList.remove('active');
thisContent.classList.add('active');
setTimeout(() => {
thisMain.style.height = 'auto';
if (thisMain.querySelector('.hide')) {
thisMain.querySelector('.hide').classList.remove('hide');
}
thisMain.querySelector('.active').classList.add('hide');
}, 200);
}
thisButtons.forEach(e => {
e.classList.remove('active');
})
thisButton.classList.add('active');
}
})
}
// let modal = document.querySelector('.modal');
// modal.onclick = function (eventModal) {
// let thisTarget = eventModal.target;
// if (thisTarget.classList.contains('modal')) {
// thisTarget.classList.remove('active');
// if (!thisTarget.querySelector('.modal-map.active')) {
// thisTarget.querySelector('.modal-form.active').classList.remove('active');
// }else{
// thisTarget.querySelector('.modal-map.active').classList.remove('active');
// }
// }
// }
// function modalOpen(buttonElement, contentElement){
// let modal = document.querySelector('.modal'),
// aside = document.querySelector('.modal__aside'),
// elements = document.querySelectorAll(buttonElement),
// device = window.screen.width;
// elements.forEach(e => {
// let thisContentElement = document.querySelector(contentElement);
// e.onclick = function () {
// modal.classList.add('active');
// thisContentElement.classList.add('active');
// let width = thisContentElement.clientWidth;
// setTimeout(() => {
// if (device <= 720) {
// aside.style.width = `${device}px`;
// thisContentElement.style.opacity = 1;
// thisContentElement.style.filter = 'blur(0px)';
// }else{
// aside.style.width = `${width}px`;
// thisContentElement.style.opacity = 1;
// thisContentElement.style.filter = 'blur(0px)';
// }
// }, 10);
// }
// })
// }
// function modalClose(buttonElement) {
// let modal = document.querySelector('.modal'),
// aside = document.querySelector('.modal__aside'),
// asideItems = document.querySelectorAll('.modal__item'),
// elements = document.querySelectorAll(buttonElement);
// elements.forEach(e => {
// e.onclick = function () {
// aside.style.width = '0px';
// asideItems.forEach(e => {
// if (e.classList.contains('active')) {
// e.style.filter = 'blur(10px)';
// }
// });
// setTimeout(() => {
// asideItems.forEach(e => {
// if (e.classList.contains('active')) {
// e.classList.remove('active');
// }
// });
// modal.classList.remove('active');
// }, 300);
// }
// })
// }
// function closeModalForm(close){
// let buttons = document.querySelectorAll(close),
// modal = document.querySelector('.modal');
// buttons.forEach(button => {
// button.onclick = function (buttonEvent) {
// modal.classList.remove('active');
// if (!modal.querySelector('.modal-map.active')) {
// modal.querySelector('.modal-form.active').classList.remove('active');
// }else{
// modal.querySelector('.modal-map.active').classList.remove('active');
// }
// }
// })
// }
function toggleOpenX(mainElement, buttonElement ,heightElement, contentElement, close) {
let elements = document.querySelectorAll(mainElement);
@ -148,8 +13,8 @@ function toggleOpenX(mainElement, buttonElement ,heightElement, contentElement,
thisButtonElement = e.querySelector(buttonElement),
thisHeightElement = e.querySelector(heightElement),
thisContentElement = e.querySelector(contentElement);
thisButtonElement.onclick = function (e) {
if (thisButtonElement){
thisButtonElement.onclick = function (e) {
let height = thisHeightElement.clientHeight;
if (close == true && !thisMainElement.classList.contains('active')) {
@ -169,137 +34,12 @@ function toggleOpenX(mainElement, buttonElement ,heightElement, contentElement,
thisMainElement.classList.remove('active');
}
}
}
});
}
// function toggleHeader(button, content, blockheight, removeBlock, removeClass) {
// let thisButton = document.querySelector(button),
// thisContent = document.querySelector(content),
// thisRemoveBlock = document.querySelector(removeBlock) || '',
// thisBlockheight = document.querySelector(blockheight);
// thisButton.onclick = function () {
// let height = thisBlockheight.clientHeight;
// if (!thisContent.classList .contains('open')) {
// thisContent.style.height = `${height}px`;
// thisContent.classList .add('open');
// if (removeBlock) {
// thisRemoveBlock.classList.remove(removeClass);
// }
// }else{
// thisContent.style.height = null;
// thisContent.classList .remove('open');
// if (removeBlock) {
// if (window.scrollY <= 25) {
// thisRemoveBlock.classList.add(removeClass);
// }
// }
// }
// }
// }
// function modalFormOpen(formOrNotification) {
// let buttons = document.querySelectorAll(formOrNotification),
// modal = document.querySelector('.modal');
// buttons.forEach(button => {
// button.onclick = function (eventButton) {
// let classOpenForm = button.dataset.form,
// form = modal.querySelector(`.${classOpenForm}`);
// form.classList.add('active');
// modal.classList.add('active');
// }
// })
// }
// function
// export function toggleOpenX(mainElement, buttonElement ,heightElement, contentElement, close) {
// let elements = document.querySelectorAll(mainElement);
// elements.forEach(e => {
// let thisMainElement = e,
// thisButtonElement = e.querySelector(buttonElement),
// thisHeightElement = e.querySelector(heightElement),
// thisContentElement = e.querySelector(contentElement);
// thisButtonElement.onclick = function (e) {
// let height = thisHeightElement.clientHeight;
// if (close == true && !thisMainElement.classList.contains('active')) {
// elements.forEach(e => {
// if (e.classList.contains('active')) {
// e.classList.remove('active');
// e.querySelector(contentElement).style.height = null
// }
// })
// }
// if (!thisMainElement.classList.contains('active')) {
// thisContentElement.style.height = `${height}px`;
// thisMainElement.classList.add('active');
// }else{
// thisContentElement.style.height = null;
// thisMainElement.classList.remove('active');
// }
// }
// });
// }
// export function toggleHeader(button, content, blockheight, removeBlock, removeClass) {
// let thisButton = document.querySelector(button),
// thisContent = document.querySelector(content),
// thisRemoveBlock = document.querySelector(removeBlock) || '',
// thisBlockheight = document.querySelector(blockheight);
// thisButton.onclick = function () {
// let height = thisBlockheight.clientHeight;
// if (!thisContent.classList .contains('open')) {
// thisContent.style.height = `${height}px`;
// thisContent.classList .add('open');
// if (removeBlock) {
// thisRemoveBlock.classList.remove(removeClass);
// }
// }else{
// thisContent.style.height = null;
// thisContent.classList .remove('open');
// if (removeBlock) {
// if (window.scrollY <= 25) {
// thisRemoveBlock.classList.add(removeClass);
// }
// }
// }
// }
// }
// export function modalFormOpen(formOrNotification) {
// let buttons = document.querySelectorAll(formOrNotification),
// modal = document.querySelector('.modal');
// buttons.forEach(button => {
// button.onclick = function (eventButton) {
// let classOpenForm = button.dataset.form,
// form = modal.querySelector(`.${classOpenForm}`);
// form.classList.add('active');
// modal.classList.add('active');
// }
// })
// }
// function
jQuery('.cabinet-card__button').on('click', function(){
var id = jQuery(this).data('edit')
jQuery(`#pet_edit_` + id).addClass('active')
@ -317,3 +57,40 @@ jQuery('.cabinet-card__block-add-pets').on('click', function(){
jQuery(`#pet_add_form`).addClass('active')
})
jQuery(document).ready(function ($) {
$('.subscription-address-form').on('submit', function (e) {
e.preventDefault();
var $form = $(this);
var $message = $form.find('.form-message');
var subscriptionId = $form.data('subscription-id');
var address = $form.find('input[name="address"]').val();
var comment = $form.find('textarea[name="comment"]').val();
var nonce = $form.find('input[name="address_nonce"]').val();
$message.hide().removeClass('success error').empty();
$.ajax({
url: '/wp-admin/admin-ajax.php', // Defined in wp_localize_script
type: 'POST',
data: {
action: 'update_subscription_address',
subscription_id: subscriptionId,
address: address,
comment: comment,
address_nonce: nonce
},
success: function (response) {
if (response.success) {
$message.addClass('success').text(response.data.message).show();
} else {
$message.addClass('error').text(response.data.message).show();
}
},
error: function () {
}
});
});
});

@ -183,6 +183,11 @@ $context['months'] = [
];
if ($orders_pg){
Timber::render('profile/profile-orders.twig', $context);
}
else{
Timber::render('profile/profile.twig', $context);
}
Timber::render('templates/profile/profile.twig', $context);
?>

@ -0,0 +1,143 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
use Timber\Timber;
add_filter('timber/twig/filters', function ($filters) {
$filters['wp_get_attachment_image_src'] = [
'callable' => function ($attachment_id, $size = 'thumbnail', $icon = false) {
$image = wp_get_attachment_image_src($attachment_id, $size, $icon);
return $image ? $image[0] : ''; // Return the URL or empty string
},
];
return $filters;
});
add_filter('timber/twig/functions', function ($functions) {
$functions['wc_get_page_permalink'] = [
'callable' => 'wc_get_page_permalink',
];
$functions['wc_get_endpoint_url'] = [
'callable' => 'wc_get_endpoint_url',
];
$functions['is_wc_endpoint_url'] = [
'callable' => 'is_wc_endpoint_url',
];
$functions['get_permalink'] = [
'callable' => 'get_permalink',
];
$functions['get_the_ID'] = [
'callable' => 'get_the_ID',
];
$functions['pll_e'] = [
'callable' => 'pll_e',
];
return $functions;
});
// Get subscription ID from URL (e.g., /my-account/view-subscription/7632/)
$request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
if (preg_match('/view-subscription\/(\d+)/', $request_uri, $matches)) {
$subscription_id = absint($matches[1]);
}
$subscription = $subscription_id ? wcs_get_subscription($subscription_id) : null;
if (!$subscription || !wcs_is_subscription($subscription) || $subscription->get_user_id() !== get_current_user_id()) {
error_log('Invalid or inaccessible subscription ID: ' . $subscription_id);
$subscription = null;
} else {
error_log('Subscription ID: ' . $subscription->get_id() . ' | Status: ' . $subscription->get_status());
$items = array_map(function ($item) {
$product_id = $item->get_product_id();
$variation_id = $item->get_variation_id();
$wc_product = $product_id ? wc_get_product($variation_id ?: $product_id) : null;
$product_name = $wc_product ? $wc_product->get_name() : 'Unknown Product';
$image_id = $wc_product ? $wc_product->get_image_id() : 0;
$status = $product_id ? get_post_status($product_id) : 'N/A';
$permalink = $wc_product && $wc_product->is_visible() ? get_permalink($product_id) : '';
$variation_details = $variation_id ? wc_get_formatted_variation($wc_product, true) : '';
error_log('Item ID: ' . $item->get_id() . ' | Product ID: ' . $product_id . ' | Variation ID: ' . $variation_id . ' | Name: ' . $product_name . ' | Permalink: ' . $permalink . ' | Status: ' . $status);
return [
'product' => [
'id' => $product_id ?: 0,
'name' => $product_name,
'image_id' => $image_id,
'variation_details' => $variation_details,
],
'quantity' => $item->get_quantity(),
'total' => $item->get_total(),
];
}, $subscription->get_items());
$cancel_url = '';
if ($subscription->can_be_updated_to('cancelled')) {
$cancel_url = add_query_arg(
[
'subscription_id' => $subscription->get_id(),
'change_subscription_to' => 'cancelled',
'_wpnonce' => wp_create_nonce('wcs_switch_request'),
],
wc_get_endpoint_url('view-subscription', $subscription->get_id(), wc_get_page_permalink('myaccount'))
);
}
$subscription_data = [
'id' => $subscription->get_id(),
'status' => $subscription->get_status(),
'date_created' => $subscription->get_date_created(),
'last_order_date' => $subscription->get_date('last_order_date_created'),
'next_payment_date' => $subscription->get_date('next_payment'),
'payment_method_title' => $subscription->get_payment_method_title(),
'total' => $subscription->get_total(),
'currency' => $subscription->get_currency(),
'items' => $items,
'cancel_url' => $cancel_url,
'shipping_address' => $subscription->get_formatted_shipping_address(),
'shipping_comment' => $subscription->get_customer_note(),
];
}
// Timber context
$context = Timber::context();
$current_user = wp_get_current_user();
$context['current_user'] = $current_user;
$context['first_name'] = $current_user->user_firstname;
$context['last_name'] = $current_user->user_lastname;
$context['email'] = $current_user->user_email;
$context['phone'] = get_user_meta($current_user->ID, 'billing_phone', true);
$context['tg_account'] = get_user_meta($current_user->ID, 'tg_account', true);
// ACF поля для пользователя
$context['activated'] = get_field('activated', 'user_' . get_current_user_id());
$context['uuid'] = get_field('uuid', 'user_' . get_current_user_id());
// Запрос для питомцев
$current_user_id = get_current_user_id();
if ($current_user_id) {
$args = [
'post_type' => 'pets',
'meta_query' => [
[
'key' => 'user',
'value' => $current_user_id,
'compare' => '='
]
]
];
$context['pets'] = Timber::get_posts($args);
}
$context['bot_username'] = defined('BOT_USERNAME') ? BOT_USERNAME : '';
$context['subscription'] = $subscription_data;
// Debug: Log subscription data
error_log('Subscription Data: ' . print_r($subscription_data, true));
// Render the Twig template
Timber::render('profile/profile-subs-single.twig', $context);
?>

@ -0,0 +1,107 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
add_filter('timber/twig/filters', function ($filters) {
$filters['wp_get_attachment_image_src'] = [
'callable' => function ($attachment_id, $size = 'thumbnail', $icon = false) {
$image = wp_get_attachment_image_src($attachment_id, $size, $icon);
return $image ? $image[0] : ''; // Return the URL or empty string
},
];
return $filters;
});
use Timber\Timber;
$context = Timber::context();
if (!class_exists('WC_Subscriptions')) {
error_log('WooCommerce Subscriptions plugin is not active.');
return;
}
// Get the current user’s subscriptions
$user_id = get_current_user_id();
$subscriptions = wcs_get_users_subscriptions($user_id);
$subscription_data = [];
foreach ($subscriptions as $subscription) {
$view_url = $subscription->get_view_order_url();
// Debug: Log the view_url to check its value
error_log('Subscription ID: ' . $subscription->get_id() . ' | View URL: ' . $view_url);
$subscription_data[] = [
'id' => $subscription->get_id(),
'date_created' => $subscription->get_date_created(),
'total' => $subscription->get_total(),
'currency' => $subscription->get_currency(),
'billing_period' => $subscription->get_billing_period(),
'next_payment_date' => $subscription->get_date('next_payment'),
'view_url' => esc_url($view_url), // Ensure URL is escaped for safety
'items' => array_map(function ($item) {
$product = $item->get_product();
return [
'product' => [
'name' => $product->get_name(),
'image_id' => $product->get_image_id(),
],
];
}, $subscription->get_items()),
];
}
$context['subscriptions'] = $subscription_data;
// Debug: Log the entire subscriptions array
error_log('Subscriptions Data: ' . print_r($subscription_data, true));
// Render the Twig template
$current_user = wp_get_current_user();
$context['current_user'] = $current_user;
$context['first_name'] = $current_user->user_firstname;
$context['last_name'] = $current_user->user_lastname;
$context['email'] = $current_user->user_email;
$context['phone'] = get_user_meta($current_user->ID, 'billing_phone', true);
$context['tg_account'] = get_user_meta($current_user->ID, 'tg_account', true);
// ACF поля для пользователя
$context['activated'] = get_field('activated', 'user_' . get_current_user_id());
$context['uuid'] = get_field('uuid', 'user_' . get_current_user_id());
$context['bot_username'] = defined('BOT_USERNAME') ? BOT_USERNAME : '';
// Запрос для питомцев
$current_user_id = get_current_user_id();
if ($current_user_id) {
$args = [
'post_type' => 'pets',
'meta_query' => [
[
'key' => 'user',
'value' => $current_user_id,
'compare' => '='
]
]
];
$context['pets'] = Timber::get_posts($args);
}
// Месяцы для локализации
$context['months'] = [
__('january', 'woodmart'),
__('february', 'woodmart'),
__('march', 'woodmart'),
__('april', 'woodmart'),
__('may', 'woodmart'),
__('june', 'woodmart'),
__('july', 'woodmart'),
__('august', 'woodmart'),
__('september', 'woodmart'),
__('october', 'woodmart'),
__('november', 'woodmart'),
__('december', 'woodmart'),
];
Timber::render('profile/profile-subs.twig', $context);
?>

@ -131,3 +131,4 @@ function ajax_edit_pet() {
}
add_action('wp_ajax_edit_pet', 'ajax_edit_pet');
add_action('wp_ajax_nopriv_edit_pet', 'ajax_edit_pet');

@ -1 +1,2 @@
<?php
$context = Timber::get_context();

@ -18,9 +18,7 @@ jQuery(document).ready(function($) {
});
// Увеличение количества
$(document).on('click', '.modal__basket .counter__button.plus', function(e) {
e.preventDefault();
const key = $(this).data('key');
const input = $(this).siblings('.counter__input');
@ -29,20 +27,24 @@ jQuery(document).ready(function($) {
});
// Уменьшение количества
$(document).on('click', '.modal__basket .counter__button.minus', function(e) {
e.preventDefault();
const key = $(this).data('key');
const input = $(this).siblings('.counter__input');
let quantity = parseInt(input.val()) - 1;
quantity = quantity < 1 ? 1 : quantity;
input.val(quantity).trigger('change');
if (quantity <= 0) {
removeItem(key); // Вызываем удаление, если количество становится 0
} else {
input.val(quantity).trigger('change'); // Обновляем количество, если больше 0
}
});
$(document).on('click', '.remove-item', function() {
const key = $(this).data('key');
removeItem(key);
});
// Удаление товара
function formatMoney(amount) {
if (typeof woocommerce_params !== 'undefined' && woocommerce_params.currency_format) {
@ -57,116 +59,115 @@ jQuery(document).ready(function($) {
// Хранилище временно удалённых товаров
const removedItemsStorageKey = 'woocommerce_removed_items';
function restoreRemovedItems() {
const removedItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || [];
if (removedItems.length === 0) return;
const removedItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || [];
if (removedItems.length === 0) return;
$('#modal-basket').addClass('loading');
$('#modal-basket').addClass('loading');
// Создаем копию массива для работы
let itemsToRemove = [...removedItems];
function processNextItem() {
if (itemsToRemove.length === 0) {
// Все элементы обработаны
localStorage.removeItem(removedItemsStorageKey);
updateCartFragment();
$('#modal-basket').removeClass('loading');
return;
// Создаем копию массива для работы
let itemsToRemove = [...removedItems];
function processNextItem() {
if (itemsToRemove.length === 0) {
// Все элементы обработаны
localStorage.removeItem(removedItemsStorageKey);
updateCartFragment();
$('#modal-basket').removeClass('loading');
return;
}
const element = itemsToRemove.shift(); // Берем первый элемент
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
action: 'remove_cart_item',
cart_item_key: element.key
},
success: function(response) {
if (response.success) {
// Обновляем localStorage, удаляя только что обработанный элемент
const currentItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || [];
const updatedItems = currentItems.filter(item => item.key !== element.key);
localStorage.setItem(removedItemsStorageKey, JSON.stringify(updatedItems));
}
// Обрабатываем следующий элемент
processNextItem();
},
error: function() {
// Продолжаем даже при ошибке
processNextItem();
}
});
}
const element = itemsToRemove.shift(); // Берем первый элемент
// Начинаем обработку
processNextItem();
}
// Инициализация при загрузке
restoreRemovedItems();
// Функция удаления товара с возможностью восстановления
function removeItem(key) {
const $item = $(`[data-key="${key}"]`);
const productId = $item.data('product_id');
const variationId = $item.data('variation_id') || 0;
const quantity = parseInt($item.find('.counter__input').val());
// Сохраняем во временное хранилище
const removedItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || [];
removedItems.push({ product_id: productId, variation_id: variationId, quantity: quantity, key: key });
localStorage.setItem(removedItemsStorageKey, JSON.stringify(removedItems));
// Показываем кнопку восстановления
$item.html(`
<p class="modal-basket-item__title">
Removing an item from the cart: <span id="${key}_timer" class="timer_counter">5</span>с
</p>
<div class="modal-basket-item__return-wrapper">
<button class="modal-basket-item__return" data-key="${key}">
${woocommerce_params.i18n_restore_item || 'Restore'}
</button>
</div>
`);
// Проверяем количество товаров в корзине
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
action: 'remove_cart_item',
cart_item_key: element.key
action: 'check_cart_count'
},
success: function(response) {
if (response.success) {
// Обновляем localStorage, удаляя только что обработанный элемент
const currentItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || [];
const updatedItems = currentItems.filter(item => item.key !== element.key);
localStorage.setItem(removedItemsStorageKey, JSON.stringify(updatedItems));
if (response.success && response.data.count <= 1) {
// Если после удаления корзина станет пустой (1 товар сейчас, удаляем его)
$('.proceed-to-checkout').css('display', 'none');
}
// Обрабатываем следующий элемент
processNextItem();
},
error: function() {
// Продолжаем даже при ошибке
processNextItem();
}
});
}
// Начинаем обработку
processNextItem();
}
// Инициализация при загрузке
restoreRemovedItems();
// Функция удаления товара с возможностью восстановления
function removeItem(key) {
const $item = $(`[data-key="${key}"]`);
const productId = $item.data('product_id');
const variationId = $item.data('variation_id') || 0;
const quantity = parseInt($item.find('.counter__input').val());
// Сохраняем во временное хранилище
const removedItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || [];
removedItems.push({ product_id: productId, variation_id: variationId, quantity: quantity, key: key });
localStorage.setItem(removedItemsStorageKey, JSON.stringify(removedItems));
// Показываем кнопку восстановления
$item.html(`
<p class="modal-basket-item__title">
Removing an item from the cart: <span id="${key}_timer" class="timer_counter">5</span>с
</p>
<div class="modal-basket-item__return-wrapper">
<button class="modal-basket-item__return" data-key="${key}">
${woocommerce_params.i18n_restore_item || 'Restore'}
</button>
</div>
`);
// Проверяем количество товаров в корзине
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
action: 'check_cart_count'
},
success: function(response) {
if (response.success && response.data.count <= 1) {
// Если после удаления корзина станет пустой (1 товар сейчас, удаляем его)
$('.proceed-to-checkout').css('display', 'none');
}
}
});
// Удаляем через 5 секунд, если не восстановили
const removeTimeout = setTimeout(() => {
permanentRemoveItem(key, productId, variationId);
}, 5000);
// Удаляем через 5 секунд, если не восстановили
const removeTimeout = setTimeout(() => {
permanentRemoveItem(key, productId, variationId);
}, 5000);
const product_remove_timer = setInterval(() => {
let number = Number($(`#${key}_timer`).html()) - 1;
$(`#${key}_timer`).html(number);
}, 1000);
// Обработчик восстановления
$(document).off('click', `[data-key="${key}"] .modal-basket-item__return`).on('click', `[data-key="${key}"] .modal-basket-item__return`, function(e) {
e.preventDefault();
clearTimeout(removeTimeout);
clearInterval(product_remove_timer); // Очищаем интервал
restoreItem(key, productId, variationId, quantity);
});
}
const product_remove_timer = setInterval(() => {
let number = Number($(`#${key}_timer`).html()) - 1;
$(`#${key}_timer`).html(number);
}, 1000);
// Обработчик восстановления
$(document).off('click', `[data-key="${key}"] .modal-basket-item__return`).on('click', `[data-key="${key}"] .modal-basket-item__return`, function(e) {
e.preventDefault();
clearTimeout(removeTimeout);
clearInterval(product_remove_timer); // Очищаем интервал
restoreItem(key, productId, variationId, quantity);
});
}
// Полное удаление товара
function permanentRemoveItem(key, productId, variationId) {
@ -197,39 +198,39 @@ function removeItem(key) {
});
}
// Восстановление товара
function restoreItem(key, productId, variationId, quantity) {
$('#modal-basket').addClass('loading');
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
action: 'restore_cart_item',
product_id: productId,
variation_id: variationId,
quantity: quantity
},
complete: function() {
$('#modal-basket').removeClass('loading');
},
success: function(response) {
if (response.success) {
// Удаляем из временного хранилища
const removedItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || [];
const updatedItems = removedItems.filter(item =>
!(item.product_id === productId && item.variation_id === variationId)
);
localStorage.setItem(removedItemsStorageKey, JSON.stringify(updatedItems));
// Показываем кнопку Proceed to checkout
$('.proceed-to-checkout').css('display', '');
updateCartFragment();
// Восстановление товара
function restoreItem(key, productId, variationId, quantity) {
$('#modal-basket').addClass('loading');
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
action: 'restore_cart_item',
product_id: productId,
variation_id: variationId,
quantity: quantity
},
complete: function() {
$('#modal-basket').removeClass('loading');
},
success: function(response) {
if (response.success) {
// Удаляем из временного хранилища
const removedItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || [];
const updatedItems = removedItems.filter(item =>
!(item.product_id === productId && item.variation_id === variationId)
);
localStorage.setItem(removedItemsStorageKey, JSON.stringify(updatedItems));
// Показываем кнопку Proceed to checkout
$('.proceed-to-checkout').css('display', '');
updateCartFragment();
}
}
}
});
}
});
}
// --- Работа с cookie ---
function setCookie(name, value, days) {
@ -322,39 +323,39 @@ function restoreItem(key, productId, variationId, quantity) {
}
// Обновление фрагментов корзины
function updateCartFragment() {
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
action: 'get_cart_fragment'
},
beforeSend: function() {
$('#modal-basket').addClass('loading');
},
complete: function() {
$('#modal-basket').removeClass('loading');
},
success: function(response) {
console.log(response);
if (response.success) {
$('#modal-basket-content').html(response.data.contents);
$('.modal-block-price__price').html(response.data.total);
$('.mini-profile__button--counter').text(response.data.count);
if (response.data.count > 0) {
$('.mini-profile__button--counter').removeClass('disabled');
$('.proceed-to-checkout').css('display', ''); // Показываем кнопку, если есть товары
} else {
$('.mini-profile__button--counter').addClass('disabled');
$('.proceed-to-checkout').css('display', 'none'); // Скрываем кнопку, если корзина пуста
function updateCartFragment() {
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
action: 'get_cart_fragment'
},
beforeSend: function() {
$('#modal-basket').addClass('loading');
},
complete: function() {
$('#modal-basket').removeClass('loading');
},
success: function(response) {
console.log(response);
if (response.success) {
$('#modal-basket-content').html(response.data.contents);
$('.modal-block-price__price').html(response.data.total);
$('.mini-profile__button--counter').text(response.data.count);
if (response.data.count > 0) {
$('.mini-profile__button--counter').removeClass('disabled');
$('.proceed-to-checkout').css('display', ''); // Показываем кнопку, если есть товары
} else {
$('.mini-profile__button--counter').addClass('disabled');
$('.proceed-to-checkout').css('display', 'none'); // Скрываем кнопку, если корзина пуста
}
}
},
error: function(xhr, status, error) {
console.error('AJAX error:', error);
}
},
error: function(xhr, status, error) {
console.error('AJAX error:', error);
}
});
}
});
}
// Добавляем спиннер на кнопку 'Добавить в корзину' в корзине
$('body').on('click', '.add_to_cart_button', function() {
@ -377,6 +378,4 @@ function updateCartFragment() {
}
}
});
});
});

@ -56,9 +56,9 @@
</div>
{% endif %}
</div>
<p class="detail__title">
<h1 class="detail__title">
{{ product.get_title }}
</p>
</h1>
<div class="detail__images-phone">
<div class="swiper-wrapper">

@ -6,12 +6,25 @@
*/
if (is_account_page()){
if (is_account_page() && !is_wc_endpoint_url()){
include_module('profile');
$orders_pg = false;
include_component('profile', 'profile');
}
else if (is_account_page() && isset($wp->query_vars['orders'])){
include_module('profile');
$orders_pg = true;
include_component('profile', 'profile');
}
elseif (is_account_page() && isset($wp->query_vars['subscriptions'])){
include_module('profile');
include_component('profile', 'subscriptions');
}
elseif (is_account_page() && isset($wp->query_vars['view-subscription'])){
include_module('profile');
include_component('profile', 'subscription_single');
}
$context = Timber::context();
$context['post'] = Timber::get_post();

@ -0,0 +1,55 @@
jQuery(document).ready(function($) {
window.onTelegramAuth = function(user) {
$.ajax({
type: 'POST',
url: telegram_auth_params.ajax_url,
data: {
action: 'ontelegramauth',
userid: user.id,
username: user.username || '',
fname: user.first_name || '',
lname: user.last_name || '',
photo_url: user.photo_url || '',
auth_date: user.auth_date,
hash: user.hash
},
success: function(response) {
if (response.success) {
window.location.href = telegram_auth_params.my_account_url;
} else {
alert(telegram_auth_params.i18n_error + ': ' + (response.data.message || 'Unknown error'));
}
},
error: function() {
alert(telegram_auth_params.i18n_error);
}
});
};
window.linkTelegram = function(user) {
$.ajax({
type: 'POST',
url: telegram_auth_params.ajax_url,
data: {
action: 'linktelegram',
userid: user.id,
username: user.username || '',
fname: user.first_name || '',
lname: user.last_name || '',
photo_url: user.photo_url || '',
auth_date: user.auth_date,
hash: user.hash
},
success: function(response) {
if (response.success) {
$('.cabinet-accounts').html('<svg width="40px" height="40px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid"><g><path d="M128,0 C57.307,0 0,57.307 0,128 L0,128 C0,198.693 57.307,256 128,256 L128,256 C198.693,256 256,198.693 256,128 L256,128 C256,57.307 198.693,0 128,0 L128,0 Z" fill="#40B3E0"></path><path d="M190.2826,73.6308 L167.4206,188.8978 C167.4206,188.8978 164.2236,196.8918 155.4306,193.0548 L102.6726,152.6068 L83.4886,143.3348 L51.1946,132.4628 C51.1946,132.4628 46.2386,130.7048 45.7586,126.8678 C45.2796,123.0308 51.3546,120.9528 51.3546,120.9528 L179.7306,70.5928 C179.7306,70.5928 190.2826,65.9568 190.2826,73.6308" fill="#FFFFFF"></path><path d="M98.6178,187.6035 C98.6178,187.6035 97.0778,187.4595 95.1588,181.3835 C93.2408,175.3085 83.4888,143.3345 83.4888,143.3345 L161.0258,94.0945 C161.0258,94.0945 165.5028,91.3765 165.3428,94.0945 C165.3428,94.0945 166.1418,94.5735 163.7438,96.8115 C161.3458,99.0505 102.8328,151.6475 102.8328,151.6475" fill="#D2E5F1"></path><path d="M122.9015,168.1154 L102.0335,187.1414 C102.0335,187.1414 100.4025,188.3794 98.6175,187.6034 L102.6135,152.2624" fill="#B5CFE4"></path></g></svg>');
} else {
alert(telegram_auth_params.i18n_error_link + ': ' + (response.data.message || 'Unknown error'));
}
},
error: function() {
alert(telegram_auth_params.i18n_error_link);
}
});
};
});

@ -4276,4 +4276,8 @@ color: #f4f1f0;
.reviews-plus{
overflow: hidden;
}
.invisible {
visibility: hidden;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -6,14 +6,15 @@
{% block content %}
<section class="home">
<h1 class="home__title invisible">FOOD OF THE FUTURE FOR YOUR PET</h1>
<div class="container">
<div class="home__swiper">
<div class="swiper-wrapper">
<div class="swiper-wrapper">
{% for slide in slider %}
<div class="swiper-slide">
<div class="home__item">
<div class="home__block">
<h1 class="home__title">{{ slide.slide_title }}</h1>
<h2 class="home__title">{{ slide.slide_title }}</h2>
<div class="home__subtitle">{{ slide.slide_description }}</div>
<a href="{{ slide.btn_url }}"
class="home__btn"><span>{{ slide.btn_text }}</span> </a>
@ -41,7 +42,7 @@
alt="">
</div>
<div class="about_info">
<h1 class="about_title">{{about_title}}</h1>
<h2 class="about_title">{{about_title}}</h2>
<p class="about_text">{{about_desc}}</p>
</div>
</div>
@ -546,7 +547,7 @@
<div class="section_wrap">
<section class="cosmopet-x">
<div class="container">
<h1 class="cosmopet-x__title">{{ post.meta('cosmopet_x_blocktitle') }}</h1>
<h2 class="cosmopet-x__title">{{ post.meta('cosmopet_x_blocktitle') }}</h2>
<div class="cosmopet-x__swiper">
<div class="swiper-wrapper">
{% for slide in post.meta('cosmopet_x_slider') %}
@ -577,7 +578,7 @@
<div class="container">
<div class="blog_block">
<div class="blog_top">
<h1 class="blog_title">{{ function('pll_e', 'Наш блог') }}</h1>
<h2 class="blog_title">{{ function('pll_e', 'Наш блог') }}</h2>
</div>
<div class="blog__row">
<p class="blog_text">{{ function('pll_e', 'Новости рынка кормов и экологии, полезные статьи о здоровье домашних животных') }}</p>

@ -34,7 +34,7 @@
<div class="cabinet-card__pet">
<div class="cabinet-card-pet__icon">
<div class="cabinet-card-pet-icon__content">
<img src="{{ function('get_template_directory_uri') }}/gp-include/assets/lk/img/pet/mini-{{ function('get_field', 'type', pet_id) }}.png" alt="">
<img src="{{ function('get_template_directory_uri') }}/static/img/pet/mini-{{ function('get_field', 'type', pet_id) }}.png" alt="">
</div>
</div>
<p class="cabinet-card-pet__name">{{ function('get_the_title', pet_id) }}</p>

@ -0,0 +1,611 @@
<main class="wrapper">
<div class="cabinet-card cabinet-card--green-white cabinet__subscription-mobile">
<div class="cabinet-card__content">
<p class="cabinet-card__title">
{{ function('pll_e', 'Feed subscription') }}
</p>
<div class="cabinet-card__element">
<p class="cabinet-card__text">{{ function('pll_e', 'Weekly food delivery for your pet') }}</p>
</div>
<div class="cabinet-card__element">
<button class="button button--gradient button--high-46 form-sub__btn">
{{ function('pll_e', 'Get details') }}
</button>
</div>
</div>
</div>
<div class="cabinet__control cabinet__control--column">
<a href="{{ fn('wc_get_page_permalink', 'myaccount') }}" class="to-know to-know--start button--100-perc to-know--background-none">
<p>{{ fn('pll_e', 'Перейти в профиль') }}</p>
</a>
<div class="form-input__tabs form-input__tabs--control form-input__tabs--white">
<a href="{{ fn('wc_get_endpoint_url', 'orders', '', fn('wc_get_page_permalink', 'myaccount')) }}" class="form-input-tabs__button {% if fn('is_wc_endpoint_url','orders') %}active{% endif %}">
{{ fn('pll_e', 'Заказы') }}
</a>
<a href="{{ fn('wc_get_page_permalink', 'myaccount') }}subscriptions" class="form-input-tabs__button {% if fn('is_wc_endpoint_url','subscriptions') %}active{% endif %}">
{{ fn('pll_e', 'Подписки') }}
</a>
</div>
</div>
<div class="cabinet">
<div class="cabinet__profile cabinet-content {% if not fn('is_wc_endpoint_url') %}active hide{% endif %}">
<div class="form-input__tabs form-input__tabs--control form-input__tabs--white">
<a href="{{ fn('wc_get_endpoint_url', '', '', fn('wc_get_page_permalink', 'myaccount')) }}" class="form-input-tabs__button {% if not fn('is_wc_endpoint_url') %}active{% endif %}">
{{ fn('pll_e', 'Заказы') }}
</a>
<a href="subscriptions" class="form-input-tabs__button {% if fn('is_wc_endpoint_url','subscriptions') %}active{% endif %}">
{{ fn('pll_e', 'Подписки') }}
</a>
</div>
<div class="cabinet-card cabinet-card--green">
<div class="cabinet-card__content">
<div class="cabinet-card__element">
<p class="cabinet-card__text {% if not first_name and not last_name %}cabinet-card__text--grey{% endif %}">
{% if first_name or last_name %}
{{ first_name }} {{ last_name }}
{% else %}
{{ function('pll_e', 'Name is not set') }}
{% endif %}
</p>
</div>
<div class="cabinet-card__element">
<p class="cabinet-card__label">{{ function('pll_e', 'Phone') }}:</p>
<p class="cabinet-card__text {% if not phone %}cabinet-card__text--grey{% endif %}">
{% if phone %}
{{ phone }}
{% else %}
{{ function('pll_e', 'Not filled') }}
{% endif %}
</p>
</div>
<div class="cabinet-card__element">
<p class="cabinet-card__label">{{ function('pll_e', 'Email') }}:</p>
{% if email %}
<p class="cabinet-card__text">{{ email }}</p>
{% if activated %}
<p class="cabinet-card__status cabinet-card__status--chek">{{ function('pll_e', 'Email is verified') }}</p>
{% else %}
<p class="cabinet-card__status cabinet-card__status--cancelled">{{ function('pll_e', 'Email is not verified') }}</p>
<form class="email_approve_form">
<input type="hidden" name="action" value="email_activate">
<button type="submit" class="cabinet-card__confirm">{{ function('pll_e', 'Verify') }}</button>
</form>
{% if uuid %}
<p class="cabinet-card__status">{{ function('pll_e', 'Email with verification link is sent to your email.') }}</p>
{% endif %}
{% endif %}
{% else %}
<div class="cabinet-card__label">
<form class="email_link_form">
<input type="hidden" name="action" value="email_link">
<div class="cabinet-card_linked-email">
<input class="form__input" type="text" name="email" placeholder="example@example.com" required>
</div>
<button class="cabinet-card__confirm" type="submit">{{ function('pll_e', 'Link email') }}</button>
</form>
</div>
{% endif %}
</div>
<div class="cabinet-card__element">
<p class="cabinet-card__label">{{ function('pll_e', 'Linked accounts') }}:</p>
<p class="cabinet-card__text cabinet-accounts">
{% if tg_account %}
<svg width="40px" height="40px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M128,0 C57.307,0 0,57.307 0,128 L0,128 C0,198.693 57.307,256 128,256 L128,256 C198.693,256 256,198.693 256,128 L256,128 C256,57.307 198.693,0 128,0 L128,0 Z" fill="#40B3E0"></path>
<path d="M190.2826,73.6308 L167.4206,188.8978 C167.4206,188.8978 164.2236,196.8918 155.4306,193.0548 L102.6726,152.6068 L83.4886,143.3348 L51.1946,132.4628 C51.1946,132.4628 46.2386,130.7048 45.7586,126.8678 C45.2796,123.0308 51.3546,120.9528 51.3546,120.9528 L179.7306,70.5928 C179.7306,70.5928 190.2826,65.9568 190.2826,73.6308" fill="#FFFFFF"></path>
<path d="M98.6178,187.6035 C98.6178,187.6035 97.0778,187.4595 95.1588,181.3835 C93.2408,175.3085 83.4888,143.3345 83.4888,143.3345 L161.0258,94.0945 C161.0258,94.0945 165.5028,91.3765 165.3428,94.0945 C165.3428,94.0945 166.1418,94.5735 163.7438,96.8115 C161.3458,99.0505 102.8328,151.6475 102.8328,151.6475" fill="#D2E5F1"></path>
<path d="M122.9015,168.1154 L102.0335,187.1414 C102.0335,187.1414 100.4025,188.3794 98.6175,187.6034 L102.6135,152.2624" fill="#B5CFE4"></path>
</g>
</svg>
{% else %}
<script async src="https://telegram.org/js/telegram-widget.js?2" data-telegram-login="{{ bot_username }}" data-size="large" data-onauth="linkTelegram(user)"></script>
{% endif %}
</p>
</div>
<div class="cabinet-card__element">
<div class="cabinet-card__block-buttons">
<button class="cabinet-card__button user-edit-open">{{ function('pll_e', 'Edit') }}</button>
<a href="{{ fn('wp_logout_url', fn('home_url')) }}" class="cabinet-card__button">{{ function('pll_e', 'Logout') }}</a>
</div>
</div>
</div>
</div>
{% if pets %}
{% for pet in pets %}
{% include 'pet-card.twig' with { 'item': pet } %}
{% endfor %}
{% endif %}
<div class="cabinet-card cabinet-card--green">
<div class="cabinet-card__content">
<button class="cabinet-card__block-add-pets form-open" data-form="form-pet">
<div class="cabinet-card-add-pets__circle">
<img src="{{ theme.link }}/static/img/svg/main/plus-grey.svg" alt="">
</div>
<p class="cabinet-card-add-pets__text">{{ function('pll_e', 'Add a pet') }}</p>
</button>
</div>
</div>
</div>
{% block profile_content %}
{% endblock %}
</main>
<div class="modalProfile" id="pet_add_form">
<div class="popup-wrap">
<div class="modal-form form__full-mobile modal-form--white modal-form--height-100-phone form-pet active">
<button class="modal-form__close"></button>
<p class="modal-form__title">{{ fn('pll_e', 'Добавить питомца') }}</p>
<form class="modal-form__content" id="add-pet-form" method="post" action="">
<input type="hidden" name="nonce" value="{{ fn('wp_create_nonce', 'add_pet_nonce') }}">
<input type="hidden" name="action" value="add_pet">
<div class="modal-form-content__line">
<label for="" class="label-name">{{ fn('pll_e', 'Вид животного') }}</label>
<div class="form-input__tabs">
<label for="pet_type_cat" class="form-input-tabs__button active">
{{ fn('pll_e', 'Кошка') }}
<input type="radio" value="cat" checked name="pet" id="pet_type_cat" class="form-input-tabs__input">
</label>
<label for="pet_type_dog" class="form-input-tabs__button">
{{ fn('pll_e', 'Собака') }}
<input type="radio" value="dog" name="pet" id="pet_type_dog" class="form-input-tabs__input">
</label>
</div>
</div>
<div class="modal-form-content__line sterilized">
<label for="" class="label-name">{{ fn('pll_e', 'Стерелизован') }}</label>
<div class="form-input__tabs">
<label for="sterilized_yes" class="form-input-tabs__button active">
{{ fn('pll_e', 'Да') }}
<input type="radio" value="1" checked name="sterilized" id="sterilized_yes" class="form-input-tabs__input">
</label>
<label for="sterilized_no" class="form-input-tabs__button">
{{ fn('pll_e', 'Нет') }}
<input type="radio" value="0" name="sterilized" id="sterilized_no" class="form-input-tabs__input">
</label>
</div>
</div>
<div class="modal-form-content__line">
<div class="modal-form-content-line__element">
<label for="pet_name" class="label-name">{{ fn('pll_e', 'Имя') }}</label>
<input id="pet_name" class="form__input" type="text" name="name" placeholder="{{ fn('pll_e', 'Имя питомца') }}" required>
</div>
</div>
<div class="modal-form-content__line">
<div class="modal-form-content-line__element">
<label for="pet_breed" class="label-name">{{ fn('pll_e', 'Порода') }}</label>
<input id="pet_breed" class="form__input" type="text" name="breed" placeholder="{{ fn('pll_e', 'Порода вашего питомца') }}" required>
</div>
</div>
<div class="modal-form-content__line">
<label for="" class="label-name">{{ fn('pll_e', 'Пол вашего питомца') }}</label>
<div class="form-input__tabs">
<label for="pet_sex_male" class="form-input-tabs__button active">
{{ fn('pll_e', 'Мальчик') }}
<input type="radio" value="male" checked name="sex" id="pet_sex_male" class="form-input-tabs__input">
</label>
<label for="pet_sex_female" class="form-input-tabs__button">
{{ fn('pll_e', 'Девочка') }}
<input type="radio" value="female" name="sex" id="pet_sex_female" class="form-input-tabs__input">
</label>
</div>
</div>
<div class="modal-form-content__line modal-form-content__line--two">
<div class="modal-form-content-line__element">
<label class="label-name">{{ fn('pll_e', 'Вид активности') }}</label>
<div class="form-input__list">
<div class="form-input-list__input">{{ fn('pll_e', 'Выберите из списка') }}</div>
<div class="form-input-list__block-content" style="height: 0px;">
<div class="form-input-list__content">
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Низкая') }}</p>
<input type="radio" required name="activity" value="low" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Средняя') }}</p>
<input type="radio" required name="activity" value="moderate" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Высокая') }}</p>
<input type="radio" required name="activity" value="high" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
</div>
</div>
</div>
</div>
<div class="modal-form-content-line__element">
<label for="pet_weight" class="label-name">{{ fn('pll_e', 'Вес') }}</label>
<div class="form-input__list">
<div class="form-input-list__input">{{ fn('pll_e', 'Выберите из списка') }}</div>
<div class="form-input-list__block-content" style="height: 0px;">
<div class="form-input-list__content">
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', '1-1.5 кг') }}</p>
<input type="radio" required name="weight" value="below_1_5" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', '1.5-3 кг') }}</p>
<input type="radio" required name="weight" value="1_5-3" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', '3-5 кг') }}</p>
<input type="radio" required name="weight" value="3-5" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', '5-8 кг') }}</p>
<input type="radio" required name="weight" value="5-8" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', '8-11 кг') }}</p>
<input type="radio" required name="weight" value="8-11" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', '11-15 кг') }}</p>
<input type="radio" required name="weight" value="11-15" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', '10-20кг') }}</p>
<input type="radio" required name="weight" value="15-20" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', '20-25кг') }}</p>
<input type="radio" required name="weight" value="20-25" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', '25-35 кг') }}</p>
<input type="radio" required name="weight" value="25-35" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Более 35 кг') }}</p>
<input type="radio" required name="weight" value="more_35" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
</div>
</div>
</div>
</div>
</div>
<div class="rm">
<div class="modal-form-content__line">
<label class="label-name">{{ fn('pll_e', 'Возраст питомца') }}</label>
<div class="form-input__tabs form-input__remote-control" data-content="modal__age">
<label for="age_type_exemplary" class="form-input-tabs__button active" data-rm="0">
{{ fn('pll_e', 'Примерный') }}
<input type="radio" checked value="ex" name="old_type" required id="age_type_exemplary" class="form-input-tabs__input">
</label>
<label for="age_type_accurate" class="form-input-tabs__button" data-rm="1">
{{ fn('pll_e', 'Точный') }}
<input type="radio" value="acc" name="old_type" required id="age_type_accurate" class="form-input-tabs__input">
</label>
</div>
</div>
<div class="modal__age">
<!-- Approximate age selection -->
<div class="form-input__radio remote-control__item active" data-rmcont="0">
<label class="form-input-radio__item active">
<input type="radio" name="old" value="baby" checked class="v-hidden">
<div class="form-input-radio__circle">
<div class="form-input-radio-circle__content"></div>
</div>
<p class="form-input-radio__title">{{ fn('pll_e', 'Малыш') }} <span>{{ fn('pll_e', '(от 0 до 1 года)') }}</span></p>
</label>
<label class="form-input-radio__item">
<input type="radio" name="old" value="normal" class="v-hidden">
<div class="form-input-radio__circle">
<div class="form-input-radio-circle__content"></div>
</div>
<p class="form-input-radio__title">{{ fn('pll_e', 'Взрослый') }} <span>{{ fn('pll_e', '(от 1 года до 7 лет)') }}</span></p>
</label>
<label class="form-input-radio__item">
<input type="radio" name="old" value="old" class="v-hidden">
<div class="form-input-radio__circle">
<div class="form-input-radio-circle__content"></div>
</div>
<p class="form-input-radio__title">{{ fn('pll_e', 'Пожилой') }} <span>{{ fn('pll_e', '(от 7 до 12 лет)') }}</span></p>
</label>
<label class="form-input-radio__item">
<input type="radio" name="old" value="very_old" class="v-hidden">
<div class="form-input-radio__circle">
<div class="form-input-radio-circle__content"></div>
</div>
<p class="form-input-radio__title">{{ fn('pll_e', 'Стареющий') }} <span>{{ fn('pll_e', '(от 12 лет и старше)') }}</span></p>
</label>
</div>
<!-- Exact age selection -->
<div data-rmcont="1" class="modal-form-content__line remote-control__item modal-form-content__line--three modal-form-content__line--margin-top-16">
<div class="modal-form-content-line__element">
<label for="pet_day" class="label-name">{{ fn('pll_e', 'День') }}</label>
<input id="pet_day" class="form__input form__input--center" maxlength="2" type="text" name="day" placeholder="{{ fn('pll_e', 'ДД') }}">
</div>
<div class="modal-form-content-line__element">
<label for="pet_month" class="label-name">{{ fn('pll_e', 'Месяц') }}</label>
<div class="form-input__list">
<div class="form-input-list__input">{{ fn('pll_e', 'Месяц') }}</div>
<div class="form-input-list__block-content">
<div class="form-input-list__content">
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Январь') }}</p>
<input type="radio" name="month" value="1" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Февраль') }}</p>
<input type="radio" name="month" value="2" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Март') }}</p>
<input type="radio" name="month" value="3" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Апрель') }}</p>
<input type="radio" name="month" value="4" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Май') }}</p>
<input type="radio" name="month" value="5" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Июнь') }}</p>
<input type="radio" name="month" value="6" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Июль') }}</p>
<input type="radio" name="month" value="7" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Август') }}</p>
<input type="radio" name="month" value="8" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Сентябрь') }}</p>
<input type="radio" name="month" value="9" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Октябрь') }}</p>
<input type="radio" name="month" value="10" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Ноябрь') }}</p>
<input type="radio" name="month" value="11" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ fn('pll_e', 'Декабрь') }}</p>
<input type="radio" name="month" value="12" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
</div>
</div>
</div>
</div>
<div class="modal-form-content-line__element">
<label for="pet_year" class="label-name">{{ fn('pll_e', 'Год') }}</label>
<input id="pet_year" class="form__input form__input--center" maxlength="4" type="text" name="year" placeholder="{{ fn('pll_e', 'ГГГГ') }}">
</div>
</div>
</div>
</div>
<div class="modal-form__buttons">
<button class="button button--gradient button--high button--100-perc" type="submit">{{ fn('pll_e', 'Добавить') }}</button>
</div>
</form>
</div>
</div>
</div>
<div class="modalProfile" id="subForm">
<div class="popup-wrap">
<div class="modal-form modal__notification modal-form--green-gradient modal-form--width-584 form-sub active">
<button class="modal-form__close modal-form__close--white"></button>
<p class="modal-form__title modal-form__title--white">{{ fn('pll_e', 'Подписка на корм') }}</p>
<div class="modal-form__element modal-form__element--top-40">
<p class="modal-form__text modal-form__text--white">
{{ fn('pll_e', 'Спасибо за интерес к нашему новому виду услуг, данная функция находится в разработке, если вы хотите узнать первыми о запуске подпишитесь на рассылку.') }}
</p>
</div>
<form class="modal-form__element modal-form__element--top-40 foodSub">
<input type="hidden" name="email" value="{{ user.user_email }}">
<input type="hidden" name="action" value="subscription_sub__profile">
<button class="button form__button-pc button--white button--100-perc open-overlay button--high">
{{ fn('pll_e', 'Хочу попробовать первым!') }}
</button>
<button class="button form__button-mobile button--white button--100-perc open-overlay button--high">
{{ fn('pll_e', 'Хочу быть первым!') }}
</button>
</form>
</div>
</div>
</div>
<div class="modalProfile" id="user_edit">
<div class="popup-wrap">
<div class="modal-form form__full-mobile modal-form--white modal-form--height-100-phone form-data active">
<button class="modal-form__close"></button>
<p class="modal-form__title">{{ fn('pll_e', 'Изменить мои данные') }}</p>
<form class="modal-form__content user-edit-form" method="post">
<input type="hidden" name="action" value="edit_user">
<div class="modal-form-content__line modal-form-content__line--two">
<div class="modal-form-content-line__element">
<label for="user_firstname" class="label-name">{{ fn('pll_e', 'Имя') }}</label>
<input id="user_firstname" class="form__input" type="text" value="{{ user.user_firstname }}" name="name" placeholder="{{ fn('pll_e', 'Ваше имя') }}" required>
<span class="form-input__error form-input__error--absolute">{{ fn('pll_e', 'Имя введено неверно') }}</span>
</div>
<div class="modal-form-content-line__element">
<label for="user_lastname" class="label-name">{{ fn('pll_e', 'Фамилия') }}</label>
<input id="user_lastname" class="form__input" type="text" value="{{ user.user_lastname }}" name="l_name" placeholder="{{ fn('pll_e', 'Ваша фамилия') }}" required>
<span class="form-input__error form-input__error--absolute">{{ fn('pll_e', 'Фамилия введена неверно') }}</span>
</div>
</div>
<div class="modal-form-content__line">
<label class="label-name">{{ fn('pll_e', 'Телефон') }}</label>
<div class="form-input__phone">
<input type="text" placeholder="___ ___ ____" id="user_phone" value="{{ fn('get_user_meta', user.ID, 'billing_phone', true) }}" name="phone" class="form-input-phone__input" required>
<div class="form-input__error form-input__error--absolute">{{ fn('pll_e', 'Номер введён неверно') }}</div>
</div>
</div>
<div class="modal-form__buttons modal-form__buttons--two">
<button class="button button--gradient button--high" type="submit">{{ fn('pll_e', 'Сохранить') }}</button>
<input type="reset" class="button button--white open-overlay button--high modal-form__button-close" value="{{ fn('pll_e', 'Отмена') }}">
</div>
</form>
</div>
</div>
</div>

@ -0,0 +1,106 @@
{% extends 'profile/profile-base.twig' %}
{% block profile_content%}
<div class="cabinet__orders cabinet-content {% if fn('is_wc_endpoint_url') %}active hide{% endif %}">
<div class="cabinet-card cabinet-card--green-white cabinet__subscription-pc">
<div class="cabinet-card__content">
<p class="cabinet-card__title">{{ function('pll_e', 'Feed subscription') }}</p>
<div class="cabinet-card__element">
<p class="cabinet-card__text">{{ function('pll_e', 'Weekly food delivery for your pet') }}</p>
</div>
<div class="cabinet-card__element">
<button class="button button--gradient button--high-46 form-sub__btn">{{ function('pll_e', 'Get details') }}</button>
</div>
</div>
</div>
{% if customer_orders %}
{% for order in customer_orders %}
{% set meta_data = order.meta_data.order_data %}
{% set shipping_address = order.get_address('shipping') %}
<div class="cabinet-card cabinet-card--grey">
<div class="cabinet-card__content">
<div class="cabinet-card__order">
<div class="cabinet-card-order__header">
<div class="cabinet-card-order__main">
<p class="cabinet-card-order-main__date">{{ function('pll_e', 'Order from') }} {{ order.date_created|date('Y.m.d') }}</p>
<p class="cabinet-card-order-main__number">{{ order.id }}</p>
</div>
<div class="cabinet-card-order__payment">
<p class="cabinet-card-order-payment__title">{{ function('pll_e', 'Summary') }}:</p>
<p class="cabinet-card-order-payment__price">{{ order.get_total() }}</p>
</div>
</div>
<div class="cabinet-card-order__bottom">
<div class="cabinet-card-order__content">
{% set order_track = meta_data.order_number|default('') %}
<div class="cabinet-card-order__block-detail">
<div class="cabinet-card-order__detail">
<div class="cabinet-card-order-detail__address">
<p class="cabinet-card-order-detail-address__title">{{ function('pll_e', 'Delivery address') }}</p>
<p class="cabinet-card-order-detail-address__text">
{% if meta_data.office_code %}
{{ function('pll_e', 'CDEK shipping point') }}<br>
{{ office_name }}
{% else %}
{{ shipping_address.city }} {{ shipping_address.address_1 }}
{% endif %}
</p>
</div>
<div class="cabinet-card-order-detail__main">
<div class="cabinet-card-order-detail-main__products">
{% for item in order.get_items %}
{% set product = item.get_product %}
{% set thumbnail = product ? function('wp_get_attachment_image_url', product.get_image_id(), 'woocommerce_thumbnail') : function('wc_placeholder_img_src', 'woocommerce_thumbnail') %}
<div class="cabinet-card-order-detail-main__product">
<img src="{{ thumbnail }}" alt="" class="cabinet-card-order-detail-main-product__img">
<div class="cabinet-card-order-detail-main-product__content">
<div class="cabinet-card-order-detail-main-product__description">
<p class="cabinet-card-order-detail-main-product-description__what">{{ item.name }}</p>
</div>
<p class="cabinet-card-order-detail-main-product__count">{{ item.quantity }}</p>
<p class="cabinet-card-order-detail-main-product__price">{{ item.total }}&nbsp;{{ function('get_woocommerce_currency_symbol', code) }}</p>
</div>
</div>
{% endfor %}
</div>
<div class="cabinet-card-order-detail-main__links">
{% if order_track %}
<a href="https://www.cdek.ru/ru/tracking/?order_id={{ order_track }}" target="_blank" class="cabinet-card__button cabinet-card-order-detail-main__link">
{{ function('pll_e', 'Track order') }}
</a>
{% endif %}
</div>
</div>
</div>
</div>
<button class="cabinet-card-order__open-detail">{{ function('pll_e', 'Order details') }}</button>
</div>
<div class="cabinet-card-order__detail-short">
{% for item in order.get_items %}
{% set product = item.get_product %}
{% set thumbnail = product ? function('wp_get_attachment_image_url', product.get_image_id(), 'woocommerce_thumbnail') : function('wc_placeholder_img_src', 'woocommerce_thumbnail') %}
{% if thumbnail %}
<a href="{{ product.permalink }}"><img src="{{ thumbnail }}" alt="" class="cabinet-card-order-detail-short__item"></a>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
</div>
{% endfor %}
{% else %}
<div class="cabinet-card__no-orders">
<div class="cabinet-card-no-orders__element">
<p class="cabinet-card-no-orders__title">{{ function('pll_e', 'No orders yet') }}</p>
</div>
<div class="cabinet-card-no-orders__element">
<a href="/shop/" class="to-know button--100-perc to-know--background-none">
<p>{{ function('pll_e', 'Catalog') }}</p>
</a>
</div>
</div>
{% endif %}
</div>
</div>
{% endblock %}

@ -0,0 +1,133 @@
{% extends 'profile/profile-base.twig' %}
{% block profile_content %}
<div class="cabinet__orders cabinet__orders--no-cab cabinet-content active hide">
{% if subscription %}
<div class="cabinet-card cabinet-card--grey">
<div class="cabinet-card__content">
<div class="cabinet-card__order">
<div class="cabinet-card-order__header">
<div class="cabinet-card-order__main">
<p class="cabinet-card-order-main__date">
{{ fn('pll_e', 'Подписка №') }} {{ subscription.id }}
</p>
</div>
</div>
</div>
<div class="subscription">
<div class="subscription__item">
<p>{{ fn('pll_e', 'Статус') }}</p>
<p class="subscription__status--end">{{ subscription.status | capitalize }}</p>
</div>
<div class="subscription__item">
<p>{{ fn('pll_e', 'Дата подписки') }}</p>
<p>{{ subscription.date_created | date('d.m.Y') }}</p>
</div>
<div class="subscription__item">
<p>{{ fn('pll_e', 'Дата последнего заказа') }}</p>
<p>{{ subscription.last_order_date | date('d.m.Y') }}</p>
</div>
<div class="subscription__item">
<p>{{ fn('pll_e', 'Следующий платеж') }}</p>
<p>{{ subscription.next_payment_date | date('d.m.Y')}}</p>
</div>
<div class="subscription__item">
<p>{{ fn('pll_e', 'Способ оплаты') }}</p>
<p>{{ subscription.payment_method_title}}</p>
</div>
<div class="subscription__item">
<div class="subscription__add">
<div class="subscription__add-header">
<p class="subscription__add-title">{{ fn('pll_e', 'Товары:') }}</p>
</div>
<div class="subscription__add-content">
{% for item in subscription.items %}
{% set product = item.product %}
{% set image_id = product.image_id %}
{% set product_permalink = product.id ? fn('get_permalink', product.id) : '' %}
{# Debug: Display product ID and permalink for testing #}
<p class="debug-info" style="display: none;">Product ID: {{ product.id | default('null') }} | Permalink: {{ product_permalink | default('none') }}</p>
<div class="cabinet-card-order-detail-main__product subscription__add-product">
{% if product.id and product_permalink and product_permalink != fn('get_permalink', fn('get_the_ID')) %}
<a href="{{ product_permalink }}">
<img src="{{ image_id | wp_get_attachment_image_src('thumbnail') | default('assets/img/product/mini-card.png') }}"
alt="{{ product.name }}"
class="cabinet-card-order-detail-main-product__img">
</a>
{% else %}
<img src="{{ image_id | wp_get_attachment_image_src('thumbnail') | default('assets/img/product/mini-card.png') }}"
alt="{{ product.name }}"
class="cabinet-card-order-detail-main-product__img">
{% endif %}
<div class="cabinet-card-order-detail-main-product__description">
<p class="cabinet-card-order-detail-main-product-description__what">{{ product.name }}</p>
<p class="cabinet-card-order-detail-main-product-description__with-what">{{ product.variation_details | default('') }}</p>
</div>
<div class="cabinet-card-order-detail-main-product__content">
<p class="cabinet-card-order-detail-main-product__count">{{ item.quantity }}</p>
<p class="cabinet-card-order-detail-main-product__price">{{ item.total }}</p>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
<div class="subscription__item">
<p>{{ fn('pll_e', 'Сумма') }}</p>
<p><span>{{ subscription.total }} {{ subscription.currency }} <small>/ {{ fn('pll_e', 'месяц') }}</small></span></p>
</div>
<div class="subscription__item">
<p>{{ fn('pll_e', 'Доставка') }}</p>
<p>{{ fn('pll_e', 'Бесплатно') }}</p>
</div>
<div class="subscription__item">
<p>{{ fn('pll_e', 'Итого') }}</p>
<p><span>{{ subscription.total }} {{ subscription.currency }} <small>/ {{ fn('pll_e', 'месяц') }}</small></span></p>
</div>
<div class="subscription__item">
<div class="subscription__add">
<div class="subscription__add-header">
<p class="subscription__add-title">{{ fn('pll_e', 'Доставка:') }}</p>
</div>
<div class="subscription__add-content" data-js-tabs="">
<form action="" method="post" class="subscription-address-form" data-subscription-id="{{ subscription.id }}">
<div class="modal-form-content__line">
<div class="modal-form-content-line__element">
<label for="delivery_address" class="label-name modal-form-content-line__element--arrow">{{ fn('pll_e', 'Адрес доставки') }}</label>
<input id="delivery_address" class="form__input form-open" type="text" name="address" value="{{ subscription.shipping_address | striptags | default('') }}" placeholder="{{ fn('pll_e', 'Начните вводить адрес') }}" required data-form="form-data">
<span class="form-input__error form-input__error--absolute">{{ fn('pll_e', 'Адрес введен неверно') }}</span>
</div>
</div>
<div class="modal-form-content__line">
<div class="modal-form-content-line__element">
<label for="delivery_comment" class="label-name">{{ fn('pll_e', 'Комментарий для доставки') }}</label>
<textarea id="delivery_comment" class="form__input form__input--textarea-72" name="comment" placeholder="{{ fn('pll_e', 'Для службы доставки') }}">{{ subscription.shipping_comment | default('') }}</textarea>
<span class="form-input__error form-input__error--absolute">{{ fn('pll_e', 'Комментарий введен неверно') }}</span>
</div>
</div>
<input type="hidden" name="subscription_id" value="{{ subscription.id }}">
<input type="hidden" name="address_nonce" value="{{ fn('wp_create_nonce', 'update_subscription_address') }}">
<div class="modal-form-content__line">
<button type="submit" style="width: 100%;" class="button button--gradient button--high-46">{{ fn('pll_e', 'Сохранить') }}</button>
</div>
<div class="form-message" style="display: none;"></div>
</form>
</div>
</div>
</div>
</div>
<a href="{{ subscription.cancel_url }}" class="to-know to-know--start button--100-perc to-know--background-none">
<p>{{ fn('pll_e', 'Отменить подписку') }}</p>
</a>
</div>
</div>
{% else %}
<div class="cabinet-card-no-orders__element">
<p>{{ fn('pll_e', 'Подписка не найдена.') }}</p>
</div>
{% endif %}
</div>
{% endblock %}

@ -0,0 +1,78 @@
{% extends 'profile/profile-base.twig' %}
{% block profile_content %}
<div class="cabinet__orders cabinet__orders--no-cab cabinet-content active hide">
{% for subscription in subscriptions %}
<div class="cabinet-card cabinet-card--grey">
<div class="cabinet-card__content">
<div class="cabinet-card__order">
<div class="cabinet-card-order__header">
<div class="cabinet-card-order__main">
<p class="cabinet-card-order-main__date">
{% if subscription.view_url %}
<a href="{{ subscription.view_url }}">{{ fn('pll_e', 'Подписка от') }} {{ subscription.date_created | date('d.m.Y') }}</a>
{% else %}
{{ fn('pll_e', 'Подписка от') }} {{ subscription.date_created | date('d.m.Y') }}
{% endif %}
</p>
<p class="cabinet-card-order-main__number">
{{ subscription.id }}
</p>
</div>
<div class="cabinet-card-order__payment">
<p class="cabinet-card-order-payment__title">{{ fn('pll_e', 'Сумма:') }}</p>
<p class="cabinet-card-order-payment__price cabinet-card-order-payment__price--add">
{{ subscription.total }} {{ subscription.currency }} <span>/ {{ subscription.billing_period }}</span>
</p>
</div>
</div>
<div class="cabinet-card-order__content">
<div class="cabinet-card-order__payment-add">
<p class="cabinet-card-order__sub-title">
{{ fn('pll_e', 'Следующий платеж:') }}
</p>
<p class="cabinet-card-order__date">
{{ subscription.next_payment_date | date('d.m.Y') }}
</p>
</div>
</div>
<div class="cabinet-card-order__detail-short mt-m-3">
{% for item in subscription.items %}
{% set product = item.product %}
{% set image_id = product.image_id %}
{% if product.permalink %}
<a href="{{ product.permalink }}">
<img src="{{ image_id | wp_get_attachment_image_src('thumbnail') | default('assets/img/product/mini-card.png') }}"
alt="{{ product.name }}"
class="cabinet-card-order-detail-short__item">
</a>
{% else %}
<img src="{{ image_id | wp_get_attachment_image_src('thumbnail') | default('assets/img/product/mini-card.png') }}"
alt="{{ product.name }}"
class="cabinet-card-order-detail-short__item">
{% endif %}
{% endfor %}
</div>
<div class="cabinet-card-order__link">
{% if subscription.view_url %}
<a href="{{ subscription.view_url }}" class="to-know to-know--start button--100-perc to-know--background-none">
<p>{{ fn('pll_e', 'Детали подписки') }}</p>
</a>
{% else %}
<p class="to-know to-know--start button--100-perc to-know--background-none disabled">
{{ fn('pll_e', 'Детали недоступны') }}
</p>
{% endif %}
</div>
</div>
</div>
</div>
{% else %}
<p>{{ fn('pll_e', 'У вас нет активных подписок.') }}</p>
{% endfor %}
</div>
{% endblock %}

@ -1,125 +1,9 @@
<main class="wrapper">
<div class="cabinet-card cabinet-card--green-white cabinet__subscription-mobile">
<div class="cabinet-card__content">
<p class="cabinet-card__title">
{{ function('pll_e', 'Feed subscription') }}
</p>
<div class="cabinet-card__element">
<p class="cabinet-card__text">{{ function('pll_e', 'Weekly food delivery for your pet') }}</p>
</div>
<div class="cabinet-card__element">
<button class="button button--gradient button--high-46 form-sub__btn">
{{ function('pll_e', 'Get details') }}
</button>
</div>
</div>
</div>
<div class="cabinet__control">
<button class="cabinet-control__button active start" data-cabinet="orders">{{ function('pll_e', 'Orders') }}</button>
<button class="cabinet-control__button" data-cabinet="profile">{{ function('pll_e', 'Profile') }}</button>
</div>
<div class="cabinet">
<div class="cabinet__profile cabinet-content">
<div class="cabinet-card cabinet-card--green">
<div class="cabinet-card__content">
<div class="cabinet-card__element">
<p class="cabinet-card__text {% if not first_name and not last_name %}cabinet-card__text--grey{% endif %}">
{% if first_name or last_name %}
{{ first_name }} {{ last_name }}
{% else %}
{{ function('pll_e', 'Name is not set') }}
{% endif %}
</p>
</div>
<div class="cabinet-card__element">
<p class="cabinet-card__label">{{ function('pll_e', 'Phone') }}:</p>
<p class="cabinet-card__text {% if not phone %}cabinet-card__text--grey{% endif %}">
{% if phone %}
{{ phone }}
{% else %}
{{ function('pll_e', 'Not filled') }}
{% endif %}
</p>
</div>
<div class="cabinet-card__element">
<p class="cabinet-card__label">{{ function('pll_e', 'Email') }}:</p>
{% if email %}
<p class="cabinet-card__text">{{ email }}</p>
{% if activated %}
<p class="cabinet-card__status cabinet-card__status--chek">{{ function('pll_e', 'Email is verified') }}</p>
{% else %}
<p class="cabinet-card__status cabinet-card__status--cancelled">{{ function('pll_e', 'Email is not verified') }}</p>
<form class="email_approve_form">
<input type="hidden" name="action" value="email_activate">
<button type="submit" class="cabinet-card__confirm">{{ function('pll_e', 'Verify') }}</button>
</form>
{% if uuid %}
<p class="cabinet-card__status">{{ function('pll_e', 'Email with verification link is sent to your email.') }}</p>
{% endif %}
{% endif %}
{% else %}
<div class="cabinet-card__label">
<form class="email_link_form">
<input type="hidden" name="action" value="email_link">
<div class="cabinet-card_linked-email">
<input class="form__input" type="text" name="email" placeholder="example@example.com" required>
</div>
<button class="cabinet-card__confirm" type="submit">{{ function('pll_e', 'Link email') }}</button>
</form>
</div>
{% endif %}
</div>
<div class="cabinet-card__element">
<p class="cabinet-card__label">{{ function('pll_e', 'Linked accounts') }}:</p>
<p class="cabinet-card__text cabinet-accounts">
{% if tg_account %}
<svg width="40px" height="40px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M128,0 C57.307,0 0,57.307 0,128 L0,128 C0,198.693 57.307,256 128,256 L128,256 C198.693,256 256,198.693 256,128 L256,128 C256,57.307 198.693,0 128,0 L128,0 Z" fill="#40B3E0"></path>
<path d="M190.2826,73.6308 L167.4206,188.8978 C167.4206,188.8978 164.2236,196.8918 155.4306,193.0548 L102.6726,152.6068 L83.4886,143.3348 L51.1946,132.4628 C51.1946,132.4628 46.2386,130.7048 45.7586,126.8678 C45.2796,123.0308 51.3546,120.9528 51.3546,120.9528 L179.7306,70.5928 C179.7306,70.5928 190.2826,65.9568 190.2826,73.6308" fill="#FFFFFF"></path>
<path d="M98.6178,187.6035 C98.6178,187.6035 97.0778,187.4595 95.1588,181.3835 C93.2408,175.3085 83.4888,143.3345 83.4888,143.3345 L161.0258,94.0945 C161.0258,94.0945 165.5028,91.3765 165.3428,94.0945 C165.3428,94.0945 166.1418,94.5735 163.7438,96.8115 C161.3458,99.0505 102.8328,151.6475 102.8328,151.6475" fill="#D2E5F1"></path>
<path d="M122.9015,168.1154 L102.0335,187.1414 C102.0335,187.1414 100.4025,188.3794 98.6175,187.6034 L102.6135,152.2624" fill="#B5CFE4"></path>
</g>
</svg>
{% else %}
<script async src="https://telegram.org/js/telegram-widget.js?2" data-telegram-login="{{ bot_username }}" data-size="large" data-onauth="linkTelegram(user)"></script>
{% endif %}
</p>
</div>
{% set profile_pg = 1 %}
<div class="cabinet-card__element">
<div class="cabinet-card__block-buttons">
<button class="cabinet-card__button user-edit-open">{{ function('pll_e', 'Edit') }}</button>
<a href="{{ fn('wp_logout_url', fn('home_url')) }}" class="cabinet-card__button">{{ function('pll_e', 'Logout') }}</a>
</div>
</div>
</div>
</div>
{% if pets %}
{% for pet in pets %}
{% include 'pet-card.twig' with { 'item': pet } %}
{% endfor %}
{% endif %}
<div class="cabinet-card cabinet-card--green">
<div class="cabinet-card__content">
<button class="cabinet-card__block-add-pets form-open" data-form="form-pet">
<div class="cabinet-card-add-pets__circle">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/plus-grey.svg" alt="">
</div>
<p class="cabinet-card-add-pets__text">{{ function('pll_e', 'Add a pet') }}</p>
</button>
</div>
</div>
</div>
{% extends 'profile/profile-base.twig' %}
<div class="cabinet__orders cabinet-content active hide">
{% block profile_content%}
<div class="cabinet__orders cabinet-content {% if fn('is_wc_endpoint_url') %}active hide{% endif %}">
<div class="cabinet-card cabinet-card--green-white cabinet__subscription-pc">
<div class="cabinet-card__content">
<p class="cabinet-card__title">{{ function('pll_e', 'Feed subscription') }}</p>
@ -131,8 +15,7 @@
</div>
</div>
</div>
{% if customer_orders %}
{% if customer_orders %}
{% for order in customer_orders %}
{% set meta_data = order.meta_data.order_data %}
{% set shipping_address = order.get_address('shipping') %}
@ -222,307 +105,4 @@
{% endif %}
</div>
</div>
</main>
<div class="modalProfile" id="pet_add_form">
<div class="popup-wrap">
<div class="modal-form form__full-mobile modal-form--white modal-form--height-100-phone form-pet active">
<button class="modal-form__close"></button>
<p class="modal-form__title">Добавить питомца</p>
<form class="modal-form__content" id="add-pet-form" method="post" action="">
<input type="hidden" name="nonce" value="{{ fn('wp_create_nonce', 'add_pet_nonce') }}">
<input type="hidden" name="action" value="add_pet">
<div class="modal-form-content__line">
<label for="" class="label-name">Вид животного</label>
<div class="form-input__tabs">
<label for="cat" class="form-input-tabs__button active">
Кошка
<input type="radio" value="cat" checked name="pet" id="cat" class="form-input-tabs__input">
</label>
<label for="dog" class="form-input-tabs__button">
Собака
<input type="radio" value="dog" name="pet" id="dog" class="form-input-tabs__input">
</label>
</div>
</div>
<div class="modal-form-content__line sterilized">
<label for="" class="label-name">Стерелизован</label>
<div class="form-input__tabs">
<label class="form-input-tabs__button active">
Да
<input type="radio" value="1" checked name="sterilized" class="form-input-tabs__input">
</label>
<label class="form-input-tabs__button">
Нет
<input type="radio" value="0" name="sterilized" class="form-input-tabs__input">
</label>
</div>
</div>
<div class="modal-form-content__line">
<div class="modal-form-content-line__element">
<label for="firstname" class="label-name">Имя</label>
<input id="firstname" class="form__input" type="text" name="name" placeholder="Имя питомца" required>
</div>
</div>
<div class="modal-form-content__line">
<div class="modal-form-content-line__element">
<label for="firstname" class="label-name">Порода</label>
<input id="firstname" class="form__input" type="text" name="breed" placeholder="Порода вашего питомца" required>
</div>
</div>
<div class="modal-form-content__line">
<label for="" class="label-name">Пол вашего питомца</label>
<div class="form-input__tabs">
<label for="boy" class="form-input-tabs__button active">
Мальчик
<input type="radio" value="male" checked name="sex" id="boy" class="form-input-tabs__input">
</label>
<label for="girl" class="form-input-tabs__button">
Девочка
<input type="radio" value="female" name="sex" id="girl" class="form-input-tabs__input">
</label>
</div>
</div>
<div class="modal-form-content__line modal-form-content__line--two">
<div class="modal-form-content-line__element">
<label class="label-name">Вид активности</label>
<div class="form-input__list">
<div class="form-input-list__input">Выберите из списка</div>
<div class="form-input-list__block-content" style="height: 0px;">
<div class="form-input-list__content">
<label class="form-input-list__item">
<p class="form-input-list-item__text">Низкая</p>
<input type="radio" required name="activity" value="low" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">Средняя</p>
<input type="radio" required name="activity" value="moderate" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
<label class="form-input-list__item">
<p class="form-input-list-item__text">Высокая</p>
<input type="radio" required name="activity" value="high" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
</div>
</div>
</div>
</div>
<div class="modal-form-content-line__element">
<label for="firstname" class="label-name">Вес</label>
<div class="form-input__list">
<div class="form-input-list__input">Выберите из списка</div>
<div class="form-input-list__block-content" style="height: 0px;">
<div class="form-input-list__content">
{% for weight in [
{value: 'below_1_5', text: '1-1.5 кг'},
{value: '1_5-3', text: '1.5-3 кг'},
{value: '3-5', text: '3-5 кг'},
{value: '5-8', text: '5-8 кг'},
{value: '8-11', text: '8-11 кг'},
{value: '11-15', text: '11-15 кг'},
{value: '15-20', text: '10-20кг'},
{value: '20-25', text: '20-25кг'},
{value: '25-35', text: '25-35 кг'},
{value: 'more_35', text: 'Более 35 кг'}
] %}
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ weight.text }}</p>
<input type="radio" required name="weight" value="{{ weight.value }}" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
<div class="rm">
<div class="modal-form-content__line">
<label class="label-name">Возраст питомца</label>
<div class="form-input__tabs form-input__remote-control" data-content="modal__age">
<label for="exemplary" class="form-input-tabs__button active" data-rm="0">
Примерный
<input type="radio" checked value="ex" name="old_type" required id="exemplary" class="form-input-tabs__input">
</label>
<label class="form-input-tabs__button" data-rm="1">
Точный
<input type="radio" value="acc" name="old_type" required id="accurate" class="form-input-tabs__input">
</label>
</div>
</div>
<div class="modal__age">
<div class="form-input__radio remote-control__item active" data-rmcont="0">
{% for age in [
{value: 'baby', title: 'Малыш', desc: '(от 0 до 1 года)'},
{value: 'normal', title: 'Взрослый', desc: '(от 1 года до 7 лет)'},
{value: 'old', title: 'Пожилой', desc: '(от 7 до 12 лет)'},
{value: 'very_old', title: 'Стареющий', desc: '(от 12 лет и старше)'}
] %}
<label class="form-input-radio__item {{ loop.first ? 'active' }}">
<input type="radio" name="old" value="{{ age.value }}" {{ loop.first ? 'checked' }} class="v-hidden">
<div class="form-input-radio__circle">
<div class="form-input-radio-circle__content"></div>
</div>
<p class="form-input-radio__title">{{ age.title }} <span>{{ age.desc }}</span></p>
</label>
{% endfor %}
</div>
<div data-rmcont="1" class="modal-form-content__line remote-control__item modal-form-content__line--three modal-form-content__line--margin-top-16">
<div class="modal-form-content-line__element">
<label for="firstname" class="label-name">День</label>
<input id="firstname" class="form__input form__input--center" maxlength="2" type="text" name="day" placeholder="ДД">
</div>
<div class="modal-form-content-line__element">
<label for="firstname" class="label-name">Месяц</label>
<div class="form-input__list">
<div class="form-input-list__input">Месяц</div>
<div class="form-input-list__block-content">
<div class="form-input-list__content">
{% for month in [
{value: 1, text: 'Январь'},
{value: 2, text: 'Февраль'},
{value: 3, text: 'Март'},
{value: 4, text: 'Апрель'},
{value: 5, text: 'Май'},
{value: 6, text: 'Июнь'},
{value: 7, text: 'Июль'},
{value: 8, text: 'Август'},
{value: 9, text: 'Сентябрь'},
{value: 10, text: 'Октябрь'},
{value: 11, text: 'Ноябрь'},
{value: 12, text: 'Декабрь'}
] %}
<label class="form-input-list__item">
<p class="form-input-list-item__text">{{ month.text }}</p>
<input type="radio" name="month" value="{{ month.value }}" class="v-hidden">
<div class="form-input-list-item__box">
<div class="form-input-list-item-box__content">
<img src="{{ theme.link }}/gp-include/assets/lk/img/svg/main/arrow-selected-white.svg" alt="">
</div>
</div>
</label>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="modal-form-content-line__element">
<label for="firstname" class="label-name">Год</label>
<input id="firstname" class="form__input form__input--center" maxlength="4" type="text" name="year" placeholder="ГГГГ">
</div>
</div>
</div>
</div>
<div class="modal-form__buttons">
<button class="button button--gradient button--high button--100-perc" type="submit">Добавить</button>
</div>
</form>
</div>
</div>
</div>
<div class="modalProfile" id="subForm">
<div class="popup-wrap">
<div class="modal-form modal__notification modal-form--green-gradient modal-form--width-584 form-sub active">
<button class="modal-form__close modal-form__close--white"></button>
<p class="modal-form__title modal-form__title--white">Подписка на корм</p>
<div class="modal-form__element modal-form__element--top-40">
<p class="modal-form__text modal-form__text--white">
Спасибо за интерес к нашему новому виду услуг, данная функция находится в разработке, если вы хотите узнать первыми о запуске подпишитесь на рассылку.
</p>
</div>
<form class="modal-form__element modal-form__element--top-40 foodSub">
<input type="hidden" name="email" value="{{ user.user_email }}">
<input type="hidden" name="action" value="subscription_sub__profile">
<button class="button form__button-pc button--white button--100-perc open-overlay button--high">
Хочу попробовать первым!
</button>
<button class="button form__button-mobile button--white button--100-perc open-overlay button--high">
Хочу быть первым!
</button>
</form>
</div>
</div>
</div>
<div class="modalProfile" id="user_edit">
<div class="popup-wrap">
<div class="modal-form form__full-mobile modal-form--white modal-form--height-100-phone form-data active">
<button class="modal-form__close"></button>
<p class="modal-form__title">Изменить мои данные</p>
<form class="modal-form__content user-edit-form" method="post">
<input type="hidden" name="action" value="edit_user">
<div class="modal-form-content__line modal-form-content__line--two">
<div class="modal-form-content-line__element">
<label for="firstname" class="label-name">Имя</label>
<input id="firstname" class="form__input" type="text" value="{{ user.user_firstname }}" name="name" placeholder="Ваше имя" required>
<span class="form-input__error form-input__error--absolute">Имя введено неверно</span>
</div>
<div class="modal-form-content-line__element">
<label for="lastname" class="label-name">Фамилия</label>
<input id="lastname" class="form__input" type="text" value="{{ user.user_lastname }}" name="l_name" placeholder="Ваша фамилия" required>
<span class="form-input__error form-input__error--absolute">Фамилия введена неверно</span>
</div>
</div>
<div class="modal-form-content__line">
<label class="label-name">Телефон</label>
<div class="form-input__phone">
<input type="text" placeholder="___ ___ ____" id="tel-phone" value="{{ fn('get_user_meta', user.ID, 'billing_phone', true) }}" name="phone" class="form-input-phone__input" required>
<div class="form-input__error form-input__error--absolute">Номер введён неверно</div>
</div>
</div>
<div class="modal-form__buttons modal-form__buttons--two">
<button class="button button--gradient button--high" type="submit">Сохранить</button>
<input type="reset" class="button button--white open-overlay button--high modal-form__button-close" value="Отмена">
</div>
</form>
</div>
</div>
</div>
{% endblock %}

@ -8,7 +8,7 @@
<div class="container">
<div class="seller_block">
<div class="sellers_top">
<h1 class="sellers_title">{{ function('pll_e', 'BESTSELLERS') }}</h1>
<h2 class="sellers_title">{{ function('pll_e', 'BESTSELLERS') }}</h2>
<div class="slider-arrows">
<button class="slider-arrow slider-arrow-prev sellerSlider-prev" aria-label="{{ function('pll_e', 'Previous products') }}"></button>
<button class="slider-arrow slider-arrow-next sellerSlider-next" aria-label="{{ function('pll_e', 'Next products') }}"></button>
@ -26,7 +26,7 @@
{% set product = function('wc_get_product', product_id) %}
{% if product %}
{% set thumbnail = product.get_image_id() ? function('wp_get_attachment_image_url', product.get_image_id(), 'medium') : function('wc_placeholder_img_src') %}
{% set price = product.get_price_html() %}
{% set price = product.get_price() ~ ' ' ~ fn('get_woocommerce_currency_symbol') %}
{% set has_sale = product.is_on_sale() %}
{% set regular_price = product.get_regular_price() %}
{% set sale_price = product.get_sale_price() %}
@ -49,17 +49,7 @@
<div class="seller_price">
{{ price|raw }}
</div>
{% if has_sale and regular_price and sale_price %}
<div class="product-item__price-disc">
<p class="product-item__price-sale__text">
{{ regular_price }} {{ currency }}
</p>
<p class="product-item__price-sale__perc">
-{{ (1 - (sale_price / regular_price)) * 100|round }}%
</p>
</div>
{% endif %}
</div>
<a href="{{ product.get_permalink() }}" class="seller_link">

@ -21,13 +21,13 @@
<div class="product">
<div class="product__header">
<p class="product__title">
<h1 class="product__title">
{% if category %}
{{ category.name }}
{% else %}
{{ function('pll_e', 'Продукция') }}
{% endif %}
</p>
</h1>
<button class="button button--gradient button--high button--icon button--filter">
{{ function('pll_e', 'Фильтры') }}

Loading…
Cancel
Save