PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.1.3
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.1.3
3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / classes / admin.php
ai-engine / classes Last commit date
data 1 year ago engines 8 months ago exceptions 1 year ago modules 8 months ago query 8 months ago rest 8 months ago services 8 months ago admin.php 8 months ago api.php 8 months ago core.php 8 months ago discussion.php 1 year ago event.php 1 year ago init.php 8 months ago logging.php 1 year ago reply.php 8 months ago rest.php 8 months ago
admin.php
405 lines
1 <?php
2
3 class Meow_MWAI_Admin extends MeowCommon_Admin {
4 public $core;
5 public $contentGeneratorEnabled;
6 public $imagesGeneratorEnabled;
7 public $videosGeneratorEnabled;
8 public $playgroundEnabled;
9 public $suggestionsEnabled;
10
11 public function __construct( $core ) {
12 $this->core = $core;
13 parent::__construct( MWAI_PREFIX, MWAI_ENTRY, MWAI_DOMAIN, class_exists( 'MeowPro_MWAI_Core' ) );
14 if ( is_admin() ) {
15 $this->contentGeneratorEnabled = $this->core->get_option( 'module_generator_content' );
16 $this->imagesGeneratorEnabled = $this->core->get_option( 'module_generator_images' );
17 $this->videosGeneratorEnabled = $this->core->get_option( 'module_generator_videos' );
18 $this->playgroundEnabled = $this->core->get_option( 'module_playground' );
19 $can_access_settings = $this->core->can_access_settings();
20 $can_access_features = $this->core->can_access_features();
21
22 if ( $can_access_settings || $can_access_features ) {
23 add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] );
24 }
25
26 if ( $can_access_settings ) {
27 add_action( 'admin_menu', [ $this, 'app_menu' ] );
28 }
29
30 if ( $can_access_features ) {
31 add_action( 'admin_menu', [ $this, 'admin_menu' ] );
32
33 // Only if the Suggestions are enabled.
34 $this->suggestionsEnabled = $this->core->get_option( 'module_suggestions' );
35 if ( $this->suggestionsEnabled ) {
36 add_filter( 'post_row_actions', [ $this, 'post_row_actions' ], 10, 2 );
37 add_filter( 'page_row_actions', [ $this, 'post_row_actions' ], 10, 2 );
38 }
39
40 if ( $this->imagesGeneratorEnabled ) {
41 add_filter( 'media_row_actions', [ $this, 'media_row_actions' ], 10, 2 );
42 }
43
44 add_action( 'admin_footer', [ $this, 'admin_footer' ] );
45 }
46 }
47 }
48
49 public function admin_menu() {
50
51 // Generate New (under Posts)
52 if ( $this->contentGeneratorEnabled ) {
53 add_submenu_page(
54 'edit.php',
55 'Generate New',
56 'Generate New',
57 'read',
58 'mwai_content_generator',
59 [ $this, 'ai_content_generator' ],
60 2
61 );
62 }
63
64 // In Tools
65 if ( $this->playgroundEnabled ) {
66 add_management_page(
67 'Playground',
68 __( 'Playground', 'ai-engine' ),
69 'read',
70 'mwai_dashboard',
71 [ $this, 'ai_playground' ]
72 );
73 }
74 if ( $this->contentGeneratorEnabled ) {
75 add_management_page(
76 'Generate Content',
77 'Generate Content',
78 'read',
79 'mwai_content_generator',
80 [ $this, 'ai_content_generator' ]
81 );
82 }
83 if ( $this->imagesGeneratorEnabled ) {
84 add_management_page(
85 'Generate Images',
86 'Generate Images',
87 'read',
88 'mwai_images_generator',
89 [ $this, 'ai_image_generator' ]
90 );
91 }
92 if ( $this->videosGeneratorEnabled ) {
93 add_management_page(
94 'Generate Videos',
95 'Generate Videos',
96 'read',
97 'mwai_videos_generator',
98 [ $this, 'ai_video_generator' ]
99 );
100 }
101
102 // In the Admin Bar:
103 add_action( 'admin_bar_menu', [ $this, 'admin_bar_menu' ], 100 );
104 }
105
106 public function admin_bar_menu( $wp_admin_bar ) {
107
108 $admin_bar = $this->core->get_option( 'admin_bar' );
109 $settings = isset( $admin_bar['settings'] ) && $admin_bar['settings'];
110 $playground = isset( $admin_bar['playground'] ) && $admin_bar['playground'];
111 $content_generator = isset( $admin_bar['content_generator'] ) && $admin_bar['content_generator'];
112 $images_generator = isset( $admin_bar['images_generator'] ) && $admin_bar['images_generator'];
113 $videos_generator = isset( $admin_bar['videos_generator'] ) && $admin_bar['videos_generator'];
114
115 if ( $settings ) {
116 $wp_admin_bar->add_node( [
117 'id' => 'mwai-settings',
118 'title' => '<span class="ab-icon dashicons-before dashicons-admin-settings" style="top: 2px;"></span>' . __( 'AI Engine', 'ai-engine' ),
119 'href' => admin_url( 'admin.php?page=mwai_settings' ),
120 'meta' => [ 'class' => 'mwai-settings' ],
121 ] );
122 }
123
124 if ( $content_generator ) {
125 $wp_admin_bar->add_node( [
126 'id' => 'mwai-content-generator',
127 'title' => MWAI_IMG_WAND_HTML . __( 'Content', 'ai-engine' ),
128 'href' => admin_url( 'tools.php?page=mwai_content_generator' ),
129 'meta' => [ 'class' => 'mwai-content-generator' ],
130 ] );
131 }
132 if ( $images_generator ) {
133 $wp_admin_bar->add_node( [
134 'id' => 'mwai-image-generator',
135 'title' => MWAI_IMG_WAND_HTML . __( 'Images', 'ai-engine' ),
136 'href' => admin_url( 'tools.php?page=mwai_images_generator' ),
137 'meta' => [ 'class' => 'mwai-images-generator' ],
138 ] );
139 }
140 if ( $videos_generator ) {
141 $wp_admin_bar->add_node( [
142 'id' => 'mwai-video-generator',
143 'title' => MWAI_IMG_WAND_HTML . __( 'Videos', 'ai-engine' ),
144 'href' => admin_url( 'tools.php?page=mwai_videos_generator' ),
145 'meta' => [ 'class' => 'mwai-videos-generator' ],
146 ] );
147 }
148
149 // The Global Magic Wand
150 // if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
151 // $wp_admin_bar->add_node( array(
152 // 'id' => 'mwai-debug',
153 // 'title' => MWAI_IMG_WAND_HTML . __( 'Magic Wand', 'ai-engine' ),
154 // //'href' => admin_url( 'tools.php?page=mwai_debug' ),
155 // 'meta' => array( 'class' => 'mwai-debug' ),
156 // ) );
157 // }
158
159 if ( $playground ) {
160 $wp_admin_bar->add_node( [
161 'id' => 'mwai-playground',
162 'title' => MWAI_IMG_WAND_HTML . __( 'Playground', 'ai-engine' ),
163 'href' => admin_url( 'tools.php?page=mwai_dashboard' ),
164 'meta' => [ 'class' => 'mwai-playground' ],
165 ] );
166 }
167 }
168
169 public function ai_playground() {
170 echo '<div id="mwai-playground"></div>';
171 }
172
173 public function ai_content_generator() {
174 echo '<div id="mwai-content-generator"></div>';
175 }
176
177 public function ai_image_generator() {
178 echo '<div id="mwai-image-generator"></div>';
179 }
180
181 public function ai_video_generator() {
182 echo '<div id="mwai-video-generator"></div>';
183 }
184
185 public function post_row_actions( $actions, $post ) {
186 $actions['ai_magic_wand'] = '<span class="mwai-magic-wand-action" data-id="' . $post->ID . '" data-title="' . esc_attr( $post->post_title ) . '">
187 <a href="#" class="mwai-magic-wand-trigger">' . MWAI_IMG_WAND_HTML_XS . ' ' . __( 'Magic Wand', 'ai-engine' ) . '</a>
188 <div class="mwai-magic-wand-dropdown" style="display: none;">
189 <a class="mwai-link-title" href="#" data-id="' . $post->ID . '" data-title="' . esc_attr( $post->post_title ) . '">
190 <span class="dashicons dashicons-edit" style="font-size: 14px; line-height: 1.4; margin-right: 4px; pointer-events: none;"></span>' . __( 'Generate Title', 'ai-engine' ) . '
191 </a>
192 <a class="mwai-link-excerpt" href="#" data-id="' . $post->ID . '" data-title="' . esc_attr( $post->post_title ) . '">
193 <span class="dashicons dashicons-text" style="font-size: 14px; line-height: 1.4; margin-right: 4px; pointer-events: none;"></span>' . __( 'Generate Excerpt', 'ai-engine' ) . '
194 </a>
195 </div>
196 </span>';
197 return $actions;
198 }
199
200 public function media_row_actions( $actions, $post ) {
201 if ( strpos( $post->post_mime_type, 'image/' ) === 0 ) {
202 $url = admin_url( 'tools.php?page=mwai_images_generator&editId=' . $post->ID );
203 $actions['mwai_remix'] = '<a href="' . $url . '">' . MWAI_IMG_WAND_HTML_XS . ' ' . __( 'Edit', 'ai-engine' ) . '</a>';
204 }
205 return $actions;
206 }
207
208 public function admin_footer() {
209 // Don't add our admin footer div on the Site Editor
210 $current_screen = get_current_screen();
211 if ( $current_screen && $current_screen->base === 'site-editor' ) {
212 return;
213 }
214 echo '<div id="mwai-admin-postsList"></div>';
215
216 // Add CSS for Magic Wand dropdown
217 ?>
218 <style>
219 .mwai-magic-wand-action {
220 position: relative;
221 display: inline-block;
222 }
223
224 .mwai-magic-wand-trigger {
225 text-decoration: none;
226 }
227
228 .mwai-magic-wand-dropdown {
229 position: absolute;
230 top: 100%;
231 left: 0;
232 background: #fff;
233 border: 1px solid #c3c4c7;
234 border-radius: 4px;
235 box-shadow: 0 2px 5px rgba(0,0,0,0.15);
236 min-width: 150px;
237 z-index: 1000;
238 margin-top: 4px;
239 }
240
241 .mwai-magic-wand-dropdown a {
242 display: flex;
243 align-items: center;
244 padding: 8px 12px;
245 text-decoration: none;
246 color: #2271b1;
247 border-bottom: 1px solid #f0f0f1;
248 white-space: nowrap;
249 }
250
251 .mwai-magic-wand-dropdown a .dashicons {
252 width: 16px;
253 height: 16px;
254 font-size: 14px;
255 }
256
257 .mwai-magic-wand-dropdown a:last-child {
258 border-bottom: none;
259 }
260
261 .mwai-magic-wand-dropdown a:hover {
262 background: #f0f6fc;
263 color: #135e96;
264 }
265
266 /* Ensure dropdown stays visible when hovering over it */
267 .mwai-magic-wand-action:hover .mwai-magic-wand-dropdown {
268 display: block !important;
269 }
270 </style>
271 <?php
272 }
273
274 public function admin_enqueue_scripts() {
275 // Don't load our scripts on the Site Editor to avoid conflicts
276 $current_screen = get_current_screen();
277 if ( $current_screen && $current_screen->base === 'site-editor' ) {
278 return;
279 }
280
281 $physical_file = MWAI_PATH . '/app/index.js';
282 $cache_buster = file_exists( $physical_file ) ? filemtime( $physical_file ) : MWAI_VERSION;
283
284 // Cache override: Force cache refresh when ?mwai_cache=1 is in URL
285 if ( isset( $_GET['mwai_cache'] ) ) {
286 $cache_buster = time(); // Use current timestamp for guaranteed cache bust
287 }
288
289 wp_register_script( 'mwai-vendor', MWAI_URL . 'app/vendor.js', null, $cache_buster );
290
291 // Base dependencies
292 $deps = [ 'mwai-vendor', 'wp-element', 'wp-components', 'wp-plugins', 'wp-i18n' ];
293
294 // Check if we're on AI Engine admin pages
295 $is_ai_engine_page = $current_screen && (
296 strpos( $current_screen->id, 'mwai_settings' ) !== false ||
297 strpos( $current_screen->id, 'meowapps_page_mwai' ) !== false ||
298 $current_screen->id === 'meowapps_page_mwai_settings' ||
299 $current_screen->id === 'meowapps_page_mwai-ui' ||
300 strpos( $current_screen->id, 'meowapps' ) !== false && strpos( $_GET['page'] ?? '', 'mwai' ) !== false
301 );
302
303 // Only add wp-edit-post on actual post/page editor screens, not on AI Engine admin pages
304 $is_post_editor = $current_screen && in_array( $current_screen->base, [ 'post', 'page' ] );
305 if ( $is_post_editor ) {
306 $deps[] = 'wp-edit-post';
307 }
308
309 // Load block editor deps if:
310 // 1. We're on AI Engine admin pages (Forms.js component is always imported by Settings.js) OR
311 // 2. We are on a block editor screen (Edit Post)
312 $forms_module_enabled = $this->core->get_option( 'module_forms' );
313 $load_forms_editor = $forms_module_enabled && $this->core->get_option( 'forms_editor' );
314 $on_block_editor = function_exists( 'wp_should_load_block_editor_scripts_and_styles' ) && wp_should_load_block_editor_scripts_and_styles();
315
316 // Always load block editor deps on AI Engine admin pages because Forms.js is always imported
317 if ( $is_ai_engine_page || $on_block_editor ) {
318 $deps = array_merge( $deps, [ 'wp-blocks', 'wp-block-editor', 'wp-format-library', 'wp-block-library', 'wp-editor' ] );
319 }
320
321 wp_register_script( 'mwai', MWAI_URL . 'app/index.js', $deps, $cache_buster );
322 wp_enqueue_script( 'mwai' );
323
324 // Ensure core editor styles are available for embedded block editor UIs
325 // This helps Popovers, Inspector, and toolbars match Gutenberg styling
326 if ( function_exists( 'wp_enqueue_style' ) ) {
327 // Only load wp-edit-post styles on actual post/page editor screens
328 if ( $is_post_editor ) {
329 @wp_enqueue_style( 'wp-edit-post' );
330 }
331 @wp_enqueue_style( 'wp-components' );
332
333 // Load block editor styles if we're on AI Engine pages or on block editor
334 if ( $is_ai_engine_page || $on_block_editor ) {
335 @wp_enqueue_style( 'wp-block-editor' );
336 @wp_enqueue_style( 'wp-block-library' );
337 }
338 }
339 // Make sure core blocks and format tools are registered/available
340 if ( function_exists( 'wp_enqueue_script' ) ) {
341 if ( $is_ai_engine_page || $on_block_editor ) {
342 @wp_enqueue_script( 'wp-format-library' );
343 @wp_enqueue_script( 'wp-block-library' );
344 @wp_enqueue_script( 'wp-editor' );
345 }
346 }
347
348 // The MD5 of the translation file built by WP uses app/i18n.js instead of app/index.js
349 add_filter( 'load_script_translation_file', function ( $file, $handle, $domain ) {
350 if ( $domain !== 'ai-engine' ) {
351 return $file;
352 }
353 $file = str_replace( md5( 'app/index.js' ), md5( 'app/i18n.js' ), $file );
354 return $file;
355 }, 10, 3 );
356
357 // This is useless for AI Engine, but it avoids issues when themes and plugin calls
358 // wp_enqueue_media too late (usually, they call it in the footer). Until someone
359 // figures out what the issue is, let's load it here.
360 wp_enqueue_media();
361
362 wp_set_script_translations( 'mwai', 'ai-engine' );
363
364 // Prepare localization data
365 $localize_data = [
366 'api_url' => get_rest_url( null, 'mwai/v1' ),
367 'rest_url' => get_rest_url(),
368 'plugin_url' => MWAI_URL,
369 'user_data' => $this->core->get_user_data(),
370 'prefix' => MWAI_PREFIX,
371 'domain' => MWAI_DOMAIN,
372 'is_pro' => class_exists( 'MeowPro_MWAI_Core' ),
373 'is_registered' => !!$this->is_registered(),
374 'rest_nonce' => wp_create_nonce( 'wp_rest' ),
375 'session' => $this->core->get_session_id(),
376 'options' => $this->core->get_all_options(),
377 'chatbots' => $this->core->get_chatbots(),
378 'themes' => $this->core->get_themes(),
379 'stream' => $this->core->get_option( 'ai_streaming' ),
380 'cache_buster' => $cache_buster, // Pass cache buster for lazy-loaded chunks
381 ];
382
383 wp_localize_script( 'mwai', 'mwai', $localize_data );
384 }
385
386 public function is_registered() {
387 return apply_filters( MWAI_PREFIX . '_meowapps_is_registered', false, MWAI_PREFIX );
388 }
389
390 public function app_menu() {
391 add_submenu_page(
392 'meowapps-main-menu',
393 'AI Engine',
394 'AI Engine',
395 'manage_options',
396 'mwai_settings',
397 [ $this, 'admin_settings' ]
398 );
399 }
400
401 public function admin_settings() {
402 echo '<div id="mwai-admin-settings"></div>';
403 }
404 }
405