diff --git a/index3.js b/index3.js index 5c9e76d2..5e6946f6 100644 --- a/index3.js +++ b/index3.js @@ -22,6 +22,7 @@ const mobileToggle = document.getElementById('mobileToggle') const orderSuccess = document.getElementById('orderSuccess') const contactSuccess = document.getElementById('contactSuccess') const wooCommerceConfig = window.test1WooCommerce || null + const leadFormConfig = window.test1LeadForm || null const cartPageUrl = (wooCommerceConfig && wooCommerceConfig.cartUrl) ? wooCommerceConfig.cartUrl : '/cart/' const checkoutPageUrl = (wooCommerceConfig && wooCommerceConfig.checkoutUrl) ? wooCommerceConfig.checkoutUrl : '/checkout/' const cartPanel = cartDrawer?.querySelector('.cart-panel') @@ -138,6 +139,52 @@ const mobileToggle = document.getElementById('mobileToggle') }) } + const submitLeadForm = (formElement, successElement, formType, onSuccess) => { + if (!formElement || !successElement) { + return + } + + formElement.addEventListener('submit', async event => { + event.preventDefault() + + if (!leadFormConfig?.ajaxUrl || !leadFormConfig?.action || !leadFormConfig?.nonce) { + window.alert('Форма временно недоступна. Обновите страницу и попробуйте снова.') + return + } + + const formData = new window.FormData(formElement) + formData.append('action', leadFormConfig.action) + formData.append('nonce', leadFormConfig.nonce) + formData.append('form_type', formType) + + try { + const response = await window.fetch(leadFormConfig.ajaxUrl, { + method: 'POST', + credentials: 'same-origin', + body: formData, + }) + + const payload = await response.json().catch(() => null) + + if (!response.ok || !payload?.success) { + throw new Error('submit_failed') + } + + successElement.classList.add('visible') + if (typeof onSuccess === 'function') { + onSuccess() + } + + setTimeout(() => { + formElement.reset() + successElement.classList.remove('visible') + }, 2200) + } catch (error) { + window.alert('Не удалось отправить заявку. Попробуйте еще раз.') + } + }) + } + mobileToggle.addEventListener('click', () => { const isOpen = mobilePanel.classList.contains('active') if (isOpen) { @@ -272,26 +319,15 @@ const mobileToggle = document.getElementById('mobileToggle') }) }) - orderForm.addEventListener('submit', event => { - event.preventDefault() - orderSuccess.classList.add('visible') + submitLeadForm(orderForm, orderSuccess, 'landing_order', () => { cart = [] renderCart() setTimeout(() => { closeModal() - orderForm.reset() - orderSuccess.classList.remove('visible') - }, 1800) + }, 700) }) - contactForm.addEventListener('submit', event => { - event.preventDefault() - contactSuccess.classList.add('visible') - setTimeout(() => { - contactForm.reset() - contactSuccess.classList.remove('visible') - }, 2200) - }) + submitLeadForm(contactForm, contactSuccess, 'contacts') document.addEventListener('keydown', event => { if (event.key !== 'Escape') { diff --git a/wp-config.php b/wp-config.php index 8f4f0244..8ae4f7b2 100644 --- a/wp-config.php +++ b/wp-config.php @@ -81,6 +81,8 @@ $table_prefix = 'wp_'; define( 'WP_DEBUG', false ); /* Произвольные значения добавляйте между этой строкой и надписью "дальше не редактируем". */ +define( 'TWENTYTWENTYFOUR_TELEGRAM_BOT_TOKEN', '8607238298:AAH_dZ-EgzFOpT0LtmYuiy4ifcsvLZxXwPk' ); +define( 'TWENTYTWENTYFOUR_TELEGRAM_CHAT_ID', '-1003995055932' ); diff --git a/wp-content/themes/twentytwentyfour/assets/js/test1-contacts.js b/wp-content/themes/twentytwentyfour/assets/js/test1-contacts.js index b2474f9b..eff10c9c 100644 --- a/wp-content/themes/twentytwentyfour/assets/js/test1-contacts.js +++ b/wp-content/themes/twentytwentyfour/assets/js/test1-contacts.js @@ -1,18 +1,46 @@ (() => { const contactForm = document.getElementById('contactForm') const contactSuccess = document.getElementById('contactSuccess') + const formConfig = window.test1ContactsForm || null if (!contactForm || !contactSuccess) { return } - contactForm.addEventListener('submit', event => { + contactForm.addEventListener('submit', async event => { event.preventDefault() - contactSuccess.classList.add('visible') - setTimeout(() => { - contactForm.reset() - contactSuccess.classList.remove('visible') - }, 2200) + if (!formConfig?.ajaxUrl || !formConfig?.action || !formConfig?.nonce) { + window.alert('Форма временно недоступна. Обновите страницу и попробуйте снова.') + return + } + + const formData = new window.FormData(contactForm) + formData.append('action', formConfig.action) + formData.append('nonce', formConfig.nonce) + formData.append('form_type', 'contacts') + + try { + const response = await window.fetch(formConfig.ajaxUrl, { + method: 'POST', + credentials: 'same-origin', + body: formData, + }) + + const payload = await response.json().catch(() => null) + + if (!response.ok || !payload?.success) { + throw new Error('submit_failed') + } + + contactSuccess.classList.add('visible') + + setTimeout(() => { + contactForm.reset() + contactSuccess.classList.remove('visible') + }, 2200) + } catch (error) { + window.alert('Не удалось отправить заявку. Попробуйте еще раз.') + } }) })() diff --git a/wp-content/themes/twentytwentyfour/functions.php b/wp-content/themes/twentytwentyfour/functions.php index 2b7693a8..236ec743 100644 --- a/wp-content/themes/twentytwentyfour/functions.php +++ b/wp-content/themes/twentytwentyfour/functions.php @@ -493,6 +493,16 @@ function twentytwentyfour_test1_assets() { true ); + wp_localize_script( + 'twentytwentyfour-test1-script', + 'test1LeadForm', + array( + 'ajaxUrl' => admin_url( 'admin-ajax.php' ), + 'action' => 'twentytwentyfour_submit_lead', + 'nonce' => wp_create_nonce( 'twentytwentyfour_submit_lead' ), + ) + ); + if ( class_exists( 'WooCommerce' ) ) { wp_localize_script( 'twentytwentyfour-test1-script', @@ -531,12 +541,190 @@ function twentytwentyfour_test1_assets() { (string) filemtime( $contacts_js_file ), true ); + + wp_localize_script( + 'twentytwentyfour-test1-contacts-script', + 'test1ContactsForm', + array( + 'ajaxUrl' => admin_url( 'admin-ajax.php' ), + 'action' => 'twentytwentyfour_submit_lead', + 'nonce' => wp_create_nonce( 'twentytwentyfour_submit_lead' ), + ) + ); } } } add_action( 'wp_enqueue_scripts', 'twentytwentyfour_test1_assets', 100 ); +/** + * Send a formatted message to Telegram. + * + * Configure credentials in wp-config.php: + * define( 'TWENTYTWENTYFOUR_TELEGRAM_BOT_TOKEN', '...' ); + * define( 'TWENTYTWENTYFOUR_TELEGRAM_CHAT_ID', '...' ); + * + * @param string $title Message title. + * @param array $fields Key-value pairs for message rows. + * @return bool + */ +function twentytwentyfour_send_telegram_message( $title, $fields ) { + $token = defined( 'TWENTYTWENTYFOUR_TELEGRAM_BOT_TOKEN' ) ? (string) constant( 'TWENTYTWENTYFOUR_TELEGRAM_BOT_TOKEN' ) : ''; + $chat_id = defined( 'TWENTYTWENTYFOUR_TELEGRAM_CHAT_ID' ) ? (string) constant( 'TWENTYTWENTYFOUR_TELEGRAM_CHAT_ID' ) : ''; + + if ( '' === trim( $token ) || '' === trim( $chat_id ) ) { + return false; + } + + $rows = array(); + $rows[] = '' . esc_html( wp_strip_all_tags( (string) $title ) ) . ''; + + foreach ( $fields as $label => $value ) { + $clean_value = trim( wp_strip_all_tags( (string) $value ) ); + + if ( '' === $clean_value ) { + continue; + } + + $rows[] = '' . esc_html( wp_strip_all_tags( (string) $label ) ) . ': ' . esc_html( $clean_value ); + } + + $response = wp_remote_post( + 'https://api.telegram.org/bot' . rawurlencode( $token ) . '/sendMessage', + array( + 'timeout' => 12, + 'body' => array( + 'chat_id' => $chat_id, + 'parse_mode' => 'HTML', + 'text' => implode( "\n", $rows ), + ), + ) + ); + + if ( is_wp_error( $response ) ) { + return false; + } + + $status_code = (int) wp_remote_retrieve_response_code( $response ); + + return $status_code >= 200 && $status_code < 300; +} + +/** + * Handle AJAX lead submissions from landing and contacts forms. + * + * @return void + */ +function twentytwentyfour_submit_lead_ajax() { + if ( ! check_ajax_referer( 'twentytwentyfour_submit_lead', 'nonce', false ) ) { + wp_send_json_error( array( 'message' => __( 'Ошибка проверки формы. Обновите страницу и попробуйте снова.', 'twentytwentyfour' ) ), 403 ); + } + + $form_type = isset( $_POST['form_type'] ) ? sanitize_key( wp_unslash( $_POST['form_type'] ) ) : 'contacts'; + + if ( 'landing_order' === $form_type ) { + $name = isset( $_POST['customerName'] ) ? sanitize_text_field( wp_unslash( $_POST['customerName'] ) ) : ''; + $phone = isset( $_POST['customerPhone'] ) ? sanitize_text_field( wp_unslash( $_POST['customerPhone'] ) ) : ''; + $address = isset( $_POST['customerAddress'] ) ? sanitize_text_field( wp_unslash( $_POST['customerAddress'] ) ) : ''; + $type = isset( $_POST['customerType'] ) ? sanitize_text_field( wp_unslash( $_POST['customerType'] ) ) : ''; + $comment = isset( $_POST['customerOrder'] ) ? sanitize_textarea_field( wp_unslash( $_POST['customerOrder'] ) ) : ''; + + if ( '' === $name || '' === $phone ) { + wp_send_json_error( array( 'message' => __( 'Укажите имя и телефон.', 'twentytwentyfour' ) ), 422 ); + } + + $sent = twentytwentyfour_send_telegram_message( + 'Новая заявка с главной страницы', + array( + 'Имя' => $name, + 'Телефон' => $phone, + 'Адрес' => $address, + 'Тип' => $type, + 'Комментарий' => $comment, + 'Источник' => home_url( '/' ), + ) + ); + } else { + $name = isset( $_POST['name'] ) ? sanitize_text_field( wp_unslash( $_POST['name'] ) ) : ''; + $phone = isset( $_POST['phone'] ) ? sanitize_text_field( wp_unslash( $_POST['phone'] ) ) : ''; + $address = isset( $_POST['address'] ) ? sanitize_text_field( wp_unslash( $_POST['address'] ) ) : ''; + $comment = isset( $_POST['comment'] ) ? sanitize_textarea_field( wp_unslash( $_POST['comment'] ) ) : ''; + + if ( '' === $name || '' === $phone ) { + wp_send_json_error( array( 'message' => __( 'Укажите имя и телефон.', 'twentytwentyfour' ) ), 422 ); + } + + $sent = twentytwentyfour_send_telegram_message( + 'Новая заявка с страницы Контакты', + array( + 'Имя' => $name, + 'Телефон' => $phone, + 'Адрес' => $address, + 'Комментарий' => $comment, + 'Источник' => home_url( '/contacts/' ), + ) + ); + } + + if ( ! $sent ) { + wp_send_json_error( array( 'message' => __( 'Не удалось отправить заявку. Проверьте настройки Telegram.', 'twentytwentyfour' ) ), 500 ); + } + + wp_send_json_success( array( 'message' => __( 'Спасибо! Заявка принята.', 'twentytwentyfour' ) ) ); +} +add_action( 'wp_ajax_twentytwentyfour_submit_lead', 'twentytwentyfour_submit_lead_ajax' ); +add_action( 'wp_ajax_nopriv_twentytwentyfour_submit_lead', 'twentytwentyfour_submit_lead_ajax' ); + +/** + * Send WooCommerce checkout orders to Telegram. + * + * @param int $order_id Order ID. + * @param array $posted_data Checkout payload. + * @param WC_Order $order Order object. + * @return void + */ +function twentytwentyfour_send_checkout_order_to_telegram( $order_id, $posted_data, $order ) { + if ( ! $order instanceof WC_Order ) { + return; + } + + $items = array(); + + foreach ( $order->get_items() as $item ) { + if ( ! $item instanceof WC_Order_Item_Product ) { + continue; + } + + $items[] = sprintf( '%s x %d', $item->get_name(), (int) $item->get_quantity() ); + } + + $address_parts = array_filter( + array( + $order->get_billing_city(), + $order->get_billing_address_1(), + (string) get_post_meta( $order_id, '_billing_house', true ), + (string) get_post_meta( $order_id, '_billing_flat', true ), + (string) get_post_meta( $order_id, '_billing_entrance_floor', true ), + ) + ); + + $fields = array( + 'Заказ' => '#' . $order->get_order_number(), + 'Имя' => $order->get_billing_first_name(), + 'Телефон' => $order->get_billing_phone(), + 'Адрес' => implode( ', ', $address_parts ), + 'Когда доставить' => (string) get_post_meta( $order_id, '_tw_delivery_day', true ), + 'Интервал' => (string) get_post_meta( $order_id, '_tw_delivery_time', true ), + 'Обмен тары' => (string) get_post_meta( $order_id, '_tw_bottle_exchange', true ), + 'Комментарий' => $order->get_customer_note(), + 'Состав' => implode( '; ', $items ), + 'Сумма' => wp_strip_all_tags( $order->get_formatted_order_total() ), + ); + + twentytwentyfour_send_telegram_message( 'Новый заказ с сайта', $fields ); +} +add_action( 'woocommerce_checkout_order_processed', 'twentytwentyfour_send_checkout_order_to_telegram', 20, 3 ); + /** * Enqueue shared test1 header/footer styles for cart and checkout. * diff --git a/wp-content/themes/twentytwentyfour/send-telegram.php b/wp-content/themes/twentytwentyfour/send-telegram.php new file mode 100644 index 00000000..285ed9a6 --- /dev/null +++ b/wp-content/themes/twentytwentyfour/send-telegram.php @@ -0,0 +1,38 @@ + $name, + 'Телефон:' => $phone + ); + + //Настраиваем внешний вид сообщения в телеграме + foreach($arr as $key => $value) { + $txt .= "".$key." ".$value."%0A"; + }; + + //Передаем данные боту + $sendToTelegram = fopen("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&parse_mode=html&text={$txt}","r"); + + //Выводим сообщение об успешной отправке + if ($sendToTelegram) { + echo 'Спасибо! Ваша заявка принята. Мы свяжемся с вами в ближайшее время.'; + }else{ + echo 'Что-то пошло не так. Попробуйте отправить форму ещё раз.'; + } +} + +?> \ No newline at end of file