'; echo 'Home'; echo '>'; echo '' . get_the_title() . ''; echo ''; } // 1. Создание таблицы при инициализации add_action('init', 'epic_check_and_create_leads_table'); function epic_check_and_create_leads_table() { global $wpdb; $table_name = $wpdb->prefix . 'epic_leads'; if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) { $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, name tinytext NOT NULL, phone tinytext NOT NULL, message text, form_subject tinytext NOT NULL, status tinyint(1) DEFAULT 0 NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } } // 2. Пункт меню со счетчиком add_action('admin_menu', 'epic_leads_menu'); function epic_leads_menu() { global $wpdb; $table_name = $wpdb->prefix . 'epic_leads'; $new_count = $wpdb->get_var("SELECT COUNT(*) FROM $table_name WHERE status = 0"); $title = $new_count > 0 ? "Requests $new_count" : "Requests"; add_menu_page('Service Requests', $title, 'manage_options', 'epic-leads', 'epic_leads_page', 'dashicons-email-alt', 25); } // 3. Интерфейс админки (Пагинация + Массовое удаление) function epic_leads_page() { global $wpdb; $table_name = $wpdb->prefix . 'epic_leads'; $per_page = 30; // ОБРАБОТКА ДЕЙСТВИЙ if (isset($_GET['delete']) && check_admin_referer('delete_lead_' . $_GET['delete'])) { $wpdb->delete($table_name, ['id' => intval($_GET['delete'])]); echo '

Request deleted.

'; } if (isset($_POST['bulk_action']) && $_POST['bulk_action'] == 'delete' && isset($_POST['lead_ids'])) { check_admin_referer('bulk_leads_deletion'); $ids = array_map('intval', $_POST['lead_ids']); $wpdb->query("DELETE FROM $table_name WHERE id IN (" . implode(',', $ids) . ")"); echo '

Selected requests deleted.

'; } $wpdb->update($table_name, ['status' => 1], ['status' => 0]); // ПАГИНАЦИЯ И ФИЛЬТРЫ $current_page = isset($_GET['paged']) ? max(1, intval($_GET['paged'])) : 1; $offset = ($current_page - 1) * $per_page; $date_filter = isset($_GET['filter_date']) ? sanitize_text_field($_GET['filter_date']) : ''; $where = $date_filter ? $wpdb->prepare(" WHERE DATE(time) = %s", $date_filter) : ""; $total_items = $wpdb->get_var("SELECT COUNT(*) FROM $table_name $where"); $total_pages = ceil($total_items / $per_page); $results = $wpdb->get_results("SELECT * FROM $table_name $where ORDER BY time DESC LIMIT $per_page OFFSET $offset"); echo '

Service Requests


'; // Форма фильтра echo '
Filter by date: Reset
'; echo '
'; wp_nonce_field('bulk_leads_deletion'); echo '
'; if ($total_pages > 1) { $page_links = paginate_links([ 'base' => add_query_arg('paged', '%#%'), 'format' => '', 'prev_text' => '«', 'next_text' => '»', 'total' => $total_pages, 'current' => $current_page, ]); echo '
' . $page_links . '
'; } echo '
'; echo ''; if ($results) { foreach ($results as $row) { $delete_url = wp_nonce_url("?page=epic-leads&delete={$row->id}", 'delete_lead_' . $row->id); echo ""; } } else { echo ''; } echo '
Date Name Phone Message Form Type Actions
" . date('d.m.Y H:i', strtotime($row->time)) . " " . esc_html($row->name) . " " . esc_html($row->phone) . " " . nl2br(esc_html($row->message)) . " " . esc_html($row->form_subject) . " Delete
No requests found.
'; } // 4. AJAX Обработчик add_action('wp_ajax_send_request', 'epic_handle_request'); add_action('wp_ajax_nopriv_send_request', 'epic_handle_request'); function epic_handle_request() { global $wpdb; $name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : ''; $phone = isset($_POST['phone']) ? sanitize_text_field($_POST['phone']) : ''; $message = isset($_POST['message']) ? sanitize_textarea_field($_POST['message']) : ''; $subject = isset($_POST['subject']) ? sanitize_text_field($_POST['subject']) : 'Request form'; if (empty($name) || empty($phone)) { wp_send_json_error('Name and Phone are required.'); } $inserted = $wpdb->insert($wpdb->prefix . 'epic_leads', [ 'time' => current_time('mysql'), 'name' => $name, 'phone' => $phone, 'message' => $message, 'form_subject' => $subject, 'status' => 0 ]); if ($inserted) { $admin_email = get_option('admin_email'); $headers = array('Content-Type: text/html; charset=UTF-8'); $email_body = "

New Request: $subject

Name: $name

Phone: $phone

Message:
$message

"; wp_mail($admin_email, "🔥 New Lead: $subject", $email_body, $headers); wp_send_json_success(); } else { wp_send_json_error('Database error.'); } } function tt21_child_customize_register( $wp_customize ) { $wp_customize->add_section( 'tt21_contacts_section', array( 'title' => __( 'Contacts', 'twentytwentyone-child' ), 'priority' => 30, ) ); $fields = array( 'contact_address' => 'Address', 'contact_phone' => 'Phone Number', 'contact_email' => 'Email', 'social_telegram' => 'Telegram Link', 'social_instagram' => 'Instagram Link', 'social_youtube' => 'YouTube Link', ); foreach ( $fields as $id => $label ) { $wp_customize->add_setting( $id, array( 'default' => '', 'sanitize_callback' => 'sanitize_text_field', // Очистка данных ) ); $wp_customize->add_control( $id, array( 'label' => $label, 'section' => 'tt21_contacts_section', 'type' => 'text', ) ); } } add_action( 'customize_register', 'tt21_child_customize_register' );