PluginProbe
MxChat – AI Chatbot & Content Generation for WordPress / 3.2.2
MxChat – AI Chatbot & Content Generation for WordPress v3.2.2
3.2.21 3.2.20 3.2.19 3.2.18 3.2.17 3.2.16 3.2.15 3.2.14 3.2.12 3.2.13 3.2.11 3.2.10 3.2.9 3.2.8 3.2.7 3.2.6 3.2.5 3.2.4 3.2.3 3.2.2 3.2.1 2.0.3 2.0.4 2.0.5 2.0.6 All 152 releases
mxchat-basic / includes / class-mxchat-addons.php

class-mxchat-addons.php in MxChat – AI Chatbot & Content Generation for WordPress 3.2.2, at includes/class-mxchat-addons.php

681 lines 48.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * The admin-specific functionality for the Add Ons page.
4 *
5 * @package MxChat
6 * @subpackage MxChat/admin
7 */
8 class MxChat_Addons {
9 /**
10 * Store add-on configuration data
11 *
12 * @var array
13 */
14 private $addons_config;
15
16 /**
17 * Initialize the class and set its properties.
18 */
19 public function __construct() {
20 $this->addons_config = array(
21
22 'mxchat-advanced-content' => array(
23 'title' => __('MxChat Advanced Content Editor', 'mxchat'),
24 'sidebar_title' => __('Content Gen.', 'mxchat'),
25 'description' => __('Supercharge your AI content generation workflow. Add advanced editing tools, image management, SEO meta controls, and internal linking to the MxChat Content Generator—turning simple prompts into publish-ready posts and landing pages.', 'mxchat'),
26 'key_benefits' => array(
27 __('AI-powered image regeneration & uploads', 'mxchat'),
28 __('SEO meta title, description & excerpt editor', 'mxchat'),
29 __('Automatic internal linking between posts', 'mxchat')
30 ),
31 'license' => 'MxChat PRO',
32 'accent' => '#6366f1',
33 'url' => 'https://mxchat.ai/documentation-bot/',
34 'download_url' => 'https://mxchat.ai/advanced-content-editor/',
35 'plugin_file' => 'mxchat-advanced-content/mxchat-advanced-content.php',
36 'config_page' => 'mxchat-content',
37 'hero_features' => array(
38 array(
39 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>',
40 'title' => __('Image Management', 'mxchat'),
41 'desc' => __('Regenerate, upload, and swap AI images', 'mxchat'),
42 ),
43 array(
44 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>',
45 'title' => __('SEO Meta Editor', 'mxchat'),
46 'desc' => __('Title, description & excerpt controls', 'mxchat'),
47 ),
48 array(
49 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>',
50 'title' => __('Internal Linking', 'mxchat'),
51 'desc' => __('Auto-link to related posts & pages', 'mxchat'),
52 ),
53 array(
54 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z"/></svg>',
55 'title' => __('Chat-Based Editing', 'mxchat'),
56 'desc' => __('Refine content through conversation', 'mxchat'),
57 ),
58 ),
59 ),
60
61 'mxchat-theme' => array(
62 'title' => __('MxChat Chat Themes', 'mxchat'),
63 'description' => __('Make your chatbot uniquely yours. Generate beautiful themes instantly using simple descriptions or customize manually with precise color controls—zero coding required. Perfect for matching your brand identity.', 'mxchat'),
64 'key_benefits' => array(
65 __('AI-powered theme generator', 'mxchat'),
66 __('Live preview customizer', 'mxchat'),
67 __('One-click theme application', 'mxchat')
68 ),
69 'license' => 'MxChat PRO',
70 'accent' => '#fa73e6',
71 'url' => 'https://mxchat.ai/ai-theme-customizer/',
72 'plugin_file' => 'mxchat-theme/mxchat-theme.php',
73 'config_page' => 'mxchat-theme-settings',
74 'hero_features' => array(
75 array(
76 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="13.5" cy="6.5" r="2.5"/><path d="M17.5 10.5l4-4"/><circle cx="6" cy="12" r="2"/><path d="M2 14l2-2"/><circle cx="10.5" cy="17.5" r="2.5"/><path d="M14 21l-1-3"/></svg>',
77 'title' => __('AI Theme Generator', 'mxchat'),
78 'desc' => __('Describe your style, AI creates it', 'mxchat'),
79 ),
80 array(
81 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18"/><path d="M9 21V9"/></svg>',
82 'title' => __('Live Preview', 'mxchat'),
83 'desc' => __('See changes in real-time', 'mxchat'),
84 ),
85 array(
86 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v4"/><path d="m16.2 7.8 2.9-2.9"/><path d="M18 12h4"/><path d="m16.2 16.2 2.9 2.9"/><path d="M12 18v4"/><path d="m4.9 19.1 2.9-2.9"/><path d="M2 12h4"/><path d="m4.9 4.9 2.9 2.9"/></svg>',
87 'title' => __('Color Controls', 'mxchat'),
88 'desc' => __('Fine-tune every color precisely', 'mxchat'),
89 ),
90 array(
91 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>',
92 'title' => __('One-Click Apply', 'mxchat'),
93 'desc' => __('Apply themes instantly', 'mxchat'),
94 ),
95 ),
96 ),
97
98 'mxchat-admin-assistant' => array(
99 'title' => __('MxChat Admin Assistant', 'mxchat'),
100 'description' => __('Your AI powerhouse inside WordPress. Chat with multiple AI models, generate images, research the web, and boost productivity—all without leaving your dashboard.', 'mxchat'),
101 'key_benefits' => array(
102 __('ChatGPT-like admin interface', 'mxchat'),
103 __('Generate images & research web', 'mxchat'),
104 __('Searchable chat history', 'mxchat')
105 ),
106 'license' => 'MxChat PRO',
107 'accent' => '#fa73e6',
108 'url' => 'https://mxchat.ai/ai-admin-assistant/',
109 'plugin_file' => 'mxchat-admin-chat/mxchat-admin-chat.php',
110 'config_page' => 'mxchat-admin-chat',
111 'hero_features' => array(
112 array(
113 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>',
114 'title' => __('Admin Chat UI', 'mxchat'),
115 'desc' => __('ChatGPT-like dashboard interface', 'mxchat'),
116 ),
117 array(
118 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>',
119 'title' => __('Image Generation', 'mxchat'),
120 'desc' => __('Create images with AI prompts', 'mxchat'),
121 ),
122 array(
123 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>',
124 'title' => __('Web Research', 'mxchat'),
125 'desc' => __('Search the web from your dashboard', 'mxchat'),
126 ),
127 array(
128 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 16 12 14 15 10 9 8 12 2 12"/></svg>',
129 'title' => __('Chat History', 'mxchat'),
130 'desc' => __('Searchable conversation archive', 'mxchat'),
131 ),
132 ),
133 ),
134
135 'mxchat-veo' => array(
136 'title' => __('MxChat Video Generation', 'mxchat'),
137 'description' => __('Generate stunning AI videos using Google Veo 2 and Veo 3 models directly from your WordPress dashboard. Create high-quality videos from text prompts with audio, multiple aspect ratios, and optimized generation speeds.', 'mxchat'),
138 'key_benefits' => array(
139 __('Multiple Veo models (Veo 2, 3, 3 Fast)', 'mxchat'),
140 __('8-second videos with native audio', 'mxchat'),
141 __('Media library integration', 'mxchat')
142 ),
143 'license' => 'MxChat PRO',
144 'accent' => '#ff6b35',
145 'url' => 'https://mxchat.ai/mxchat-veo-video-generation/',
146 'plugin_file' => 'mxchat-veo/mxchat-veo.php',
147 'config_page' => 'mxchat-veo',
148 'hero_features' => array(
149 array(
150 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="23 7 16 12 23 17 23 7"/><rect x="1" y="5" width="15" height="14" rx="2" ry="2"/></svg>',
151 'title' => __('AI Video Creation', 'mxchat'),
152 'desc' => __('Generate videos from text prompts', 'mxchat'),
153 ),
154 array(
155 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/></svg>',
156 'title' => __('Native Audio', 'mxchat'),
157 'desc' => __('Videos with built-in audio tracks', 'mxchat'),
158 ),
159 array(
160 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3h7a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-7m0-18H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h7m0-18v18"/></svg>',
161 'title' => __('Aspect Ratios', 'mxchat'),
162 'desc' => __('Multiple size options available', 'mxchat'),
163 ),
164 array(
165 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>',
166 'title' => __('Media Library', 'mxchat'),
167 'desc' => __('Save directly to WordPress media', 'mxchat'),
168 ),
169 ),
170 ),
171
172 'mxchat-image-analysis' => array(
173 'title' => __('MxChat Image Analysis', 'mxchat'),
174 'description' => __('Enhance your chatbot with AI-powered image analysis. Users can upload images for intelligent descriptions, OCR text extraction, and get answers about visual content using OpenAI Vision and Grok APIs.', 'mxchat'),
175 'key_benefits' => array(
176 __('Multiple AI vision models', 'mxchat'),
177 __('Drag & drop image uploads', 'mxchat'),
178 __('Custom analysis prompts', 'mxchat')
179 ),
180 'license' => 'MxChat PRO',
181 'accent' => '#fa73e6',
182 'url' => 'https://mxchat.ai/image-analysis/',
183 'plugin_file' => 'mxchat-vision/mxchat-vision.php',
184 'config_page' => 'mxchat-vision',
185 'hero_features' => array(
186 array(
187 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>',
188 'title' => __('Vision AI Models', 'mxchat'),
189 'desc' => __('OpenAI Vision & Grok analysis', 'mxchat'),
190 ),
191 array(
192 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 16 12 12 8 16"/><line x1="12" y1="12" x2="12" y2="21"/><path d="M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3"/></svg>',
193 'title' => __('Drag & Drop', 'mxchat'),
194 'desc' => __('Easy image upload in chat', 'mxchat'),
195 ),
196 array(
197 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>',
198 'title' => __('OCR Extraction', 'mxchat'),
199 'desc' => __('Extract text from images', 'mxchat'),
200 ),
201 array(
202 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="4" y1="21" x2="4" y2="14"/><line x1="4" y1="10" x2="4" y2="3"/><line x1="12" y1="21" x2="12" y2="12"/><line x1="12" y1="8" x2="12" y2="3"/><line x1="20" y1="21" x2="20" y2="16"/><line x1="20" y1="12" x2="20" y2="3"/><line x1="1" y1="14" x2="7" y2="14"/><line x1="9" y1="8" x2="15" y2="8"/><line x1="17" y1="16" x2="23" y2="16"/></svg>',
203 'title' => __('Custom Prompts', 'mxchat'),
204 'desc' => __('Tailor analysis instructions', 'mxchat'),
205 ),
206 ),
207 ),
208
209 'mxchat-forms' => array(
210 'title' => __('MxChat Forms', 'mxchat'),
211 'description' => __('Convert conversations into data collection. Create smart forms that trigger during chats, collect user information, and turn casual visitors into qualified leads.', 'mxchat'),
212 'key_benefits' => array(
213 __('No-code form builder', 'mxchat'),
214 __('Intent-triggered activation', 'mxchat'),
215 __('Export lead data easily', 'mxchat')
216 ),
217 'license' => 'MxChat PRO',
218 'accent' => '#fa73e6',
219 'url' => 'https://mxchat.ai/forms-action/',
220 'plugin_file' => 'mxchat-forms/mxchat-forms.php',
221 'config_page' => 'mxchat-forms',
222 'hero_features' => array(
223 array(
224 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><line x1="9" y1="9" x2="15" y2="9"/><line x1="9" y1="13" x2="15" y2="13"/><line x1="9" y1="17" x2="12" y2="17"/></svg>',
225 'title' => __('Form Builder', 'mxchat'),
226 'desc' => __('No-code drag & drop builder', 'mxchat'),
227 ),
228 array(
229 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>',
230 'title' => __('Smart Triggers', 'mxchat'),
231 'desc' => __('Show forms based on intent', 'mxchat'),
232 ),
233 array(
234 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>',
235 'title' => __('Lead Capture', 'mxchat'),
236 'desc' => __('Turn visitors into contacts', 'mxchat'),
237 ),
238 array(
239 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>',
240 'title' => __('Data Export', 'mxchat'),
241 'desc' => __('Export leads to CSV easily', 'mxchat'),
242 ),
243 ),
244 ),
245
246 'mxchat-multi-bot' => array(
247 'title' => __('MxChat Multi-Bot Manager', 'mxchat'),
248 'description' => __('Create unlimited specialized chatbots for every purpose. Deploy dedicated bots with separate knowledge bases, custom personalities, and page-specific assignments—perfect for support, sales, and department-specific assistance.', 'mxchat'),
249 'key_benefits' => array(
250 __('Unlimited specialized chatbots', 'mxchat'),
251 __('Separate Pinecone knowledge bases', 'mxchat'),
252 __('Page-specific bot assignments', 'mxchat')
253 ),
254 'license' => 'MxChat PRO',
255 'accent' => '#8b5cf6',
256 'url' => 'https://mxchat.ai/multi-bot/',
257 'plugin_file' => 'mxchat-multi-bot/mxchat-multi-bot.php',
258 'config_page' => 'mxchat-multi-bot',
259 'hero_features' => array(
260 array(
261 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>',
262 'title' => __('Unlimited Bots', 'mxchat'),
263 'desc' => __('Create specialized chatbots', 'mxchat'),
264 ),
265 array(
266 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/></svg>',
267 'title' => __('Separate Knowledge', 'mxchat'),
268 'desc' => __('Unique knowledge per bot', 'mxchat'),
269 ),
270 array(
271 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>',
272 'title' => __('Page Assignments', 'mxchat'),
273 'desc' => __('Assign bots to specific pages', 'mxchat'),
274 ),
275 array(
276 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>',
277 'title' => __('Custom Personas', 'mxchat'),
278 'desc' => __('Unique personality per bot', 'mxchat'),
279 ),
280 ),
281 ),
282
283 'mxchat-trigger' => array(
284 'title' => __('MxChat Trigger', 'mxchat'),
285 'description' => __('Turn any element into a conversation starter. Add chat trigger buttons and links throughout your website that open MxChat and send predefined messages—perfect for CTAs, support links, and guided experiences.', 'mxchat'),
286 'key_benefits' => array(
287 __('Simple data attribute triggers', 'mxchat'),
288 __('Multi-Bot targeting support', 'mxchat'),
289 __('Built-in button styles & animations', 'mxchat')
290 ),
291 'license' => 'MxChat PRO',
292 'accent' => '#3ac9d1',
293 'url' => 'https://mxchat.ai/triggers/',
294 'plugin_file' => 'mxchat-trigger/mxchat-trigger.php',
295 'config_page' => 'mxchat-triggers',
296 'hero_features' => array(
297 array(
298 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="16"/><line x1="8" y1="12" x2="16" y2="12"/></svg>',
299 'title' => __('Element Triggers', 'mxchat'),
300 'desc' => __('Turn any element into a trigger', 'mxchat'),
301 ),
302 array(
303 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>',
304 'title' => __('Preset Messages', 'mxchat'),
305 'desc' => __('Auto-send predefined prompts', 'mxchat'),
306 ),
307 array(
308 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>',
309 'title' => __('Multi-Bot Targeting', 'mxchat'),
310 'desc' => __('Route to specific bots', 'mxchat'),
311 ),
312 array(
313 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><path d="M12 8v8"/><path d="M8 12h8"/></svg>',
314 'title' => __('Button Styles', 'mxchat'),
315 'desc' => __('Built-in styles & animations', 'mxchat'),
316 ),
317 ),
318 ),
319
320 'mxchat-anywhere' => array(
321 'title' => __('MxChat Anywhere', 'mxchat'),
322 'sidebar_title' => __('MxChat Anywhere', 'mxchat'),
323 'description' => __('Deploy your AI chatbot on any website with a single script tag. Works on static HTML, Shopify, Squarespace, Wix, and custom web apps — no WordPress required on the target site. Full feature parity with Shadow DOM style isolation.', 'mxchat'),
324 'key_benefits' => array(
325 __('One script tag — works on any website', 'mxchat'),
326 __('Shadow DOM prevents CSS conflicts', 'mxchat'),
327 __('Domain-validated security keys', 'mxchat')
328 ),
329 'license' => 'MxChat PRO',
330 'accent' => '#10b981',
331 'url' => 'https://mxchat.ai/mxchat-anywhere-deploy-your-ai-chatbot-on-any-website-with-one-script-tag/',
332 'download_url' => 'https://mxchat.ai/mxchat-anywhere-deploy-your-ai-chatbot-on-any-website-with-one-script-tag/',
333 'plugin_file' => 'mxchat-embed/mxchat-embed.php',
334 'config_page' => 'mxchat-embed',
335 'hero_features' => array(
336 array(
337 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>',
338 'title' => __('Universal Embed', 'mxchat'),
339 'desc' => __('One script tag on any website', 'mxchat'),
340 ),
341 array(
342 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>',
343 'title' => __('Style Isolation', 'mxchat'),
344 'desc' => __('Shadow DOM prevents CSS conflicts', 'mxchat'),
345 ),
346 array(
347 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>',
348 'title' => __('Domain Security', 'mxchat'),
349 'desc' => __('Validated keys per domain', 'mxchat'),
350 ),
351 array(
352 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>',
353 'title' => __('Zero Dependencies', 'mxchat'),
354 'desc' => __('Vanilla JS, no impact on Core Web Vitals', 'mxchat'),
355 ),
356 ),
357 ),
358
359 'mxchat-woo' => array(
360 'title' => __('MxChat WooCommerce', 'mxchat'),
361 'description' => __('Boost sales with AI-powered shopping assistance. Help customers find products, manage carts, and complete purchases—all through natural conversation.', 'mxchat'),
362 'key_benefits' => array(
363 __('Smart product recommendations', 'mxchat'),
364 __('Cart & checkout assistance', 'mxchat'),
365 __('Order history access', 'mxchat')
366 ),
367 'license' => 'MxChat PRO',
368 'accent' => '#fa73e6',
369 'url' => 'https://mxchat.ai/woocommerce/',
370 'plugin_file' => 'mxchat-woo/mxchat-woo.php',
371 'config_page' => 'mxchat-woo',
372 'hero_features' => array(
373 array(
374 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="21" r="1"/><circle cx="20" cy="21" r="1"/><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"/></svg>',
375 'title' => __('Cart Assistant', 'mxchat'),
376 'desc' => __('Manage cart through conversation', 'mxchat'),
377 ),
378 array(
379 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="8" y1="6" x2="21" y2="6"/><line x1="8" y1="12" x2="21" y2="12"/><line x1="8" y1="18" x2="21" y2="18"/><line x1="3" y1="6" x2="3.01" y2="6"/><line x1="3" y1="12" x2="3.01" y2="12"/><line x1="3" y1="18" x2="3.01" y2="18"/></svg>',
380 'title' => __('Product Search', 'mxchat'),
381 'desc' => __('Smart product recommendations', 'mxchat'),
382 ),
383 array(
384 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="4" width="22" height="16" rx="2" ry="2"/><line x1="1" y1="10" x2="23" y2="10"/></svg>',
385 'title' => __('Checkout Help', 'mxchat'),
386 'desc' => __('Guide customers to purchase', 'mxchat'),
387 ),
388 array(
389 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/></svg>',
390 'title' => __('Order History', 'mxchat'),
391 'desc' => __('Look up past orders in chat', 'mxchat'),
392 ),
393 ),
394 ),
395
396 'mxchat-assistant-api' => array(
397 'title' => __('MxChat Assistant API', 'mxchat'),
398 'description' => __('Unlock the full power of OpenAI Assistants. Bypass MxChat\'s knowledge base and connect directly to your custom OpenAI Assistant for advanced AI capabilities and specialized responses.', 'mxchat'),
399 'key_benefits' => array(
400 __('Custom OpenAI Assistant integration', 'mxchat'),
401 __('Advanced AI capabilities', 'mxchat'),
402 __('24-hour conversation persistence', 'mxchat')
403 ),
404 'license' => 'MxChat PRO',
405 'accent' => '#00d4aa',
406 'url' => 'https://mxchat.ai/openai-assistants-api/',
407 'plugin_file' => 'mxchat-assistant-api/mxchat-assistant-api.php',
408 'config_page' => 'mxchat-assistant-api',
409 'hero_features' => array(
410 array(
411 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>',
412 'title' => __('OpenAI Assistants', 'mxchat'),
413 'desc' => __('Connect your custom Assistant', 'mxchat'),
414 ),
415 array(
416 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>',
417 'title' => __('Advanced AI', 'mxchat'),
418 'desc' => __('Full Assistant API capabilities', 'mxchat'),
419 ),
420 array(
421 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>',
422 'title' => __('24hr Persistence', 'mxchat'),
423 'desc' => __('Conversations persist all day', 'mxchat'),
424 ),
425 array(
426 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>',
427 'title' => __('Direct Connect', 'mxchat'),
428 'desc' => __('Bypass MxChat knowledge base', 'mxchat'),
429 ),
430 ),
431 ),
432
433 'mxchat-perplexity' => array(
434 'title' => __('MxChat Perplexity', 'mxchat'),
435 'description' => __('Give your chatbot real-time knowledge. Add powerful web search capabilities so your bot can answer questions about current events and time-sensitive information.', 'mxchat'),
436 'key_benefits' => array(
437 __('Real-time web search', 'mxchat'),
438 __('Intent-triggered research', 'mxchat'),
439 __('Up-to-date information', 'mxchat')
440 ),
441 'license' => 'MxChat PRO',
442 'accent' => '#fa73e6',
443 'url' => 'https://quickdeploywp.com/plugin/mxchat-perplexity/',
444 'plugin_file' => 'mxchat-perplexity/mxchat-perplexity.php',
445 'config_page' => 'mxchat-perplexity',
446 'hero_features' => array(
447 array(
448 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>',
449 'title' => __('Web Search', 'mxchat'),
450 'desc' => __('Real-time internet searching', 'mxchat'),
451 ),
452 array(
453 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>',
454 'title' => __('Intent Triggers', 'mxchat'),
455 'desc' => __('Auto-search when needed', 'mxchat'),
456 ),
457 array(
458 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>',
459 'title' => __('Live Data', 'mxchat'),
460 'desc' => __('Up-to-date information always', 'mxchat'),
461 ),
462 array(
463 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>',
464 'title' => __('Seamless Chat', 'mxchat'),
465 'desc' => __('Results blend into conversation', 'mxchat'),
466 ),
467 ),
468 ),
469
470 'mxchat-moderation' => array(
471 'title' => __('MxChat Moderation', 'mxchat'),
472 'description' => __('Keep your chat clean and professional. Block unwanted users, filter inappropriate content, and ensure your chatbot represents your brand properly.', 'mxchat'),
473 'key_benefits' => array(
474 __('IP & email-based blocking', 'mxchat'),
475 __('Content filtering', 'mxchat'),
476 __('Spam protection', 'mxchat')
477 ),
478 'license' => 'MxChat PRO',
479 'accent' => '#fa73e6',
480 'url' => 'https://quickdeploywp.com/plugin/mxchat-moderation/',
481 'plugin_file' => 'mxchat-moderation/mx-chat-moderation.php',
482 'config_page' => 'mx-chat-moderation',
483 'hero_features' => array(
484 array(
485 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>',
486 'title' => __('Content Filter', 'mxchat'),
487 'desc' => __('Block inappropriate content', 'mxchat'),
488 ),
489 array(
490 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="4.93" y1="4.93" x2="19.07" y2="19.07"/></svg>',
491 'title' => __('User Blocking', 'mxchat'),
492 'desc' => __('IP & email-based bans', 'mxchat'),
493 ),
494 array(
495 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>',
496 'title' => __('Spam Protection', 'mxchat'),
497 'desc' => __('Detect and prevent spam', 'mxchat'),
498 ),
499 array(
500 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="8.5" cy="7" r="4"/><line x1="20" y1="8" x2="20" y2="14"/><line x1="23" y1="11" x2="17" y2="11"/></svg>',
501 'title' => __('Brand Safety', 'mxchat'),
502 'desc' => __('Keep chat professional', 'mxchat'),
503 ),
504 ),
505 ),
506
507 );
508 }
509
510 /**
511 * Get the addons configuration array
512 *
513 * @return array The addons configuration
514 */
515 public function get_addons_config() {
516 return $this->addons_config;
517 }
518
519 /**
520 * Register the stylesheets for the admin area.
521 */
522 public function enqueue_styles() {
523 wp_enqueue_style(
524 'mxchat-addons',
525 plugin_dir_url(__FILE__) . '../css/admin-add-ons.css',
526 array(),
527 MXCHAT_VERSION,
528 'all'
529 );
530 }
531
532 /**
533 * Check if an addon is installed and active
534 *
535 * @param string $plugin_file The plugin's main file path
536 * @return array Status information
537 */
538 private function get_addon_status($plugin_file) {
539 if (!function_exists('get_plugins')) {
540 require_once ABSPATH . 'wp-admin/includes/plugin.php';
541 }
542
543 $all_plugins = get_plugins();
544 $active_plugins = get_option('active_plugins', array());
545
546 // Find the addon by iterating through configs
547 $config_page = '';
548 foreach ($this->addons_config as $slug => $addon) {
549 if ($addon['plugin_file'] === $plugin_file) {
550 $config_page = $addon['config_page'];
551 break;
552 }
553 }
554
555 if (isset($all_plugins[$plugin_file])) {
556 if (in_array($plugin_file, $active_plugins)) {
557 return array(
558 'status' => 'active',
559 'action_url' => admin_url('admin.php?page=' . $config_page),
560 'action_text' => __('Configure', 'mxchat')
561 );
562 } else {
563 return array(
564 'status' => 'inactive',
565 'action_url' => wp_nonce_url(
566 admin_url('plugins.php?action=activate&plugin=' . $plugin_file),
567 'activate-plugin_' . $plugin_file
568 ),
569 'action_text' => __('Activate', 'mxchat')
570 );
571 }
572 }
573
574 return array(
575 'status' => 'not-installed',
576 'action_url' => '',
577 'action_text' => __('Get Extension', 'mxchat')
578 );
579 }
580
581 /**
582 * Render the Add Ons page content.
583 */
584 public function render_page() {
585 $this->enqueue_styles();
586 // Remove the sorting logic and just use the original order
587 $sorted_addons = $this->addons_config;
588
589 ?>
590 <div class="wrap mxchat-addons-wrapper">
591 <div class="mxchat-addons-hero">
592 <h1 class="mxchat-main-title">
593 <span class="mxchat-gradient-text">Power Up</span> Your Chatbot
594 </h1>
595 <p class="mxchat-hero-subtitle">
596 <?php esc_html_e('Extend MxChat with these powerful extensions and unlock advanced features.', 'mxchat'); ?>
597 </p>
598 </div>
599
600 <div class="mxchat-addons-section">
601 <div class="mxchat-addons-grid">
602 <?php foreach ($sorted_addons as $slug => $addon): ?>
603 <?php $this->render_addon_card($slug, $addon); ?>
604 <?php endforeach; ?>
605 </div>
606 </div>
607
608 <div class="mxchat-cta-section">
609 <h2><?php esc_html_e('Ready to take your chatbot to the next level?', 'mxchat'); ?></h2>
610 <p><?php esc_html_e('Get MxChat PRO today and access all premium extensions at one low price.', 'mxchat'); ?></p>
611 <a href="https://mxchat.ai/" class="mxchat-cta-button" target="_blank"><?php esc_html_e('Learn More', 'mxchat'); ?></a>
612 </div>
613 </div>
614 <?php
615 }
616
617 /**
618 * Render individual add-on card
619 *
620 * @param string $slug The addon slug
621 * @param array $addon The addon configuration array
622 */
623 private function render_addon_card($slug, $addon) {
624 $status_info = $this->get_addon_status($addon['plugin_file']);
625 $button_url = $status_info['status'] === 'not-installed' ? $addon['url'] : $status_info['action_url'];
626 $button_target = $status_info['status'] === 'not-installed' ? '_blank' : '_self';
627
628 // Check if addon is deprecated
629 $is_deprecated = isset($addon['status']) && $addon['status'] === 'deprecated';
630 ?>
631 <div class="mxchat-addon-card <?php echo $is_deprecated ? 'deprecated' : ''; ?>" style="--card-accent: <?php echo esc_attr($addon['accent']); ?>">
632 <div class="mxchat-addon-badge">
633 <?php if ($is_deprecated): ?>
634 <?php esc_html_e('Deprecated', 'mxchat'); ?>
635 <?php else: ?>
636 <?php echo esc_html(ucfirst($addon['license'])); ?>
637 <?php endif; ?>
638 </div>
639 <div class="mxchat-addon-content">
640 <h3 class="mxchat-addon-title"><?php echo esc_html($addon['title']); ?></h3>
641 <p class="mxchat-addon-description"><?php echo esc_html($addon['description']); ?></p>
642
643 <?php if (!empty($addon['key_benefits'])): ?>
644 <div class="mxchat-benefits-list">
645 <?php foreach ($addon['key_benefits'] as $benefit): ?>
646 <div class="mxchat-benefit-item">
647 <span class="mxchat-benefit-icon"></span>
648 <?php echo esc_html($benefit); ?>
649 </div>
650 <?php endforeach; ?>
651 </div>
652 <?php endif; ?>
653
654 <div class="mxchat-addon-footer">
655 <?php if ($is_deprecated): ?>
656 <div class="mxchat-status-indicator deprecated">
657 <?php esc_html_e('Now Built-in', 'mxchat'); ?>
658 </div>
659 <a href="<?php echo esc_url(admin_url('admin.php?page=mxchat-prompts')); ?>"
660 class="mxchat-action-button deprecated"
661 target="_self">
662 <?php esc_html_e('Go to Knowledge Tab', 'mxchat'); ?>
663 </a>
664 <?php else: ?>
665 <div class="mxchat-status-indicator <?php echo esc_attr($status_info['status']); ?>">
666 <?php echo esc_html(ucfirst(str_replace('-', ' ', $status_info['status']))); ?>
667 </div>
668 <a href="<?php echo esc_url($button_url); ?>"
669 class="mxchat-action-button"
670 target="<?php echo esc_attr($button_target); ?>"
671 data-action="<?php echo esc_attr($status_info['status']); ?>">
672 <?php echo esc_html($status_info['action_text']); ?>
673 </a>
674 <?php endif; ?>
675 </div>
676 </div>
677 </div>
678 <?php
679 }
680
681 }