Создадим самостоятельно корзину товаров. Будем использовать такие технологии как: js (jQuery), localStorage и JSON как формат.
Если очень упростить то нужно сделать следующее:
const myArray = [
{
id: 124,
title: 'Ткань #1',
quantity: 4,
fabric_price: 500,
fabric_height: 2.1,
cornice_length: 1.1,
ceiling_height: 2.4,
image: '/wp-content/webp-express/webp-images/uploads/2024/03/1-1-1-150x150.jpg.webp',
},
{
id: 125,
title: 'Ткань #2',
quantity: 1,
fabric_price: 600,
fabric_height: 2.1,
cornice_length: 1.1,
ceiling_height: 2.4,
image: '/wp-content/webp-express/webp-images/uploads/2024/03/1-2-1-150x150.jpg.webp',
},
];
// преобразовать массив в строку JSON, используя JSON.stringify()
const jsonArray = JSON.stringify(myArray);
// сохраните в localStorage, используя «массив» в качестве ключа и jsonArray в качестве значения
localStorage.setItem('array', jsonArray);
// получить строку JSON из localStorage
const str = localStorage.getItem('array');
// преобразовать строку JSON в соответствующий объект
const parsedArray = JSON.parse(str);
console.log(parsedArray);
т.е. сохраняем параметры корзины в LocalStorage, но далее нужно проработать ряд скриптов по манипулированию данными.
Создание списка корзины и индикатора кол-ва товаров
Создаем массив в localStorage, если он не существует:
// Создаем массив, если он не существует
if (localStorage.getItem("array") === null) {
localStorage.setItem('array', JSON.stringify([]));
}
Основная функция прорисовки списка товаров:
function printCart() {
let myCart = JSON.parse(localStorage.getItem('array')),
renderBlock = document.getElementById('cart-area');
/* Clearing the block before displaying */
renderBlock.innerHTML = '';
if(myCart.length == 0) {
renderBlock.insertAdjacentHTML('beforeEnd', `
<div class="cart-empty">Нет позиций в заказе</div>
`);
} else {
renderBlock.insertAdjacentHTML('beforeEnd', `
<div class="cart-item cart_gui">
<div class="cart-item-image"></div>
<div class="cart-item-name">наименование</div>
<div class="cart-item-quantity">кол-во штор <br>на 1 окно</div>
<div class="cart-item-cornice_length">длина карниза <br>1 окна (м)</div>
<div class="cart-item-ceiling_height">высота от пола до карниза (м)</div>
<div class="cart-item-recomendet">кол-во ткани</div>
<div class="cart-item-total">стоимость</div>
<div class="cart-item-double"></div>
<div class="cart-item-remove"></div>
</div>
`);
total = 0;
/* We withdraw products from the cart */
Array.from(myCart).forEach( function(product) {
if (typeof product.quantity_fabric === "undefined") {
quantity_fabric = product.cornice_length * product.quantity;
} else {
quantity_fabric = product.quantity_fabric;
}
recomendet = Number(product.cornice_length) + (Number(product.quantity) * 0.5);
itemFabricPrice = Number(quantity_fabric) * Number(product.fabric_price);
itemSewingPrice = Number(quantity_fabric) * Number(product.sewing_price);
itemFabricPrice_format = itemFabricPrice.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, " ");
itemSewingPrice_format = itemSewingPrice.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, " ");
itemTotalPrice = itemFabricPrice + itemSewingPrice;
itemTotalPrice_format = itemTotalPrice.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, " "); // округляем, делаем разрядность
renderBlock.insertAdjacentHTML('beforeEnd', `
<div class="cart-item" data-id="${product.id}">
<div class="cart-item-image"><img src="${product.image}" alt="${product.image}"></div>
<div class="cart-item-name">
<a href="${product.url}">${product.title}</a>
<small><span>цена: ${product.fabric_price} ₽</span>, <span>высота: ${product.fabric_height} м</span>, <span>пошив: ${product.sewing_price} ₽</span></small>
</div>
<div class="cart-item-quantity">
<input type="number" class="qty" name="qty" value="${product.quantity}">
</div>
<div class="cart-item-cornice_length">
<input type="number" class="cornice_length" name="cornice_length" value="${product.cornice_length}" min="1" max="100" step="0.1">
</div>
<div class="cart-item-ceiling_height">
<input type="number" class="ceiling_height" name="ceiling_height" value="${product.ceiling_height}" min="1" max="100" step="0.1">
</div>
<div class="cart-item-recomendet">
<input type="number" class="quantity_fabric" name="quantity_fabric" value="${quantity_fabric}" min="1" max="100" step="0.1">
<p>Минимально <br>необходимо <span>${recomendet.toFixed(1)}</span> м</p>
</div>
<div class="cart-item-total">
${itemTotalPrice_format} ₽
<small><span>ткань: ${itemFabricPrice_format} ₽</span>, <span>пошив: ${itemSewingPrice_format} ₽</span></small>
</div>
<div class="cart-item-double"><div onclick="cloneItem(${product.id})" title="дублировать строку">+</div></div>
<div class="cart-item-remove"><div onclick="delFromCart(${product.id})" title="удалить строку">×</div></div>
</div>
`);
total += itemTotalPrice;
});
total_format = total.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, " "); // округляем, делаем разрядность
//Сумма заказа
renderBlock.insertAdjacentHTML('beforeEnd', `
<div id="cart-total">Итого: ${total_format} ₽</div>
`);
//Кнопка Очистить корзину
renderBlock.insertAdjacentHTML('beforeEnd', `
<div class="clearCart"><button class="btn" onclick="clearCart()"><i class="icon-xmark1"></i> Очистить корзину</button></div>
`);
}
}
Корзина будет выводить и обновляться внутри тега div#cart-area.
Функция счетчика товаров:
function printCounter() {
let myCart = JSON.parse(localStorage.getItem('array')),
renderCounter = document.getElementById('cart-counter');
renderCounter.innerHTML = '';
if(myCart.length == 0) {
renderCounter.insertAdjacentHTML('beforeEnd', `0`);
} else {
renderCounter.insertAdjacentHTML('beforeEnd', `${myCart.length}`);
}
}
Изначально загружаем корзину и счетчик, если есть соответствующие тэги на странице.
// Изначально загружаем корзину
jQuery(document).ready(function($) {
if(jQuery("#cart-area").length != 0) { printCart(); }
if(jQuery("#cart-counter").length != 0) { printCounter(); }
});
Функции корзины
Очистить корзину
// Очистить корзину
function clearCart() {
localStorage.setItem('array', JSON.stringify([]));
if(jQuery("#cart-area").length != 0) { printCart(); }
if(jQuery("#cart-counter").length != 0) { printCounter(); }
}
Добавить Позицию в массив
// Добавить Позицию в массив
function add_item(id,title,protype,quantity,image,url,fabric_price,fabric_height,sewing_price,cornice_length,ceiling_height,quantity_fabric) {
id = parseInt(id);
quantity = parseInt(quantity);
let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
existingProducts = angryCartData.find(product => product.id === id);
if( !existingProducts ) {
angryCartData.push({
id: id,
title: title,
protype: protype,
quantity: quantity,
image: image,
url: url,
fabric_price: fabric_price,
fabric_height: fabric_height,
sewing_price: sewing_price,
cornice_length: cornice_length,
ceiling_height: ceiling_height,
quantity_fabric: quantity_fabric,
});
} else {
existingProducts.quantity = existingProducts.quantity + quantity;
}
localStorage.setItem('array', JSON.stringify(angryCartData));
if(jQuery("#cart-area").length != 0) { printCart(); }
if(jQuery("#cart-counter").length != 0) { printCounter(); }
}
Добавление (+1) количества
// Добавление (+1) количества Позиции
function add_qnt(id) {
let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
existingProducts = angryCartData.find(product => product.id === id);
if (existingProducts) {
existingProducts.quantity++;
}
localStorage.setItem('array', JSON.stringify(angryCartData));
if(jQuery("#cart-area").length != 0) { printCart(); }
if(jQuery("#cart-counter").length != 0) { printCounter(); }
}
Уменьшение (-1) количества
// Уменьшение (-1) количества Позиции
function rem_qnt(id) {
let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
existingProducts = angryCartData.find(product => product.id === id);
if ( existingProducts.quantity < 2 ) {
angryCartData.splice(angryCartData.indexOf(existingProducts), 1);
} else {
existingProducts.quantity--;
}
localStorage.setItem('array', JSON.stringify(angryCartData));
if(jQuery("#cart-area").length != 0) { printCart(); }
if(jQuery("#cart-counter").length != 0) { printCounter(); }
}
Изменение количества (полем)
// Изменение количества (полем)
jQuery('body').on('change', '#cart-area input[name="qty"]', function(){
var id = jQuery(this).parents('.cart-item').data('id');
var qty = jQuery(this).val();
let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
existingProducts = angryCartData.find(product => product.id === id);
if (existingProducts) {
if ( qty < 1 ) {
angryCartData.splice( existingProducts, 1 );
} else {
existingProducts.quantity = qty;
}
}
localStorage.setItem('array', JSON.stringify(angryCartData));
if(jQuery("#cart-area").length != 0) { printCart(); }
if(jQuery("#cart-counter").length != 0) { printCounter(); }
});
Также можно изменять любые другие параметры, пример:
// Изменение длины карниза (м) Позиции (поле)
jQuery('body').on('change', '#cart-area input[name="cornice_length"]', function(){
var id = jQuery(this).parents('.cart-item').data('id');
var cornice_length = jQuery(this).val();
let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
existingProducts = angryCartData.find(product => product.id === id);
if (existingProducts) {
if ( cornice_length > 1 ) { // min = 1
existingProducts.cornice_length = cornice_length;
}
}
localStorage.setItem('array', JSON.stringify(angryCartData));
if(jQuery("#cart-area").length != 0) { printCart(); }
if(jQuery("#cart-counter").length != 0) { printCounter(); }
});
Удаление Позиции
// Удаление Позиции
function delFromCart(id) {
let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
existingProducts = angryCartData.find(product => product.id === id);
if (existingProducts) {
// angryCartData.splice( existingProducts, 1 );
angryCartData.splice(angryCartData.indexOf(existingProducts), 1);
}
localStorage.setItem('array', JSON.stringify(angryCartData));
if(jQuery("#cart-area").length != 0) { printCart(); }
if(jQuery("#cart-counter").length != 0) { printCounter(); }
}
Дублирование Позиции
// Дублирование Позиции
function cloneItem(id) {
let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
existingProducts = angryCartData.find(product => product.id === id);
if (existingProducts) {
angryCartData.push({
id: jQuery.now(),
title: existingProducts.title,
protype: existingProducts.protype,
quantity: existingProducts.quantity,
image: existingProducts.image,
url: existingProducts.url,
fabric_price: existingProducts.fabric_price,
fabric_height: existingProducts.fabric_height,
sewing_price: existingProducts.sewing_price,
cornice_length: existingProducts.cornice_length,
ceiling_height: existingProducts.ceiling_height,
quantity_fabric: existingProducts.quantity_fabric,
});
}
localStorage.setItem('array', JSON.stringify(angryCartData));
printCart();
printCounter();
}
Функции добавления товаров в корзину
Эти функции приведены как пример, т.к. все зависит от конкретной верстки.
Верстка:
<form id="order-params" class="form-container form-label">
<div class="form-field col-6">
<label><span>Цена (руб. за пог.м)</span>
<div class="form-field-wrap">
<input type="text" name="fabric_price" value="<?php echo $term_meta['fabric_price']; ?>" disabled>
</div>
</label>
</div>
<div class="form-field col-6">
<label><span>Высота ткани (м)</span>
<div class="form-field-wrap">
<input type="text" name="fabric_height" value="<?php echo $term_meta['fabric_height']; ?>" disabled>
</div>
</label>
</div>
<div class="form-field col-6">
<label><span>Цена пошива (руб.)</span>
<div class="form-field-wrap">
<input type="text" name="sewing_price" value="<?php echo $term_meta['sewing_price']; ?>" disabled>
</div>
</label>
</div>
<div class="quantity hidden">Количество <input type="number" name="quantity" value="1" min="1" max="1000"></div>
<div class="cornice_length hidden">Длина корниза (м) <input type="number" name="cornice_length" value="1" min="1" max="100" step="0.1"></div>
<div class="ceiling_height hidden">Высота потолков (м) <input type="number" name="ceiling_height" value="1" min="1" max="100" step="0.1"></div>
<div class="quantity_fabric hidden">Количество ткани <input type="number" name="quantity_fabric" value="1" min="1" max="100" step="0.1"></div>
<div class="form-field col-12">
<label class="submit">
<div class="submit-ajax submit-container">
<input class="btn submit-button" type="submit" value="Добавить в заказ"/>
</div>
</label>
</div>
<div class="notice"></div>
<p>Для уточнения количества ткани Вам нужно перейти в заказ:</p>
<a class="btn" href="/checkout/">Перейти в заказ</a>
</form>
Функция добавления:
// Добавление товара (из карточки)
jQuery('#order-params').on('submit', function(event){
event.preventDefault();
var id = jQuery.now();
var title = jQuery('h1').text();
var protype = jQuery(this).find('input[name="protype"]').val();
var quantity = jQuery(this).find('input[name="quantity"]').val();
var image = jQuery('.colors .item:first-child img').attr('src');
var url = location.pathname;
var fabric_price = jQuery(this).find('input[name="fabric_price"]').val();
var fabric_height = jQuery(this).find('input[name="fabric_height"]').val();
var sewing_price = jQuery(this).find('input[name="sewing_price"]').val();
var cornice_length = jQuery(this).find('input[name="cornice_length"]').val();
var ceiling_height = jQuery(this).find('input[name="ceiling_height"]').val();
var quantity_fabric = jQuery(this).find('input[name="quantity_fabric"]').val();
add_item(id,title,protype,quantity,image,url,fabric_price,fabric_height,sewing_price,cornice_length,ceiling_height,quantity_fabric);
jQuery(this).find('.notice').text('Вы добавили ткань «' + title + '» в свой заказ.');
setTimeout(function () {
jQuery('#order-params .notice').empty();
}, 3000);
});
Оформление заказа
Далее, при оформлении заказа, необходимо передать эту корзину в виде заказа. Форма может быть абсолютна любая, корзину мы будем брать из localStorage.
<form id="form_checkout" class="form-container recall-form-validate send-cart" data-theme="Заказ тканей"><div class="row">
<input class="form-first-name" type="hidden" name="first_name" placeholder="Ваше имя" value="" maxlength="60">
<div class="form-field col-612">
<label><span>ФИО <small>*</small></span>
<div class="form-field-wrap">
<input class="form-name required" type="text" name="name" placeholder="ФИО *" maxlength="60">
</div>
</label>
</div>
<div class="form-field col-6">
<label><span>Телефон <small>*</small></span>
<div class="form-field-wrap">
<input class="form-phone required" type="text" name="phone" placeholder="Телефон *" maxlength="20">
</div>
</label>
</div>
<div class="form-field col-6">
<label><span>E-mail <small>*</small></span>
<div class="form-field-wrap">
<input class="form-email required" type="text" name="email" placeholder="E-mail" maxlength="30">
</div>
</label>
</div>
<div class="form-field col-12 radio-buttons">
<span>Предпочтительная форма связи: </span>
<div class="group-labels">
<label><input type="radio" name="connect" value="Телефон" checked="checked">Телефон</label>
<label><input type="radio" name="connect" value="WhatsApp">WhatsApp</label>
<label><input type="radio" name="connect" value="Telegram">Telegram</label>
</div>
</div>
<div class="form-field col-12">
<label><span>Комментарий</span>
<div class="form-field-wrap">
<textarea class="form-quest" name="quest" cols="40" rows="4" aria-required="true" placeholder="Комментарий к заказу" maxlength="600"></textarea>
</div>
</label>
</div>
<div class="form-field col-12">
<label class="acceptance">
<span></span>
<div class="form-field-wrap">
<div>
<input type="checkbox" class="required" name="acceptance" checked>
<small>Я согласен на обработку персональных данных согласно <a href="/kontakty/politika-konfidentsialnosti/" target="_blank">Политики конфиденциальности</a></small>
</div>
</div>
</label>
</div>
<div class="form-field col-12">
<label class="submit">
<span></span>
<div class="submit-ajax submit-container">
<input class="submit-button" type="submit" value="Отправить"/>
</div>
</label>
</div>
<div class="notice"></div>
</div></form>
Функция отправки заказа
// Отправка заявки
jQuery('.recall-form-validate').on('submit', function (event) {
event.preventDefault();
var form = jQuery(this);
var name = jQuery(form).find('.form-name');
var phone = jQuery(form).find('.form-phone');
var email = jQuery(form).find('.form-email');
var quest = jQuery(form).find(".form-quest");
var theme = jQuery(form).attr('data-theme');
var form_id = jQuery(form).attr('data-id');
var object = jQuery('h1').text();
//Получение значения выбранного radio
var connect = jQuery(form).find('input[name="connect"]:checked').val();
if (jQuery(this).hasClass('send-cart')) {
var cartData = localStorage.getItem('array');
// console.log(cartData);
}
// Защита от СПАМа
var first_name = jQuery(form).find('.form-first-name');
if( !first_name.val().length == 0 ) {
jQuery(form).find(".submit-ajax").html('');
return false;
}
// Изначально очищаем уведомления под полями
jQuery(form).find('.warning').remove();
// Общая проверка текстовых полей (+textarea)
jQuery(form).find('input[type="text"].required, textarea.required').each(function() {
if (jQuery(this).val() === '') {
jQuery(this).removeClass('filled').addClass('not-filled');
} else {
jQuery(this).removeClass('not-filled').addClass('filled');
}
});
// Проверка имени
if ((jQuery(name).hasClass('required')) && (jQuery(name).val() === '')) {
jQuery(name).after('<div class="warning">Напишите Ваше имя</div>');
}
// Проверка телефона
if ((jQuery(phone).hasClass('required')) && (jQuery(phone).val() === '')) {
jQuery(phone).after('<div class="warning">Заполните поле с номером телефона</div>');
} else if ((jQuery(phone).hasClass('required')) && (jQuery(phone).val().length < 8)) {
jQuery(phone).removeClass('filled').addClass('not-filled');
jQuery(phone).after('<div class="warning">Слишком короткий номер</div>');
} else if ((jQuery(phone).hasClass('required')) && (!((jQuery(phone).val().lastIndexOf("+7", 0) === 0) || (jQuery(phone).val().lastIndexOf("8", 0) === 0)))) {
jQuery(phone).removeClass('filled').addClass('not-filled');
jQuery(phone).after('<div class="warning">Введите корректный номер в формате +79998887766 или 89998887766</div>');
} else {
jQuery(phone).removeClass('not-filled').addClass('filled');
}
// Проверка E-mail
if ((jQuery(email).hasClass('required')) && (jQuery(email).val() === '')) {
jQuery(email).after('<div class="warning">Заполните поле с E-mail</div>');
} else if ((jQuery(email).hasClass('required')) && !validateEmail(jQuery(email).val())) {
jQuery(email).removeClass('filled').addClass('not-filled');
jQuery(email).after('<div class="warning">Введите корректный E-Mail</div>');
} else {
jQuery(email).removeClass('not-filled').addClass('filled');
}
// Проверка комментария
if ((jQuery(quest).hasClass('required')) && (jQuery(quest).val() === '')) {
jQuery(quest).after('<div class="warning">Напишите кратко свой вопрос</div>');
}
// Проверка обработки персональных данных
if ( jQuery(form).find('input:checkbox[name="acceptance"]').hasClass('required') ) {
if ( !jQuery(form).find('input:checkbox[name="acceptance"]').is(':checked') ) {
jQuery(form).find('input:checkbox[name="acceptance"]').parent().removeClass('filled').addClass('not-filled');
jQuery(form).find('input:checkbox[name="acceptance"]').parent().after('<div class="warning">Вы должны согласится на обработку персональных данных</div>');
} else {
jQuery(form).find('input:checkbox[name="acceptance"]').parent().removeClass('not-filled').addClass('filled');
}
}
// Отправка формы
if ( jQuery(form).find("*").hasClass('not-filled') ) {
jQuery(form).find(".notice").html('Заполните обязательные поля');
} else {
jQuery(form).find(".notice").html('');
jQuery.ajax({
url: "/wp-admin/admin-ajax.php",
method: 'post',
data: {
action: 'feedback',
name: name.val(),
phone: phone.val(),
email: email.val(),
quest: quest.val(),
theme: theme,
form_id: form_id,
object: object,
connect: connect,
cartData: cartData
},
success: function (response) {
jQuery(form).find(".submit-ajax").html(response);
clearCart();
}
});
// setTimeout(function () {
// jQuery.fancybox.close();
// }, 2000);
}
});
// Проверка E-mail
function validateEmail($email) {
var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
return emailReg.test( $email );
}
Отправка письма с заказом
// Отправка формы
function feedback_send(){
$name = sanitize_text_field( $_REQUEST['name'] );
$phone = sanitize_text_field( $_REQUEST['phone'] );
$email = sanitize_email( $_REQUEST['email'] );
$quest = sanitize_textarea_field( $_REQUEST['quest'] );
$theme = sanitize_textarea_field( $_REQUEST['theme'] );
$form_id = sanitize_text_field( $_REQUEST['form_id'] );
$object = sanitize_text_field( $_REQUEST['object'] );
$connect = sanitize_text_field( $_REQUEST['connect'] );
$cartData = $_REQUEST['cartData'];
$mail_to = get_post_meta($form_id, 'destination', 1);
if (empty($mail_to)) { $mail_to = 'mail@site.ru'; }
$msg = "<table class='letter'><tbody><tr><td class='name'>Имя:</td><td>$name</td></tr>";
if (!empty($phone)) { $msg .= "<tr><td class='name'>Телефон:</td><td>$phone</td></tr>"; }
if (!empty($email)) { $msg .= "<tr><td class='name'>E-Mail:</td><td>$email</td></tr>"; }
$msg .= "<tr><td colspan='2'></td></tr>";
if (!empty($quest)) { $msg .= "<tr><td class='name'>Вопрос:</td><td>$quest</td></tr>"; }
if (!empty($cartData)) {
$cartData_json = str_replace('\"', '"', $cartData);
$cartData_arr = json_decode($cartData_json, true);
$cartData_arr_count = count($cartData_arr);
$total = 0;
$msg .= "<tr><td colspan='2'></td></tr>";
$i = 1;
foreach($cartData_arr as $array) {
$itemFabricPrice = $array['quantity_fabric'] * $array['fabric_price'];
$itemSewingPrice = $array['quantity_fabric'] * $array['sewing_price'];
$itemTotalPrice = $itemFabricPrice + $itemSewingPrice;
$itemTotalPrice_format = number_format(round($itemTotalPrice, 0), 0, '', ' ');
$total += $itemTotalPrice;
$msg .= "<tr>";
if ($i == 1) {
$msg .= "<td rowspan='$cartData_arr_count' class='name'>Состав заказа:</td>";
}
$msg .= "<td>";
$msg .= "<img src='".$array['image']."' width='35'>";
$msg .= "<div class='text'>".$array['title']." <br>
кол-во штор на 1 окно: <strong>".$array['quantity']." шт </strong><br>
длина карниза 1 окна: <strong>".$array['cornice_length']." м </strong><br>
высота от пола до карниза: <strong>".$array['ceiling_height']." м </strong><br>
кол-во ткани: <strong>".$array['quantity_fabric']." м</strong><br>";
$msg .= "цена: <strong>".$itemTotalPrice_format." ₽</strong>";
$msg .= "</td>";
$msg .= "</tr>";
$i++;
}
$msg .= "<tr>";
$msg .= "<td class='name'>Итого:</td><td>".number_format(round($total, 0), 0, '', ' ')." ₽</td>";
$msg .= "</tr>";
}
$msg .= "<tr><td colspan='2'></td></tr>";
if (!empty($connect)) { $msg .= "<tr><td class='name'>Форма связи:</td><td>$connect</td></tr>"; }
if (!empty($object)) { $msg .= "<tr><td class='name'>Страница:</td><td>$object</td></tr>"; } else { $msg .= "<tr><td class='name'>Страница:</td><td>Главная</td></tr>"; }
$msg .= "</tbody></table>";
$msg .= "<style>.letter {max-width: 600px; border-collapse: collapse; margin-bottom: 30px;} .letter td {border: 1px solid #eee; padding: 7px 20px;} .letter td.name {color: #ccc;}</style>";
$headers = "Content-Type: text/html; charset=utf-8\n";
$headers .= 'From: '.get_bloginfo().' <no-replay@'.$_SERVER['HTTP_HOST'].'>' . "\r\n";
$response = '';
// Отправляем почтовое сообщение
if(wp_mail($mail_to, $theme, $msg, $headers)) {
$response = 'Сообщение отправлено. <br>Мы свяжемся с вами в ближайшее время.';
// Сохраняем отправленные формы в БД
global $wpdb;
$tablename = $wpdb->prefix."send_forms";
$form_date = date("Y-m-d H:i:s");
$wpdb->insert($tablename, array(
'form_date' => $form_date,
'form_theme' => $theme,
'form_name' => $name,
'form_email' => $email,
'form_phone' => $phone,
'form_quest' => $quest,
) );
} else {
$response = 'Ошибка при отправке.';
}
// Сообщение о результате отправки почты
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ){
echo $response;
wp_die();
}
}
add_action('wp_ajax_nopriv_feedback', 'feedback_send' );
add_action('wp_ajax_feedback', 'feedback_send' );
[site-socialshare]