table_name = $wpdb->prefix . 'blynex_contact_submissions'; // Register activation hook to create table register_activation_hook(get_template_directory() . '/functions.php', [$this, 'create_submissions_table']); // Create table on theme activation add_action('after_switch_theme', [$this, 'create_submissions_table']); // Handle AJAX form submission add_action('wp_ajax_blynex_contact_form_submit', [$this, 'handle_form_submission']); add_action('wp_ajax_nopriv_blynex_contact_form_submit', [$this, 'handle_form_submission']); // Add admin menu for viewing submissions add_action('admin_menu', [$this, 'add_admin_menu']); // Enqueue scripts for frontend add_action('wp_enqueue_scripts', [$this, 'enqueue_frontend_scripts']); } /** * Create submissions database table */ public function create_submissions_table() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); // Use more explicit SQL to ensure compatibility $sql = "CREATE TABLE {$this->table_name} ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL DEFAULT '', email varchar(255) NOT NULL DEFAULT '', phone varchar(50) DEFAULT NULL, subject varchar(500) DEFAULT NULL, message text NOT NULL, ip_address varchar(100) DEFAULT NULL, user_agent text DEFAULT NULL, submitted_at datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY email (email), KEY submitted_at (submitted_at) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } /** * Enqueue frontend scripts */ public function enqueue_frontend_scripts() { // Enqueue contact form script wp_enqueue_script( 'blynex-contact-form', get_template_directory_uri() . '/assets/js/contact-form.js', [], wp_get_theme()->get('Version'), true ); // Localize script with AJAX data wp_localize_script('blynex-contact-form', 'blynexContactForm', [ 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('blynex_contact_form'), 'successMessage' => __('Thank you! Your message has been sent successfully.', 'blynex'), 'errorMessage' => __('Sorry, there was an error sending your message. Please try again.', 'blynex'), 'submittingText' => __('Sending...', 'blynex'), ]); } /** * Handle form submission via AJAX */ public function handle_form_submission() { // Verify nonce if (!check_ajax_referer('blynex_contact_form', 'nonce', false)) { wp_send_json_error(['message' => __('Security check failed.', 'blynex')]); return; } // Sanitize and validate input $name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : ''; $email = isset($_POST['email']) ? sanitize_email($_POST['email']) : ''; $phone = isset($_POST['phone']) ? sanitize_text_field($_POST['phone']) : ''; $subject = isset($_POST['subject']) ? sanitize_text_field($_POST['subject']) : ''; $message = isset($_POST['message']) ? sanitize_textarea_field($_POST['message']) : ''; $honeypot = isset($_POST['website']) ? sanitize_text_field($_POST['website']) : ''; // Honeypot check - if filled, it's likely spam if (!empty($honeypot)) { wp_send_json_error(['message' => __('Spam detected.', 'blynex')]); return; } // Validate required fields if (empty($name) || empty($email) || empty($message)) { wp_send_json_error(['message' => __('Please fill in all required fields.', 'blynex')]); return; } // Validate email if (!is_email($email)) { wp_send_json_error(['message' => __('Please enter a valid email address.', 'blynex')]); return; } // Get IP address and user agent $ip_address = $this->get_client_ip(); $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? sanitize_text_field($_SERVER['HTTP_USER_AGENT']) : ''; // Save to database global $wpdb; $inserted = $wpdb->insert( $this->table_name, [ 'name' => $name, 'email' => $email, 'phone' => $phone, 'subject' => $subject, 'message' => $message, 'ip_address' => $ip_address, 'user_agent' => $user_agent, ], ['%s', '%s', '%s', '%s', '%s', '%s', '%s'] ); if ($inserted === false) { wp_send_json_error(['message' => __('Failed to save your message. Please try again.', 'blynex')]); return; } // Send email notification $recipient_email = isset($_POST['recipientEmail']) ? sanitize_email($_POST['recipientEmail']) : get_option('admin_email'); $email_subject = sprintf(__('New Contact Form Submission from %s', 'blynex'), $name); $email_message = sprintf( __("You have received a new contact form submission:\n\nName: %s\nEmail: %s\nPhone: %s\nSubject: %s\n\nMessage:\n%s\n\n---\nIP Address: %s\nSubmitted: %s", 'blynex'), $name, $email, $phone ?: __('Not provided', 'blynex'), $subject ?: __('No subject', 'blynex'), $message, $ip_address, current_time('mysql') ); $headers = [ 'Content-Type: text/plain; charset=UTF-8', 'From: ' . get_bloginfo('name') . ' <' . get_option('admin_email') . '>', 'Reply-To: ' . $name . ' <' . $email . '>', ]; wp_mail($recipient_email, $email_subject, $email_message, $headers); wp_send_json_success([ 'message' => __('Thank you! Your message has been sent successfully.', 'blynex') ]); } /** * Get client IP address */ private function get_client_ip() { $ip = ''; if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } return sanitize_text_field($ip); } /** * Add admin menu for contact form submissions */ public function add_admin_menu() { add_theme_page( __('Contact Submissions', 'blynex'), __('Contact Submissions', 'blynex'), 'manage_options', 'blynex-contact-submissions', [$this, 'display_submissions_page'] ); } /** * Delete a submission */ private function delete_submission($id) { global $wpdb; return $wpdb->delete( $this->table_name, ['id' => (int)$id], ['%d'] ); } /** * Display submissions page in admin (Cryzel style) */ public function display_submissions_page() { // Handle deletion if (isset($_GET['action']) && $_GET['action'] === 'delete' && isset($_GET['id'])) { check_admin_referer('delete_submission_' . $_GET['id']); $this->delete_submission((int)$_GET['id']); echo '
' . __('Submission deleted successfully.', 'blynex') . '
| #id); ?> | name); ?> | email); ?> | phone ?: '—'); ?> | subject ?: '—'); ?> | submitted_at))); ?> |
| name); ?> | |
| email); ?> | |
| phone); ?> | |
| subject); ?> | |
|
message)); ?>
|
|
ip_address); ?> |
|
| submitted_at))); ?> | |
user_agent); ?> |