Plugin Directory

Changeset 3330879


Ignore:
Timestamp:
07/20/2025 10:38:06 AM (7 months ago)
Author:
nexlifycreator
Message:

Critical fix for email delivery issues! Resolves RFC 5322 compliance problem that caused emails to be blocked by Gmail and other providers when using SMTP plugins. Immediate update recommended for all users using SMTP plugins.

Location:
nexlifydesk
Files:
546 added
8 edited

Legend:

Unmodified
Added
Removed
  • nexlifydesk/trunk/email-source/nexlifydesk-email-pipe.php

    r3330751 r3330879  
    9898        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Custom table requires direct query
    9999        $existing_ticket = $wpdb->get_row($wpdb->prepare(
     100            // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Table name is constructed from $wpdb->prefix and is safe
    100101            // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Table name is constructed from $wpdb->prefix and is safe
    101102            "
     
    151152                $subject
    152153            ));
     154            //phpcs:enable
    153155           
    154156            if ($existing_ticket) {
  • nexlifydesk/trunk/includes/class-nexlifydesk-admin.php

    r3330741 r3330879  
    17091709                <?php
    17101710                // Show default template as placeholder if empty
    1711                 $auto_response_content = $templates['email_auto_response'];
     1711                $auto_response_content = isset($templates['email_auto_response']) ? $templates['email_auto_response'] : '';
    17121712                if (empty($auto_response_content)) {
    1713                     $auto_response_content = "Hello {customer_name},\n\nThank you for contacting us. We have received your support request and have assigned it ticket ID #{ticket_id}.\n\nSubject: {subject}\n\nOur support team will review your request and get back to you as soon as possible. You can reference this ticket ID in any future correspondence.\n\nBest regards,\n{site_name} Support Team\n{site_url}";
     1713                    // Default HTML formatted auto-response template
     1714                    $auto_response_content = '<p>Hello {customer_name},</p>
     1715
     1716<p>Thank you for contacting us. We have received your support request and have assigned it ticket ID <strong>#{ticket_id}</strong>.</p>
     1717
     1718<p><strong>Subject:</strong> {subject}</p>
     1719
     1720<p>Our support team will review your request and get back to you as soon as possible. You can reference this ticket ID in any future correspondence.</p>
     1721
     1722<p>Best regards,<br>
     1723{site_name} Support Team<br>
     1724<a href="{site_url}">{site_url}</a></p>';
    17141725                }
    17151726                wp_editor(
  • nexlifydesk/trunk/includes/class-nexlifydesk-ajax.php

    r3330741 r3330879  
    3636       
    3737        if (isset($_FILES['attachments']) && isset($_FILES['attachments']['error']) && is_array($_FILES['attachments']['error'])) {
    38             foreach ($_FILES['attachments']['error'] as $error) {
    39                 $error = absint($error);
     38            // Sanitize the error array by casting each value to integer
     39            $attachment_errors = array_map('intval', $_FILES['attachments']['error']); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized via array_map with intval
     40           
     41            foreach ($attachment_errors as $error) {
    4042                if ($error === UPLOAD_ERR_FORM_SIZE || $error === UPLOAD_ERR_INI_SIZE) {
    4143                    wp_send_json_error(__('One or more files are too large. Please reduce file sizes and try again.', 'nexlifydesk'));
  • nexlifydesk/trunk/includes/class-nexlifydesk-database.php

    r3330741 r3330879  
    193193   
    194194    public static function check_and_run_migrations() {
    195         $current_version = get_option('nexlifydesk_db_version', '1.0.1');
     195        $current_version = get_option('nexlifydesk_db_version', '1.0.2');
    196196        $plugin_version = NEXLIFYDESK_VERSION;
    197197       
    198         if (version_compare($current_version, '1.0.1', '<')) {
     198        if (version_compare($current_version, '1.0.2', '<')) {
    199199            self::migrate_to_1_0_1();
    200             update_option('nexlifydesk_db_version', '1.0.1');
     200            update_option('nexlifydesk_db_version', '1.0.2');
    201201        }
    202202       
     
    289289        global $wpdb;
    290290       
    291         $current_version = get_option('nexlifydesk_version', '1.0.1');
    292        
    293         if ($current_version === '1.0.1' && !get_option('nexlifydesk_db_version')) {
     291        $current_version = get_option('nexlifydesk_version', '1.0.2');
     292       
     293        if ($current_version === '1.0.2' && !get_option('nexlifydesk_db_version')) {
    294294            return;
    295295        }
  • nexlifydesk/trunk/includes/class-nexlifydesk-shortcodes.php

    r3326104 r3330879  
    1313    public static function ticket_form($atts) {
    1414        $atts = shortcode_atts(array(
    15             'demo' => 'no',
    1615            'show_title' => 'yes'
    1716        ), $atts, 'nexlifydesk_ticket_form');
    1817       
    19         if (self::is_documentation_page()) {
    20             return '<code>[nexlifydesk_ticket_form]</code>';
     18        // Return shortcode placeholder ONLY for documentation pages that are specifically about documentation
     19        // NOT for actual support ticket submission pages
     20        if (self::is_documentation_page() && !self::is_actual_support_page()) {
     21            return '<div class="nexlifydesk-shortcode-placeholder" style="background: #f0f0f0; padding: 15px; border: 1px dashed #ccc; border-radius: 4px; margin: 10px 0; text-align: center; color: #666;"><strong>Shortcode:</strong> <code>[nexlifydesk_ticket_form]</code><br><small>This shortcode displays the ticket submission form for customers.</small></div>';
    2122        }
    2223       
    2324        ob_start();
    2425       
    25         if ($atts['demo'] === 'yes') {
    26             echo '<div class="nexlifydesk-shortcode-demo">';
    27             echo '<h4>' . esc_html__('Ticket Submission Form Shortcode', 'nexlifydesk') . '</h4>';
    28             echo '<code>[nexlifydesk_ticket_form]</code>';
    29             echo '<p><strong>' . esc_html__('Optional Parameters:', 'nexlifydesk') . '</strong></p>';
    30             echo '<ul>';
    31             echo '<li><code>show_title="no"</code> - ' . esc_html__('Hides the default form title', 'nexlifydesk') . '</li>';
    32             echo '</ul>';
    33             echo '<p>' . esc_html__('This shortcode displays the customer ticket submission form with fields for subject, message, category, priority, and file attachments.', 'nexlifydesk') . '</p>';
    34             echo '</div>';
    35         } else {
    36             $template_path = NEXLIFYDESK_PLUGIN_DIR . 'templates/frontend/ticket-form.php';
    37             if (file_exists($template_path) && is_readable($template_path)) {
    38                 include $template_path;
    39             }
     26        $template_path = NEXLIFYDESK_PLUGIN_DIR . 'templates/frontend/ticket-form.php';
     27        if (file_exists($template_path) && is_readable($template_path)) {
     28            include $template_path;
    4029        }
    4130       
     
    4837            'per_page' => 10,
    4938            'show_closed' => 'no',
    50             'title' => '',
    51             'demo' => 'no'
     39            'title' => ''
    5240        ), $atts, 'nexlifydesk_ticket_list');
    5341       
    54         if (self::is_documentation_page()) {
    55             return '<code>[nexlifydesk_ticket_list]</code>';
     42        // Return shortcode placeholder ONLY for documentation pages that are specifically about documentation
     43        // NOT for actual support ticket list pages
     44        if (self::is_documentation_page() && !self::is_actual_support_page()) {
     45            return '<div class="nexlifydesk-shortcode-placeholder" style="background: #f0f0f0; padding: 15px; border: 1px dashed #ccc; border-radius: 4px; margin: 10px 0; text-align: center; color: #666;"><strong>Shortcode:</strong> <code>[nexlifydesk_ticket_list]</code><br><small>This shortcode displays the user\'s ticket history and allows them to view their support tickets.</small></div>';
    5646        }
    5747       
    5848        ob_start();
    5949       
    60         if ($atts['demo'] === 'yes') {
    61             echo '<div class="nexlifydesk-shortcode-demo">';
    62             echo '<h4>' . esc_html__('Ticket List Shortcode', 'nexlifydesk') . '</h4>';
    63             echo '<code>[nexlifydesk_ticket_list]</code>';
    64             echo '<p><strong>' . esc_html__('Optional Parameters:', 'nexlifydesk') . '</strong></p>';
    65             echo '<ul>';
    66             echo '<li><code>show_title="no"</code> - ' . esc_html__('Hides the default page title', 'nexlifydesk') . '</li>';
    67             echo '<li><code>per_page="10"</code> - ' . esc_html__('Number of tickets to display per page', 'nexlifydesk') . '</li>';
    68             echo '<li><code>show_closed="no"</code> - ' . esc_html__('Whether to show closed tickets', 'nexlifydesk') . '</li>';
    69             echo '</ul>';
    70             echo '<p>' . esc_html__('This shortcode displays the user\'s ticket history. Logged-in users see their own tickets, while agents see their assigned tickets.', 'nexlifydesk') . '</p>';
    71             echo '</div>';
    72         } else {
    73             if ($atts['show_title'] === 'no') {
    74                 echo '<h3 class="nexlifydesk-list-title">' . esc_html($atts['title']) . '</h3>';
    75             }
    76            
    77             // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- GET parameter for read-only ticket viewing, no nonce needed
    78             if (isset($_GET['ticket_id']) && !empty($_GET['ticket_id'])) {
    79                 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Viewing tickets is read-only, no nonce needed
    80                 $ticket_id_param = sanitize_text_field(wp_unslash($_GET['ticket_id']));
    81                 if (self::can_user_view_ticket($ticket_id_param)) {
    82                     $template_path = NEXLIFYDESK_PLUGIN_DIR . 'templates/frontend/ticket-single.php';
    83                     if (file_exists($template_path) && is_readable($template_path)) {
    84                         include $template_path;
    85                     } else {
    86                         echo '<p>' . esc_html__('Single ticket template not found.', 'nexlifydesk') . '</p>';
    87                     }
    88                 }
    89 
    90             } else {
    91                 $template_path = NEXLIFYDESK_PLUGIN_DIR . 'templates/frontend/ticket-list.php';
     50        if ($atts['show_title'] === 'no') {
     51            echo '<h3 class="nexlifydesk-list-title">' . esc_html($atts['title']) . '</h3>';
     52        }
     53       
     54        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- GET parameter for read-only ticket viewing, no nonce needed
     55        if (isset($_GET['ticket_id']) && !empty($_GET['ticket_id'])) {
     56            // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Viewing tickets is read-only, no nonce needed
     57            $ticket_id_param = sanitize_text_field(wp_unslash($_GET['ticket_id']));
     58            if (self::can_user_view_ticket($ticket_id_param)) {
     59                $template_path = NEXLIFYDESK_PLUGIN_DIR . 'templates/frontend/ticket-single.php';
    9260                if (file_exists($template_path) && is_readable($template_path)) {
    93                     $shortcode_atts = $atts;
    9461                    include $template_path;
    9562                } else {
    96                     echo '<p>' . esc_html__('Ticket list template not found.', 'nexlifydesk') . '</p>';
    97                 }
     63                    echo '<p>' . esc_html__('Single ticket template not found.', 'nexlifydesk') . '</p>';
     64                }
     65            }
     66
     67        } else {
     68            $template_path = NEXLIFYDESK_PLUGIN_DIR . 'templates/frontend/ticket-list.php';
     69            if (file_exists($template_path) && is_readable($template_path)) {
     70                $shortcode_atts = $atts;
     71                include $template_path;
     72            } else {
     73                echo '<p>' . esc_html__('Ticket list template not found.', 'nexlifydesk') . '</p>';
    9874            }
    9975        }
     
    195171        $page_slug = $post->post_name;
    196172        $page_title = $post->post_title;
    197        
    198         $doc_keywords = array('doc', 'documentation', 'guide', 'help', 'manual', 'nexlifydesk-documentation');
     173        $doc_keywords = array(
     174            'doc',
     175            'documentation',
     176            'guide',
     177            'help',
     178            'manual',
     179            'nexlifydesk-documentation',
     180            'nexlifydesk-guide',
     181            'nexlifydesk-help',
     182            'nexlifydesk-manual',
     183            'knowledge-base',
     184            'kb',
     185            'faq',
     186            'getting-started',
     187            'configuration',
     188            'features-guide',
     189            'shortcodes-integration',
     190            'security-performance'
     191        );
    199192       
    200193        foreach ($doc_keywords as $keyword) {
     
    206199        }
    207200       
     201        if ($post->post_content) {
     202            $doc_shortcode_count = substr_count($post->post_content, 'nexlifydesk-shortcode-placeholder');
     203            $actual_shortcode_count = substr_count($post->post_content, '[nexlifydesk_');
     204           
     205            if ($doc_shortcode_count > 0 && $doc_shortcode_count >= $actual_shortcode_count) {
     206                return true;
     207            }
     208        }
     209       
    208210        return false;
    209211    }
     212   
     213    /**
     214     * Check if this is an actual support page (form or list) that users interact with
     215     *
     216     * @return bool
     217     */
     218    private static function is_actual_support_page() {
     219        $settings = get_option('nexlifydesk_settings', array());
     220        $ticket_form_page_id = isset($settings['ticket_form_page_id']) ? (int)$settings['ticket_form_page_id'] : 0;
     221        $ticket_page_id = isset($settings['ticket_page_id']) ? (int)$settings['ticket_page_id'] : 0;
     222       
     223        global $post;
     224        if (!$post) {
     225            return false;
     226        }
     227       
     228        $current_page_id = $post->ID;
     229       
     230        // Check if this is the configured support pages
     231        if ($current_page_id === $ticket_form_page_id || $current_page_id === $ticket_page_id) {
     232            return true;
     233        }
     234       
     235        // Check if page title or slug indicates it's for actual support (ticket submission/viewing)
     236        $page_title = strtolower($post->post_title);
     237        $page_slug = strtolower($post->post_name);
     238       
     239        $support_keywords = array(
     240            'submit',
     241            'ticket',
     242            'support',
     243            'contact',
     244            'help-desk',
     245            'helpdesk',
     246            'create-ticket',
     247            'new-ticket',
     248            'support-form',
     249            'ticket-form',
     250            'my-tickets',
     251            'view-tickets'
     252        );
     253       
     254        foreach ($support_keywords as $keyword) {
     255            if (strpos($page_title, $keyword) !== false || strpos($page_slug, $keyword) !== false) {
     256                // But exclude documentation-specific terms
     257                if (strpos($page_title, 'documentation') === false &&
     258                    strpos($page_title, 'guide') === false &&
     259                    strpos($page_slug, 'documentation') === false &&
     260                    strpos($page_slug, 'guide') === false) {
     261                    return true;
     262                }
     263            }
     264        }
     265       
     266        return false;
     267    }
    210268}
  • nexlifydesk/trunk/includes/class-nexlifydesk-tickets.php

    r3330741 r3330879  
    6969        }
    7070
    71         // Add email to data array for duplicate checking
    7271        $data['email'] = $email_address;
    7372
     
    686685        $customer_email = $user ? $user->user_email : ($customer_details['email'] ?: null);
    687686       
    688         $headers = array(
    689             'Content-Type: text/html; charset=UTF-8',
    690             'From: ' . get_bloginfo('name') . ' <' . $admin_email . '>',
    691             'Message-ID: <ticket-' . $ticket->ticket_id . '-' . time() . '@' . wp_parse_url(home_url(), PHP_URL_HOST) . '>',
    692             'In-Reply-To: <ticket-' . $ticket->ticket_id . '@' . wp_parse_url(home_url(), PHP_URL_HOST) . '>',
    693             'References: <ticket-' . $ticket->ticket_id . '@' . wp_parse_url(home_url(), PHP_URL_HOST) . '>'
    694         );
     687        $headers = self::get_email_headers($ticket);
    695688
    696689        $ticket_url = add_query_arg(
     
    955948
    956949    /**
     950     *
     951     * This function detects common SMTP plugins and avoids adding Message-ID,
     952     * In-Reply-To, and References headers if an SMTP plugin is active, preventing
     953     * the "multiple Message-ID headers" error that causes emails to be blocked
     954     * by Gmail and other providers.
     955     *
     956     * @param object $ticket The ticket object
     957     * @return array Email headers array
     958     */
     959    private static function get_email_headers($ticket) {
     960        $admin_email = get_option('admin_email');
     961        $headers = array(
     962            'Content-Type: text/html; charset=UTF-8',
     963            'From: ' . get_bloginfo('name') . ' <' . $admin_email . '>'
     964        );
     965
     966        // Check if SMTP plugins are active that might add their own Message-ID headers
     967        $smtp_plugins_active = (
     968            is_plugin_active('wp-mail-smtp/wp_mail_smtp.php') ||
     969            is_plugin_active('easy-wp-smtp/easy-wp-smtp.php') ||
     970            is_plugin_active('gmail-smtp/main.php') ||
     971            is_plugin_active('wp-smtp/wp-smtp.php') ||
     972            function_exists('wp_mail_smtp') ||
     973            class_exists('WPMailSMTP') ||
     974            class_exists('Easy_WP_SMTP')
     975        );
     976
     977        // Only add Message-ID and threading headers if no SMTP plugin is detected
     978        if (!$smtp_plugins_active) {
     979            $domain = wp_parse_url(home_url(), PHP_URL_HOST);
     980            $headers[] = 'Message-ID: <ticket-' . $ticket->ticket_id . '-' . time() . '@' . $domain . '>';
     981            $headers[] = 'In-Reply-To: <ticket-' . $ticket->ticket_id . '@' . $domain . '>';
     982            $headers[] = 'References: <ticket-' . $ticket->ticket_id . '@' . $domain . '>';
     983        }
     984
     985        return $headers;
     986    }
     987
     988    /**
    957989     * Send email notifications for tickets created via email channel
    958990     * Simple auto-response for new tickets, raw email replies for ongoing conversation
     
    9791011        }
    9801012
    981         $headers = array(
    982             'Content-Type: text/html; charset=UTF-8',
    983             'From: ' . get_bloginfo('name') . ' <' . $admin_email . '>',
    984             'Message-ID: <ticket-' . $ticket->ticket_id . '-' . time() . '@' . wp_parse_url(home_url(), PHP_URL_HOST) . '>',
    985             'In-Reply-To: <ticket-' . $ticket->ticket_id . '@' . wp_parse_url(home_url(), PHP_URL_HOST) . '>',
    986             'References: <ticket-' . $ticket->ticket_id . '@' . wp_parse_url(home_url(), PHP_URL_HOST) . '>'
    987         );
     1013        $headers = self::get_email_headers($ticket);
    9881014
    9891015        switch ($type) {
     
    10791105        $from_name = $reply_user->display_name ?: get_bloginfo('name');
    10801106        $from_email = $reply_user->user_email ?: get_option('admin_email');
    1081         $headers[1] = 'From: ' . $from_name . ' <' . $from_email . '>';
     1107       
     1108        // Create fresh headers to avoid conflicts with SMTP plugins
     1109        $reply_headers = self::get_email_headers($ticket);
     1110        // Override the From header with the reply user's details
     1111        $reply_headers[1] = 'From: ' . $from_name . ' <' . $from_email . '>';
     1112       
    10821113        // translators: 1: Ticket ID, 2: Ticket subject.
    10831114        $subject = sprintf(__('[#%1$s] %2$s', 'nexlifydesk'), $ticket->ticket_id, $ticket->subject);
    10841115
    1085         wp_mail($customer_email, $subject, $clean_message, $headers);
     1116        wp_mail($customer_email, $subject, $clean_message, $reply_headers);
    10861117    }
    10871118
     
    12941325
    12951326    /**
    1296      * Get default auto-response message
     1327     * Get default auto-response message with HTML formatting
    12971328     */
    12981329    private static function get_default_auto_response() {
    1299         return "Hello {customer_name},\n\n" .
    1300                "Thank you for contacting us. We have received your support request and have assigned it ticket ID #{ticket_id}.\n\n" .
    1301                "Subject: {subject}\n\n" .
    1302                "Our support team will review your request and get back to you as soon as possible. You can reference this ticket ID in any future correspondence.\n\n" .
    1303                "Best regards,\n" .
    1304                "{site_name} Support Team\n" .
    1305                "{site_url}";
     1330        return '<p>Hello {customer_name},</p>' . "\n\n" .
     1331               '<p>Thank you for contacting us. We have received your support request and have assigned it ticket ID <strong>#{ticket_id}</strong>.</p>' . "\n\n" .
     1332               '<p><strong>Subject:</strong> {subject}</p>' . "\n\n" .
     1333               '<p>Our support team will review your request and get back to you as soon as possible. You can reference this ticket ID in any future correspondence.</p>' . "\n\n" .
     1334               '<p>Best regards,<br>' . "\n" .
     1335               '{site_name} Support Team<br>' . "\n" .
     1336               '<a href="{site_url}">{site_url}</a></p>';
    13061337    }
    13071338
  • nexlifydesk/trunk/nexlifydesk.php

    r3330741 r3330879  
    33 * Plugin Name: NexlifyDesk
    44 * Description: A modern, user-friendly support ticket system for WordPress with ticket submission, threaded replies, file attachments, agent assignment, and customizable.
    5  * Version: 1.0.1
     5 * Version: 1.0.2
     6 * Author URI: https://nexlifylabs.com
    67 * Supported Versions: 6.2+
    78 * Tested up to: 6.2 < 6.8.
    89 * Author: NexlifyLabs
    9  * Author URI: https://nexlifylabs.com
    1010 * License: GPL-2.0+
    1111 * Text Domain: nexlifydesk
     
    1717}
    1818
     19if ( ! function_exists( 'nexlifydesk' ) ) {
     20    // Create a helper function for easy SDK access.
     21    function nexlifydesk() {
     22        global $nexlifydesk;
     23
     24        if ( ! isset( $nexlifydesk ) ) {
     25            // Include Freemius SDK.
     26            require_once dirname( __FILE__ ) . '/vendor/freemius/start.php';
     27            $nexlifydesk = fs_dynamic_init( array(
     28                'id'                  => '19551',
     29                'slug'                => 'nexlifydesk',
     30                'type'                => 'plugin',
     31                'public_key'          => 'pk_cbbd298a238d22db2fed1cc83307e',
     32                'is_premium'          => false,
     33                'has_addons'          => false,
     34                'has_paid_plans'      => false,
     35                'menu'                => array(
     36                    'slug'           => 'nexlifydesk_tickets',
     37                    'account'        => false,
     38                    'contact'        => false,
     39                ),
     40            ) );
     41        }
     42
     43        return $nexlifydesk;
     44    }
     45
     46    // Init Freemius.
     47    nexlifydesk();
     48    // Signal that SDK was initiated.
     49    do_action( 'nexlifydesk_loaded' );
     50}
     51
    1952define('NEXLIFYDESK_PLUGIN_DIR', plugin_dir_path(__FILE__));
    2053define('NEXLIFYDESK_PLUGIN_URL', plugin_dir_url(__FILE__));
    21 define('NEXLIFYDESK_VERSION', '1.0.1');
     54define('NEXLIFYDESK_VERSION', '1.0.2');
    2255define('NEXLIFYDESK_TABLE_PREFIX', 'nexlifydesk_');
    2356define('NEXLIFYDESK_CAP_VIEW_ALL_TICKETS', 'nexlifydesk_view_all_tickets');
     
    406439   
    407440    //Custom table maintenance requires direct queries without caching
     441    // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Table name is constructed from $wpdb->prefix and is safe
    408442    // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Custom table maintenance requires direct queries without caching
    409443    $old_ticket_ids = $wpdb->get_col(
     
    430464    $purged[] = __('Purged orphaned attachments.', 'nexlifydesk');
    431465    wp_send_json_success(implode('<br>', $purged));
     466
     467    // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
    432468});
    433469
  • nexlifydesk/trunk/readme.txt

    r3330741 r3330879  
    44Requires at least: 6.2
    55Tested up to: 6.8
    6 Stable tag: 1.0.1
     6Stable tag: 1.0.2
    77License: GPLv2 or later
    88License URI: https://www.gnu.org/licenses/gpl-2.0.html
    99Requires PHP: 7.4
    1010
    11 Complete WordPress support ticketing system with agent management, internal notes, workflows, SLA monitoring, and WooCommerce integration.
     11Hey there! NexlifyDesk is my awesome WordPress support ticketing system that turns your site into a pro customer service hub. It’s built for scalability and efficiency, giving you everything you need to wow your customers while keeping full control of their data.
     12
     13**Documentation**: Check out the [Full Documentation & Setup Guide](https://nexlifylabs.com/nexlifydesk-documentation/getting-started/)
    1214
    1315== Description ==
    1416
    15 NexlifyDesk is a comprehensive, enterprise-grade support ticketing system for WordPress that transforms your website into a professional customer service hub. Built with scalability and efficiency in mind, it provides everything you need to deliver exceptional support experiences while maintaining complete control over your customer data.
    16 
    17 **Documentation**: [Full Documentation & Setup Guide](https://nexlifylabs.com/nexlifydesk-documentation/getting-started/)
     17NexlifyDesk is my go-to, enterprise-grade ticketing solution for WordPress. I designed it to make customer support a breeze while keeping things organized and secure. Here’s what I’ve packed into it:
     18
     19- A complete system to manage tickets, agents, and workflows
     20- Internal notes for team chats
     21- SLA monitoring to keep things on track
     22- Seamless WooCommerce integration
     23
     24It’s all about delivering top-notch support experiences—trust me, you’ll love it!
    1825
    1926== Key Features ==
    2027
    2128**Frontend Customer Experience**
    22 *   **Ticket Submission & Management**: Clean, user-friendly interface for customers to submit tickets, view their history, and track progress
    23 *   **Real-time Updates**: AJAX-powered interface with live status updates and instant reply notifications
    24 *   **File Attachments**: Support for multiple file types with configurable size limits and security validation
    25 *   **Responsive Design**: Optimized for desktop, tablet, and mobile devices
     29- Ticket Submission & Management: I’ve added a clean, user-friendly interface where customers can submit tickets, check their history, and track progress. Super easy!
     30- Real-time Updates: An AJAX-powered setup with live status updates and instant reply notifications—keeps everything snappy!
     31- File Attachments: Supports multiple file types with configurable size limits and security checks. Safety first!
     32- Responsive Design: Works like a charm on desktop, tablet, or mobile—optimized for all!
    2633
    2734**Advanced Admin Dashboard**
    28 *   **Centralized Ticket Management**: Comprehensive admin interface with filtering, search, and bulk actions
    29 *   **Real-time Statistics**: Live dashboard with ticket counts, response times, and performance metrics
    30 *   **Agent Assignment**: Intelligent auto-assignment or manual assignment with load balancing
    31 *   **Status Management**: Five ticket statuses (Open, In Progress, Pending, Resolved, Closed) with automatic workflows
     35- Centralized Ticket Management: A comprehensive admin interface with filtering, search, and bulk actions. I made it powerful yet simple!
     36- Real-time Statistics: A live dashboard showing ticket counts, response times, and performance metrics. Love the insights!
     37- Agent Assignment: Intelligent auto-assignment or manual options with load balancing—keeps the workload fair!
     38- Status Management: Five ticket statuses (Open, In Progress, Pending, Resolved, Closed) with automatic workflows. Smooth sailing!
    3239
    3340**Agent Roles & Permissions System**
    34 *   **Custom Agent Positions**: Create unlimited agent roles with granular permission control
    35 *   **Capability Management**: Fine-tune what each agent can do (view all tickets, assign tickets, manage categories, etc.)
    36 *   **Agent Performance Tracking**: Monitor response times, resolution rates, and workload distribution
    37 *   **Orphaned Ticket Management**: Automatic reassignment when agents are removed or deactivated
     41- Custom Agent Positions: I let you create unlimited agent roles with granular permission control—total flexibility!
     42- Capability Management: Fine-tune what each agent can do (view all tickets, assign them, manage categories, etc.). You’re in charge!
     43- Agent Performance Tracking: Monitor response times, resolution rates, and workload distribution. Great for team management!
     44- Orphaned Ticket Management: Automatically reassigns tickets if an agent leaves—handled it for you!
    3845
    3946**Professional Communication Tools**
    40 *   **Internal Notes**: Private agent-to-agent communication within tickets (invisible to customers)
    41 *   **Email Notifications**: Fully customizable templates with dynamic placeholders for all scenarios
    42 *   **Notification Control**: Granular settings for when and how notifications are sent
    43 *   **Professional Templates**: Pre-designed email templates for new tickets, replies, status changes, and SLA breaches
     47- Internal Notes: Private agent-to-agent chats within tickets (customers won’t see them—shh!). Perfect for teamwork!
     48- Email Notifications: Fully customizable templates with dynamic placeholders for every scenario. I made it fun to tweak!
     49- Notification Control: Granular settings for when and how notifications go out—your call!
     50- Professional Templates: Pre-designed email templates for new tickets, replies, status changes, and SLA breaches. Ready to go!
    4451
    4552**Intelligent Automation**
    46 *   **Enhanced Duplicate Detection**: Advanced multi-layer algorithms detect similar tickets and merge conversations automatically with improved accuracy
    47 *   **Auto-Assignment**: Smart distribution of tickets to available agents based on workload
    48 *   **SLA Monitoring**: Automatic tracking and breach notifications to maintain service standards
    49 *   **Auto-Closure**: Resolved tickets automatically close after 48 hours of inactivity with system notifications
     53- Enhanced Duplicate Detection: My advanced multi-layer algorithms spot similar tickets and merge them automatically—way more accurate now!
     54- Auto-Assignment: Smartly distributes tickets to available agents based on workload. Hands-off genius!
     55- SLA Monitoring: Tracks and notifies on breaches to maintain service standards—keeps you on your toes!
     56- Auto-Closure: Resolved tickets close after 48 hours of inactivity with system notifications. Neat, right?
    5057
    5158**Email Piping & Integration**
    52 *   **Multi-Provider Support**: Convert emails to tickets with support for Custom IMAP/POP3, AWS WorkMail, and Google Workspace/Gmail
    53 *   **Flexible Email Management**: Option to keep or delete emails from inbox after ticket creation
    54 *   **Advanced Spam Protection**: Built-in spam filtering, email blocking, and rate limiting to prevent abuse
    55 *   **Intelligent Email Processing**: Automatic sender detection, thread management, and duplicate prevention
     59- Multi-Provider Support: Turns emails into tickets with Custom IMAP/POP3, AWS WorkMail, and Google Workspace/Gmail. I’ve got you covered!
     60- Flexible Email Management: Option to keep or delete emails after ticket creation—your choice!
     61- Advanced Spam Protection: Built-in filtering, blocking, and rate limiting to stop abuse. Security’s my thing!
     62- Intelligent Email Processing: Auto sender detection, thread management, and duplicate prevention. Smart stuff!
    5663
    5764**Enhanced Admin Experience**
    58 *   **Real-time Ticket List**: Live-updating ticket interface with read/unread status indicators
    59 *   **Smart Sorting**: Automatic prioritization with unread tickets displayed first
    60 *   **Instant Notifications**: Real-time updates without page refresh
    61 *   **Bulk Operations**: Enhanced bulk actions for efficient ticket management
     65- Real-time Ticket List: Live-updating interface with read/unread status indicators. I love the flow!
     66- Smart Sorting: Unread tickets show up first—prioritizes what matters!
     67- Instant Notifications: Real-time updates without refreshing—smooth as butter!
     68- Bulk Operations: Enhanced bulk actions for quick ticket management. Saves time!
    6269
    6370**Categories & Organization**
    64 *   **Unlimited Categories**: Organize tickets with custom categories and descriptions
    65 *   **Priority Levels**: Four priority levels (Low, Medium, High, Urgent) with visual indicators
    66 *   **Search & Filtering**: Advanced search across all ticket fields with multiple filter options
    67 *   **Bulk Operations**: Manage multiple tickets simultaneously
     71- Unlimited Categories: Organize tickets with custom categories and descriptions. Go wild!
     72- Priority Levels: Four levels (Low, Medium, High, Urgent) with visual indicators. Easy to spot!
     73- Search & Filtering: Advanced search across all fields with multiple filter options. Find anything!
     74- Bulk Operations: Manage multiple tickets at once—efficiency boost!
    6875
    6976**WooCommerce Integration**
    70 *   **Order History**: Built-in order lookup for WooCommerce stores
    71 *   **Customer Context**: Access customer order information directly from tickets
    72 *   **Order-based Duplicate Detection**: Automatically link tickets to existing order-related conversations
     77- Order History: Built-in order lookup for WooCommerce stores. Handy!
     78- Customer Context: Access order info directly from tickets—context is king!
     79- Order-based Duplicate Detection: Links tickets to existing order conversations automatically. Clever, huh?
    7380
    7481**Reporting & Analytics**
    75 *   **Performance Metrics**: Comprehensive reporting on ticket volume, response times, and agent performance
    76 *   **Visual Charts**: Interactive charts showing ticket trends, priority distribution, and monthly statistics
    77 *   **Recent Activity**: Real-time feed of all support activities across your team
     82- Performance Metrics: Reports on ticket volume, response times, and agent performance. Data nerd approved!
     83- Visual Charts: Interactive charts for ticket trends, priority distribution, and monthly stats. Pretty cool!
     84- Recent Activity: Real-time feed of all support activities across your team. Stay in the loop!
    7885
    7986**Developer & Advanced Features**
    80 *   **Template Override System**: Customize any frontend template by copying to your theme
    81 *   **Shortcode System**: Flexible shortcodes with customizable attributes (`[nexlifydesk_ticket_form]` and `[nexlifydesk_ticket_list]`)
    82 *   **Data Management**: Configurable data retention with optional purge functionality
    83 *   **Rate Limiting**: Built-in protection against spam and abuse
    84 *   **Caching System**: Optimized performance with intelligent cache management
     87- Template Override System: Customize frontend templates by copying to your theme. I made it developer-friendly!
     88- Shortcode System: Flexible shortcodes like `[nexlifydesk_ticket_form]` and `[nexlifydesk_ticket_list]` with customizable attributes.
     89- Data Management: Configurable retention with optional purge functionality. Your data, your rules!
     90- Rate Limiting: Built-in protection against spam and abuse. Safety first!
     91- Caching System: Optimized performance with smart cache management. Fast and reliable!
    8592
    8693== Duplicate Ticket Detection ==
    8794
    88 NexlifyDesk includes a sophisticated three-layer duplicate detection system to maintain clean, organized support queues:
    89 
    90 **1. Exact Subject Matching**
    91 - Detects identical subjects from the same user within the last 30 days
    92 - Automatically adds new messages as replies to the existing conversation
    93 - Prevents ticket fragmentation for ongoing issues
    94 
    95 **2. Order Number Pattern Recognition** 
    96 - Intelligently recognizes order/invoice numbers in subjects and messages
    97 - Patterns include: "Order #12345", "Invoice ID: 67890", "#ABC123", etc.
    98 - Links all order-related communications to a single ticket thread
    99 
    100 **3. Content Similarity Analysis**
    101 - Advanced keyword comparison between new tickets and recent submissions from the same user
    102 - Configurable similarity threshold (default: 80%) for fine-tuned control
    103 - Smart filtering of common stop words for accurate matching
     95I’ve built a slick three-layer system to keep your support queues tidy:
     96
     97- **Exact Subject Matching**: Spots identical subjects from the same user in the last 30 days and adds new messages as replies. No fragmentation!
     98- **Order Number Pattern Recognition**: Recognizes order/invoice numbers (like "Order #12345" or "#ABC123") and links all related chats to one thread. Smart!
     99- **Content Similarity Analysis**: Compares keywords between new and recent tickets from the same user, with a configurable 80% similarity threshold. Filters out stop words too!
    104100
    105101**User Experience**
    106 When a duplicate is detected, users receive clear notification that their message has been added to an existing conversation, maintaining context while preventing scattered tickets.
     102When a duplicate pops up, users get a clear note that their message joined an existing convo—keeps things contextual!
    107103
    108104**Administrative Control**
    109 - Enable/disable duplicate detection from NexlifyDesk > Settings
    110 - Adjust sensitivity threshold to match your support workflow
    111 - View duplicate detection stats in the reports dashboard
     105- Turn duplicate detection on/off in NexlifyDesk > Settings
     106- Tweak the sensitivity threshold to fit your workflow
     107- Check duplicate stats in the reports dashboard
    112108
    113109== Installation ==
    114110
    115 1.  **Upload the Plugin**: Upload the `nexlifydesk` folder to `/wp-content/plugins/` via FTP, or install directly through WordPress admin by uploading the ZIP file.
    116 
    117 2.  **Activate**: Activate the plugin through the 'Plugins' menu in WordPress.
    118 
    119 3.  **Initial Configuration**: Navigate to NexlifyDesk > Settings to configure:
    120     *   Email notification preferences
    121     *   File upload limits and allowed types 
    122     *   Default ticket priority and category
    123     *   SLA response time targets
    124     *   Auto-assignment rules
    125 
    126 4.  **Create Frontend Pages**: Set up user-facing pages:
    127     *   **Ticket Submission Page**: Create a page and add `[nexlifydesk_ticket_form]`
    128     *   **Ticket History Page**: Create another page and add `[nexlifydesk_ticket_list]`
    129     *   Link these pages in NexlifyDesk > Settings for proper navigation
    130 
    131 5.  **Email Piping Setup** (Optional): Configure email-to-ticket conversion:
    132     *   Choose your email provider (Custom IMAP/POP3, AWS WorkMail, or Google Workspace)
    133     *   Configure connection settings and authentication
    134     *   Set up spam protection and email filtering rules
    135     *   Choose whether to keep or delete emails from inbox after processing
    136 
    137 6.  **Agent Setup** (Optional): Configure your support team:
    138     *   Create user accounts for support agents
    139     *   Assign the "NexlifyDesk Agent" role
    140     *   Define custom agent positions with specific capabilities
    141     *   Set up auto-assignment rules
     111Here’s how I suggest you get started:
     112
     1131. **Upload the Plugin**: Pop the `nexlifydesk` folder into `/wp-content/plugins/` via FTP, or upload the ZIP directly in WordPress admin.
     1142. **Activate**: Turn it on via the 'Plugins' menu in WordPress.
     1153. **Initial Configuration**: Head to NexlifyDesk > Settings to set up:
     116   - Email notification prefs
     117   - File upload limits and types
     118   - Default ticket priority and category
     119   - SLA response time targets
     120   - Auto-assignment rules
     1214. **Create Frontend Pages**: Set up user pages:
     122   - **Ticket Submission Page**: Make a page and add `[nexlifydesk_ticket_form]`
     123   - **Ticket History Page**: Add `[nexlifydesk_ticket_list]` to another page
     124   - Link them in NexlifyDesk > Settings for navigation
     1255. **Email Piping Setup** (Optional): Configure email-to-ticket conversion:
     126   - Pick your provider (Custom IMAP/POP3, AWS WorkMail, or Google Workspace)
     127   - Enter connection details and auth
     128   - Set spam protection and filtering rules
     129   - Decide to keep or delete emails
     1306. **Agent Setup** (Optional): Get your team ready:
     131   - Create user accounts for agents
     132   - Assign the "NexlifyDesk Agent" role
     133   - Define custom positions with capabilities
     134   - Set auto-assignment rules
    142135
    143136== Frequently Asked Questions ==
    144137
    145138= How do I create a support ticket submission form? =
    146 
    147 Create a new WordPress page and add the shortcode `[nexlifydesk_ticket_form]`. You can customize it with optional attributes:
    148 - `show_title="no"` - Hides the default form title
    149 - The form includes fields for subject, message, category, priority, and file attachments
     139Create a new WordPress page and drop in `[nexlifydesk_ticket_form]`. Tweak it with:
     140- `show_title="no"` to hide the title
     141- Includes fields for subject, message, category, priority, and file attachments
    150142
    151143= How can customers view their submitted tickets? =
    152 
    153 Create a page with the shortcode `[nexlifydesk_ticket_list]`. Logged-in users will see their tickets, while agents with appropriate permissions will see their assigned tickets. Optional attributes:
    154 - `show_title="no"` - Hides the default page title
     144Make a page with `[nexlifydesk_ticket_list]`. Logged-in users see their tickets, agents see assigned ones. Try:
     145- `show_title="no"` to hide the title
     146- `status="open"` to filter by status
    155147
    156148= Can I customize the email notifications? =
    157 
    158 Yes, completely! Go to NexlifyDesk > Email Templates to customize all notification emails:
    159 - **New Ticket**: Sent when a ticket is created
    160 - **New Reply**: Sent when someone replies to a ticket 
    161 - **Status Changed**: Sent when ticket status is updated
    162 - **SLA Breach**: Sent when response time targets are missed
    163 
    164 Available placeholders include `{ticket_id}`, `{subject}`, `{user_name}`, `{status}`, `{ticket_url}`, and many more.
     149Yep! Go to NexlifyDesk > Email Templates to tweak:
     150- New Ticket, New Reply, Status Changed, SLA Breach
     151Use placeholders like `{ticket_id}`, `{user_name}`, `{subject}`, and more!
    165152
    166153= How do I set up support agents? =
    167 
    168154**Basic Setup:**
    169 1. Go to Users > Add New and create user accounts for your support team
    170 2. Assign them the "NexlifyDesk Agent" role
     1551. Go to Users > Add New for agent accounts
     1562. Assign the "NexlifyDesk Agent" role
    171157
    172158**Advanced Setup:**
    173 1. Go to NexlifyDesk > Agent Positions to create custom roles
    174 2. Define specific capabilities for each position (e.g., "Level 1 Support", "Technical Lead")
    175 3. Assign agents to positions via their user profiles
    176 4. Configure auto-assignment rules in Settings
     1591. Visit NexlifyDesk > Agent Positions for custom roles
     1602. Set capabilities (e.g., "Level 1 Support")
     1613. Assign agents via their profiles
     1624. Configure auto-assignment in Settings
    177163
    178164= What file types can be attached to tickets? =
    179 
    180 By default: JPG, PNG, PDF, and common document types. You can customize:
    181 - **Allowed file extensions**: Modify the list in NexlifyDesk > Settings
    182 - **Maximum file size**: Set size limits per attachment
    183 - **Security**: All uploads are validated and stored securely
     165Default: JPG, PNG, PDF, and common docs. Customize in NexlifyDesk > Settings:
     166- Allowed extensions
     167- Max file size
     168- Security validation
    184169
    185170= How does the SLA monitoring work? =
    186 
    187 Set your target response time in NexlifyDesk > Settings (in hours). The system:
    188 - Automatically tracks when tickets approach or exceed SLA targets
    189 - Sends breach notifications to administrators and assigned agents
    190 - Displays SLA status in the admin dashboard
    191 - Includes SLA metrics in performance reports
     171Set your response time in NexlifyDesk > Settings (in hours). It:
     172- Tracks when tickets hit or miss SLA targets
     173- Sends breach alerts to admins and agents
     174- Shows SLA status in the dashboard
     175- Includes metrics in reports
    192176
    193177= Can I integrate with WooCommerce? =
    194 
    195 Yes! NexlifyDesk includes built-in WooCommerce integration:
    196 - **Order History page**: Look up customer orders directly from the admin
    197 - **Order-based duplicate detection**: Links tickets mentioning order numbers
    198 - **Customer context**: View order information when handling support requests
     178Absolutely! Built-in integration:
     179- Order History page for lookups
     180- Order-based duplicate detection
     181- Customer context in tickets
    199182
    200183= How do I set up email piping? =
    201 
    202 Email piping converts incoming emails into support tickets automatically. Setup varies by provider:
     184Turns emails into tickets. Setup varies:
    203185
    204186**Custom IMAP/POP3:**
    2051871. Go to NexlifyDesk > Settings > Email Piping
    206 2. Select "Custom IMAP/POP3" as your provider
    207 3. Enter your mail server details (host, port, username, password)
    208 4. Configure spam protection and email filtering settings
    209 5. Choose whether to delete emails from inbox after processing
     1882. Pick "Custom IMAP/POP3"
     1893. Enter server details (host, port, username, password)
     1904. Set spam and filtering rules
     1915. Choose to delete emails or not
    210192
    211193**AWS WorkMail:**
    212 1. Ensure your site has SSL enabled (required for AWS)
    213 2. Select "AWS WorkMail" as your provider 
    214 3. Enter your AWS region, organization ID, and email credentials
    215 4. Optionally configure AWS SES for enhanced email sending
     1941. Enable SSL on your site
     1952. Pick "AWS WorkMail"
     1963. Enter region, org ID, and credentials
     1974. Optional SES setup
    216198
    217199**Google Workspace/Gmail:**
    218 1. Set up Google OAuth credentials in your Google Cloud Console
    219 2. Select "Google Workspace" as your provider
    220 3. Complete the OAuth authentication process
    221 4. Configure email processing preferences
     2001. Set up OAuth in Google Cloud Console
     2012. Pick "Google Workspace"
     2023. Authenticate via OAuth
     2034. Configure processing prefs
    222204
    223205= How does automatic ticket assignment work? =
    224 
    225 The smart assignment system:
    226 1. **Finds available agents**: Checks users with the NexlifyDesk Agent role
    227 2. **Balances workload**: Assigns to the agent with the fewest open tickets
    228 3. **Fallback options**: Can assign to administrators if no agents are available
    229 4. **Handles changes**: Automatically reassigns orphaned tickets when agents are removed
     206My smart system:
     2071. Finds available agents
     2082. Balances workload with fewest open tickets
     2093. Falls back to admins if needed
     2104. Reassigns orphaned tickets
    230211
    231212= What happens to closed tickets? =
    232 
    233 - **Manual closure**: Agents can close tickets at any time
    234 - **Automatic closure**: Resolved tickets automatically close after 48 hours of inactivity
    235 - **Reopening**: Closed tickets can be reopened by administrators
    236 - **Customer interaction**: Customers cannot reply to closed tickets and are prompted to create new ones
     213- Agents can close manually
     214- Resolved tickets auto-close after 48 hours inactivity
     215- Admins can reopen
     216- Customers can’t reply to closed tickets—prompts new ones
    237217
    238218= Is my data safe when uninstalling? =
    239 
    240 By default, YES! NexlifyDesk preserves all data (tickets, replies, attachments, customer information) even after plugin deletion. You can change this behavior in NexlifyDesk > Settings if you prefer to remove all data during uninstall.
     219By default, YES! Keeps all data (tickets, attachments, etc.) unless you change it in Settings to remove everything. Backup first!
    241220
    242221= How do internal notes work? =
    243 
    244 Internal notes are private messages between support team members:
    245 - Only visible to agents and administrators
    246 - Never sent to customers via email 
    247 - Perfect for sharing context, escalation notes, or internal updates
    248 - Added via the "Add Internal Note" tab in the admin ticket view
     222Private agent chats:
     223- Only for team, not customers
     224- Great for context or escalation
     225- Add via "Add Internal Note" in admin
    249226
    250227= Can I customize the appearance? =
    251 
    252 Yes, several ways:
    253 - **CSS Styling**: Override the plugin's CSS in your theme
    254 - **Template System**: Copy template files to your theme for structural changes
    255 - **Settings Panel**: Customize colors, labels, and behavior options
    256 - **Email Templates**: Full control over all notification email content and styling
     228Oh yes!
     229- CSS styling in your theme
     230- Template overrides
     231- Color and label tweaks in Settings
     232- Full email template control
    257233
    258234== Screenshots ==
    259235
    260 1.  **Frontend Ticket Submission Form**: Clean, professional form for customers to submit support requests with file attachments and priority selection.
    261 
    262 2.  **Customer Ticket Dashboard**: User-friendly interface showing ticket history, status, and progress tracking.
    263 
    264 3.  **Frontend Ticket Conversation**: Detailed ticket view with threaded conversation, attachments, and reply functionality.
    265 
    266 4.  **Admin Dashboard**: Comprehensive ticket management interface with real-time statistics, filtering, and bulk actions.
    267 
    268 5.  **Admin Ticket Details**: Professional single-ticket view with sidebar controls, internal notes, and conversation history.
    269 
    270 6.  **Category Management**: Easy-to-use interface for organizing tickets with custom categories and descriptions.
    271 
    272 7.  **Comprehensive Settings**: Extensive configuration options for email notifications, file uploads, SLA targets, and automation rules.
    273 
    274 8.  **Agent Positions & Permissions**: Granular control system for defining agent roles and capabilities.
    275 
    276 9.  **Email Template Editor**: Visual editor for customizing all notification emails with dynamic placeholders.
    277 
    278 10. **Reports & Analytics**: Professional reporting dashboard with charts, metrics, and performance insights.
     2361. Frontend Ticket Submission Form: Clean form for customers with attachments and priority.
     2372. Customer Ticket Dashboard: Easy interface for ticket history.
     2383. Frontend Ticket Conversation: Threaded view with attachments.
     2394. Admin Dashboard: Ticket management with stats.
     2405. Admin Ticket Details: Single-ticket view with notes.
     2416. Category Management: Organize with custom categories.
     2427. Comprehensive Settings: Tons of config options.
     2438. Agent Positions & Permissions: Granular role control.
     2449. Email Template Editor: Customize notifications.
     24510. Reports & Analytics: Charts and metrics galore.
    279246
    280247== Usage ==
     
    282249=== Shortcodes ===
    283250
    284 **`[nexlifydesk_ticket_form]`** - Displays the ticket submission form
    285 *   `show_title="no"` - Hides the default "Submit a Ticket" title
    286 *   `category="5"` - Pre-select a specific category ID
    287 *   `priority="high"` - Pre-select priority level
    288 
    289 **`[nexlifydesk_ticket_list]`** - Displays user's ticket history 
    290 *   `show_title="no"` - Hides the default title
    291 *   `status="open"` - Filter by specific status
    292 *   `limit="10"` - Limit number of tickets displayed
     251**`[nexlifydesk_ticket_form]`** - Shows the ticket form
     252- `show_title="no"` - Hides title
     253- `category="5"` - Pre-select category
     254- `priority="high"` - Set default priority
     255
     256**`[nexlifydesk_ticket_list]`** - Shows ticket history
     257- `show_title="no"` - Hides title
     258- `status="open"` - Filter by status
     259- `limit="10"` - Limit tickets
    293260
    294261=== Admin Menu Structure ===
    295262
    296263**NexlifyDesk** (Main Menu)
    297 *   **All Tickets**: Complete ticket management with advanced filtering and search
    298 *   **Categories**: Create and organize ticket categories with descriptions
    299 *   **Settings**: Configure all plugin options, automation rules, and integrations
    300 *   **Reports**: Performance analytics, charts, and team statistics 
    301 *   **Agent Positions**: Define custom roles and assign capabilities to team members
    302 *   **Order History**: WooCommerce order lookup and customer information (requires WooCommerce)
    303 *   **Email Templates**: Customize all automated email notifications
    304 *   **Support**: Contact NexlifyLabs for assistance and feature requests
     264- All Tickets: Full management with filters
     265- Categories: Custom ticket categories
     266- Settings: All config options
     267- Reports: Analytics and charts
     268- Agent Positions: Role and capability setup
     269- Order History: WooCommerce lookups
     270- Email Templates: Notification tweaks
     271- Support: Get help from me!
    305272
    306273=== Ticket Statuses ===
    307274
    308 The system uses five distinct statuses for comprehensive workflow management:
    309 
    310 *   **Open**: New tickets awaiting initial response
    311 *   **In Progress**: Actively being worked on by an agent 
    312 *   **Pending**: Waiting for customer response or external action
    313 *   **Resolved**: Issue solved, awaiting customer confirmation
    314 *   **Closed**: Completed tickets (auto-closed after 48 hours resolved, or manually closed)
     275Five statuses for smooth workflows:
     276- Open: New tickets
     277- In Progress: Being worked on
     278- Pending: Waiting on customer
     279- Resolved: Solved, awaiting confirmation
     280- Closed: Done (auto or manual)
    315281
    316282=== Agent Capabilities ===
    317283
    318 Create custom agent positions with these granular permissions:
    319 
    320 *   **View All Tickets**: Access to organization-wide tickets vs. only assigned ones
    321 *   **Assign Tickets**: Ability to assign tickets to other agents 
    322 *   **Manage Categories**: Create, edit, and organize ticket categories
    323 *   **View Reports**: Access to analytics and performance reporting
     284Custom roles with:
     285- View All Tickets: Org-wide access
     286- Assign Tickets: Delegate to others
     287- Manage Categories: Organize tickets
     288- View Reports: See analytics
    324289
    325290== Customization ==
    326291
    327 NexlifyDesk offers extensive customization options for businesses of all sizes:
     292Lots of ways to make it yours!
    328293
    329294**Settings Panel Configuration**
    330 *   **Email Notifications**: Control when and how notifications are sent
    331 *   **Default Values**: Set default priority, category, and assignment rules
    332 *   **File Upload Controls**: Manage allowed file types, sizes, and security settings
    333 *   **SLA Management**: Configure response time targets and breach notifications
    334 *   **Automation Rules**: Set up auto-assignment, duplicate detection, and closure policies
    335 
    336 **Email Template Customization** 
    337 Complete control over all automated emails with a rich set of placeholders:
    338 *   Dynamic content insertion with `{ticket_id}`, `{user_name}`, `{subject}`, etc.
    339 *   HTML email support with visual preview
    340 *   Separate templates for different notification types
    341 *   Multi-language support with translation files
     295- Email Notifications: Control timing and delivery
     296- Default Values: Set priority, category, etc.
     297- File Upload Controls: Manage types and sizes
     298- SLA Management: Set response targets
     299- Automation Rules: Auto-assign, duplicates, closures
     300
     301**Email Template Customization**
     302- Dynamic placeholders (e.g., `{ticket_id}`)
     303- HTML support with preview
     304- Separate templates per notification
     305- Multi-language ready
    342306
    343307**Visual Customization**
    344 *   **CSS Override**: Use your theme's CSS to match your brand
    345 *   **Template System**: Copy plugin templates to your theme for structural changes 
    346 *   **Responsive Design**: Built-in mobile optimization with customizable breakpoints
     308- CSS override in your theme
     309- Template system for structural changes
     310- Responsive design tweaks
    347311
    348312**Advanced Integration**
    349 *   **WooCommerce**: Automatic order context and customer history
    350 *   **Multisite Support**: Works seamlessly across WordPress networks
    351 *   **Developer Hooks**: Extensive action and filter hooks for custom functionality
    352 *   **REST API Ready**: Structured for future API integration
     313- WooCommerce support
     314- Multisite ready
     315- Developer hooks
     316- REST API future-proof
    353317
    354318== Performance & Security ==
    355319
    356320**Optimized Performance**
    357 *   Intelligent caching system reduces database queries
    358 *   AJAX-powered interface for smooth user experience 
    359 *   Optimized database schema with proper indexing
    360 *   Background processing for email notifications
     321- Smart caching
     322- AJAX interface
     323- Optimized database
     324- Background email processing
    361325
    362326**Security Features**
    363 *   Nonce verification for all forms and AJAX requests
    364 *   Proper data sanitization and validation
    365 *   File upload security with type and size validation
    366 *   Rate limiting to prevent spam and abuse
    367 *   Capability-based access control throughout
     327- Nonce verification
     328- Data sanitization
     329- File upload security
     330- Rate limiting
     331- Capability-based access
    368332
    369333**Data Management**
    370 *   Configurable data retention policies
    371 *   Optional data purging for old tickets
    372 *   Database maintenance tools for administrators
    373 *   Full export capabilities for data portability
     334- Configurable retention
     335- Optional purging
     336- Database tools
     337- Full export options
    374338
    375339== Changelog ==
    376340
     341= 1.0.2 =
     342- Fixed email delivery with SMTP plugins (RFC 5322 compliance). Update now if you use SMTP!
     343
     344= 1.0.1 =
     345- Added email piping (IMAP/POP3, AWS, Google), better duplicate detection, real-time ticket list, and spam protection. Big update!
     346
    377347= 1.0.0 =
    378 *   **Initial Release**: Complete support ticketing system with comprehensive feature set
    379 *   **Core Features**: Ticket submission, management, replies, and status tracking
    380 *   **Agent System**: Role-based access control with custom agent positions
    381 *   **Email System**: Fully customizable email templates with dynamic placeholders 
    382 *   **SLA Monitoring**: Automatic response time tracking and breach notifications
    383 *   **Automation**: Auto-assignment, auto-closure, and workflow management
    384 *   **Security**: Comprehensive security features with rate limiting and validation
    385 *   **Integration**: WooCommerce order history and customer lookup
    386 *   **Reporting**: Analytics dashboard with performance metrics and charts
    387 *   **Internationalization**: Translation-ready with multiple language packs included
    388 *   **Internal Notes feature**: Private agent-to-agent communication within tickets, invisible to customers
    389 *   **Duplicate Ticket Detection**: Advanced duplicate ticket detection with three-layer matching system
    390 
     348- Initial release with full ticketing, agent management, internal notes, WooCommerce, SLA, duplicate detection, emails, roles, categories, files, and shortcodes!
    391349
    392350== Upgrade Notice ==
    393351
     352= 1.0.2 =
     353Critical fix for email issues with SMTP plugins. Update ASAP if you’re using one!
     354
    394355= 1.0.1 =
    395 Major update with email piping support! Convert emails to tickets automatically with support for Custom IMAP/POP3, AWS WorkMail, and Google Workspace. Enhanced duplicate detection, real-time ticket list with read/unread status, and advanced spam protection. Recommended for all users.
     356Major update with email piping and enhancements. Highly recommended!
    396357
    397358= 1.0.0 =
    398 Initial release of NexlifyDesk. No upgrade steps necessary for new installations.
    399 
    400 == Changelog ==
    401 
    402 = 1.0.1 =
    403 **Major Features:**
    404 * Added Email Piping support with multiple providers (Custom IMAP/POP3, AWS WorkMail, Google Workspace/Gmail)
    405 * Enhanced duplicate ticket detection with improved accuracy and performance
    406 * New real-time ticket list interface with read/unread status indicators
    407 * Advanced spam protection with rate limiting and email blocking capabilities
    408 
    409 **Email Piping Features:**
    410 * Support for Custom IMAP/POP3 servers with SSL/TLS encryption
    411 * AWS WorkMail integration with SSL requirement and SES support
    412 * Google Workspace/Gmail integration with OAuth authentication
    413 * Configurable option to keep or delete emails from inbox after processing
    414 * Intelligent email thread detection and customer detail extraction
    415 * Comprehensive spam filtering with customizable rules
    416 
    417 **Enhanced Admin Experience:**
    418 * Real-time ticket list updates without page refresh
    419 * Smart sorting with unread tickets prioritized first
    420 * Improved bulk operations for efficient ticket management
    421 * Enhanced ticket grid with performance optimizations
    422 
    423 **Security & Performance:**
    424 * Built-in rate limiting to prevent spam and abuse
    425 * Advanced email validation and sanitization
    426 * Optimized database queries with proper caching
    427 * Enhanced SSL detection for secure email processing
    428 
    429 **Bug Fixes:**
    430 * Improved WordPress coding standards compliance
    431 * Fixed database query optimizations
    432 * Enhanced error handling and logging
    433 * Better mobile responsive design
    434 
    435 = 1.0.0 =
    436 * Initial release
    437 * Core ticketing system with agent management
    438 * Internal notes and professional communication tools
    439 * WooCommerce integration
    440 * SLA monitoring and reporting
    441 * Duplicate detection system
    442 * Email notification system
    443 * Agent roles and permissions
    444 * Categories and priority management
    445 * File attachment support
    446 * Shortcode system for frontend integration
     359First release—no upgrade needed.
    447360
    448361== Support & Documentation ==
    449362
    450363**Getting Help**
    451 *   **Email Support**: [email protected]
    452 *   **Website**: https://nexlifylabs.com
    453 *   **Documentation**: Comprehensive guides available on our website
    454 *   **Community**: WordPress.org support forums
     364- Email: [email protected]
     365- Website: https://nexlifylabs.com
     366- Docs: Full guides on the site
     367- Community: WordPress.org forums
    455368
    456369**Premium Support**
    457 Upgrade to NexlifyDesk Pro for priority email support, advanced features, and dedicated account management.
     370Go Pro for priority help and extra features!
    458371
    459372**Feature Requests**
    460 We actively develop NexlifyDesk based on user feedback. Submit feature requests through our support channels.
     373I love feedback! Send ideas via support channels.
    461374
    462375== Privacy & Data Protection ==
    463376
    464377**Data Storage**
    465 *   All ticket data is stored in your WordPress database
    466 *   No information is transmitted to external servers
    467 *   Complete control over your customer data
     378- Stored in your WordPress DB
     379- No external servers
     380- Full control
    468381
    469382**Email Handling**
    470 *   Notifications sent through your site's configured mail system 
    471 *   No third-party email services required
    472 *   Full compliance with privacy regulations
     383- Uses your mail system
     384- No third-party services
     385- Privacy-compliant
    473386
    474387**Data Portability**
    475 *   Built-in export capabilities for all ticket data
    476 *   Standard WordPress data formats for easy migration
    477 *   GDPR-compliant data handling and deletion options
     388- Export all data
     389- WordPress formats
     390- GDPR-ready
    478391
    479392**Security Measures**
    480 *   Industry-standard encryption for sensitive data
    481 *   Regular security audits and updates
    482 *   WordPress security best practices throughout
    483 
    484 For complete privacy policy details, visit: https://nexlifylabs.com/privacy-policy
     393- Encryption
     394- Regular audits
     395- Best practices
     396
     397See [Privacy Policy](https://nexlifylabs.com/privacy-policy) for details.
    485398
    486399== Uninstall Process ==
    487400
    488401**Data Retention (Default)**
    489 By default, NexlifyDesk preserves all your valuable support data when uninstalled:
    490 *   All tickets and customer conversations
    491 *   Agent responses and internal notes 
    492 *   File attachments and customer data
    493 *   Categories and configuration settings
    494 *   Performance analytics and reports
     402- Keeps all data (tickets, attachments, etc.) on uninstall—your history stays safe!
    495403
    496404**Complete Removal (Optional)**
    497 To permanently delete all plugin data during uninstall:
    4984051. Go to NexlifyDesk > Settings
    499 2. Uncheck "Keep all tickets and data when plugin is uninstalled" 
    500 3. Save settings before uninstalling
    501 
    502 **Warning**: Complete removal permanently deletes ALL support history, customer data, and configurations. This action cannot be undone. Always backup your database before proceeding.
    503 
    504 **What Gets Removed During Complete Uninstall**
    505 *   All support tickets and conversations
    506 *   Customer replies and agent responses
    507 *   File attachments and uploaded documents
    508 *   Ticket categories and custom settings
    509 *   Agent positions and permission configurations
    510 *   Email templates and notification settings
    511 *   All analytics data and performance reports
     4062. Uncheck "Keep all tickets and data"
     4073. Save and uninstall
     408
     409**Warning**: Deletes EVERYTHING—backup first!
Note: See TracChangeset for help on using the changeset viewer.