PluginProbe
Code Engine – PHP Snippets, AI Functions & Automation for WordPress / 0.4.3
Code Engine – PHP Snippets, AI Functions & Automation for WordPress v0.4.3
0.5.7 0.5.6 0.5.5 0.5.4 0.5.3 0.5.2 0.5.1 0.5.0 0.4.9 0.4.8 0.4.7 0.4.6 trunk 0.0.1 0.0.2 0.2.8 0.2.9 0.3.0 0.3.1 0.3.2 0.3.3 0.3.4 0.3.5 0.3.6 0.3.7 All 33 releases
← All changes | classes/core.php +47 -39 0.3.70.4.3 View file →
@@ -20,9 +20,9 @@
20 20 public function __construct() {
21 21 global $mwcode;
22 22
23 23 $this->site_url = get_site_url();
24 - $this->is_rest = MeowCommon_Helpers::is_rest();
24 + $this->is_rest = MeowKit_MWCODE_Helpers::is_rest();
25 25 $this->is_cli = defined( 'WP_CLI' ) && WP_CLI;
26 26
27 27 // Snippets
28 28 $snippet = new Meow_MWCODE_Modules_Snippet( $this );
@@ -39,10 +39,10 @@
39 39 }
40 40
41 41 function init() {
42 42 // Initialize the licenser for Pro version
43 - if ( class_exists( 'MeowCommonPro_Licenser' ) ) {
44 - $this->licenser = new MeowCommonPro_Licenser( MWCODE_PREFIX, MWCODE_ENTRY, MWCODE_DOMAIN, MWCODE_ITEM_ID, MWCODE_VERSION );
43 + if ( class_exists( 'MeowKitPro_MWCODE_Licenser' ) ) {
44 + $this->licenser = new MeowKitPro_MWCODE_Licenser( MWCODE_PREFIX, MWCODE_ENTRY, MWCODE_DOMAIN, MWCODE_ITEM_ID, MWCODE_VERSION );
45 45 }
46 46
47 47 // Part of the core, settings and stuff
48 48 $this->admin = new Meow_MWCODE_Admin( $this );
@@ -110,8 +110,11 @@
110 110 "api_token" => md5( time() . rand() ),
111 111
112 112 //MCP
113 113 "mcp_support" => false,
114 +
115 + //MAINTENANCE
116 + "clean_uninstall" => false,
114 117 ];
115 118 }
116 119
117 120 function get_all_options( ) {
@@ -125,19 +128,15 @@
125 128 return $options;
126 129 }
127 130
128 131 function update_options( $options ) {
129 - $current_options = get_option($this->option_name);
130 132
131 - if ($current_options === $options) {
132 - // $this->log('💾 The options are already the expected value.');
133 - } else {
134 - if ( !update_option( $this->option_name, $options, false ) ) {
135 - $this->log( '💾 There was an issue updating the options.' );
136 - }
133 + $options = $this->sanitize_options( $options );
134 +
135 + if ( !update_option( $this->option_name, $options, false ) ) {
136 + $this->log( '💾 There was an issue updating the options.' );
137 137 }
138 -
139 - $options = $this->sanitize_options( $options );
138 +
140 139 return $options;
141 140 }
142 141
143 142 function update_option( $option, $value ) {
@@ -168,9 +167,9 @@
168 167 $options_modified = true;
169 168 }
170 169
171 170 // Update AI Engine status
172 - $options_modified = $this->updateAIEngineStatus( $options ) || $options_modified;
171 + $options = $this->updateAIEngineStatus( $options );
173 172
174 173 // Disable AI related features if AI Engine is not available
175 174 if ( ! $options['ai_engine_status'] ) {
176 175 if ( $options['ai_suggestions'] !== false ) {
@@ -180,12 +179,8 @@
180 179 // Note: We don't disable MCP support here anymore
181 180 // It will be checked at runtime in the MCP class
182 181 }
183 182
184 - if ( $options_modified ) {
185 - update_option( $this->option_name, $options, false );
186 - }
187 -
188 183 return $options;
189 184 }
190 185
191 186 private function updateAIEngineStatus( &$options ) {
@@ -193,28 +188,25 @@
193 188
194 189 if ( is_null( $mwai ) || ! isset( $mwai ) ) {
195 190 $options['ai_engine_status'] = false;
196 191 $options['ai_engine_message'] = 'AI Engine is not available.';
197 - return true;
192 +
193 + return $options;
198 194 }
199 195
200 196 try {
201 197 $status = $mwai->checkStatus();
202 198
203 - if ( $options['ai_engine_status'] != true || $options['ai_engine_message'] != $status ) {
204 - $options['ai_engine_status'] = true;
205 - $options['ai_engine_message'] = $status;
206 - return true;
207 - }
199 + $options['ai_engine_status'] = true;
200 + $options['ai_engine_message'] = is_array( $status ) ? "Environments: " . implode( ', ', $status ) : $status;
201 +
208 202 } catch ( Exception $e ) {
209 - if ( $options['ai_engine_status'] != false || $options['ai_engine_message'] != $e->getMessage() ) {
203 +
210 204 $options['ai_engine_status'] = false;
211 205 $options['ai_engine_message'] = $e->getMessage();
212 - return true;
213 - }
214 206 }
215 207
216 - return false;
208 + return $options;
217 209 }
218 210
219 211 #endregion
220 212
@@ -285,16 +277,16 @@
285 277 $value = array_map( 'trim', $value );
286 278 }
287 279
288 280 if ( $type === 'array' ) {
289 - $value = json_encode( $value );
290 - $value = str_replace( '\\', '', $value );
281 + // Convert to PHP array format instead of JSON
282 + $value = var_export( $value, true );
291 283 }
292 284
293 285 return [ $name, $value ];
294 286 }
295 287
296 - function run_non_fn_snippet( $id, $code = null, $test = false ) {
288 + function run_non_fn_snippet( $id, $code = null, $test = false, $prefix = '' ) {
297 289 // Retrieve the snippet code from the provided code or via the snippet ID.
298 290 if ( $code ) {
299 291 $snippet = [ 'code' => $code ];
300 292 } else {
@@ -301,13 +293,17 @@
301 293 $snippet = $this->get_snippet( $id );
302 294 }
303 295
304 296 // Remove any PHP opening tag.
305 - $snippet['code'] = preg_replace( '/<\?php/', '', $snippet['code'], 1 );
297 + $snippet['code'] = $this->snippet->sanitize_code( $snippet['code'] );
306 298
307 299 if ( $test ) {
308 300 $snippet['code'] = preg_replace( '/echo\s+(.+?);/s', 'echo $1 . "\n";', $snippet['code'] );
309 301 }
302 +
303 + if( $prefix ) {
304 + $snippet['code'] = $prefix . "\n" . $snippet['code'];
305 + }
310 306
311 307 $error = null;
312 308 $output = null;
313 309
@@ -441,13 +437,14 @@
441 437 if ( $index < count( $params['args'] ) - 1 ) {
442 438 $params['code'] .= ', ';
443 439 }
444 440 }
441 +
445 442 $params['code'] .= ");\necho print_r(\$mwcode_result, true);";
446 443
447 444 $error = null;
448 445 $output = null;
449 -
446 +
450 447 try {
451 448 ob_start();
452 449 eval( $params['code'] );
453 450 $output = ob_get_clean();
@@ -597,9 +594,9 @@
597 594 $blocked = false;
598 595 //$blocked = true;
599 596 }
600 597 // Block REST requests that aren't whitelisted
601 - elseif ( MeowCommon_Helpers::is_rest() && !Meow_MWCODE_Core::is_white_listed_rest() ) {
598 + elseif ( MeowKit_MWCODE_Helpers::is_rest() && !Meow_MWCODE_Core::is_white_listed_rest() ) {
602 599 $blocked = true;
603 600 }
604 601
605 602 if ( empty( $this->snippet ) ) {
@@ -630,9 +627,9 @@
630 627 return;
631 628 }
632 629
633 630 $snippets = array_map( function ( $snippet ) use ( $blocked ) {
634 - $snippet['code'] = preg_replace( '/<\?php/', '', $snippet['code'], 1 );
631 + $snippet['code'] = $this->snippet->sanitize_code( $snippet['code'] );
635 632 $snippet['blocked'] = $blocked;
636 633
637 634 // If the snippet must be executed only in the frontend, we bypass the block
638 635 if ( !is_admin() && $snippet['scope'] === 'frontend' ) {
@@ -648,16 +645,26 @@
648 645
649 646 #endregion
650 647
651 648 #region Shortcodes
649 + function separate_mwcode_atts( $atts ) {
652 650
651 + if( array_key_exists( 'id', $atts ) ) unset( $atts['id'] );
652 + if( array_key_exists( 'target', $atts ) ) unset( $atts['target'] );
653 + if( array_key_exists( 'code', $atts ) ) unset( $atts['code'] );
654 +
655 + return $atts;
656 + }
657 +
653 658 function content_shortcode( $atts ) {
654 659
660 + $user_atts = $this->separate_mwcode_atts( $atts );
661 +
655 662 $atts = shortcode_atts( array(
656 - 'id' => null,
657 - 'target' => null,
658 - 'code' => null,
659 - ), $atts );
663 + 'id' => null,
664 + 'target' => null, // js or php
665 + 'code' => null, // For Guttenberg block usage
666 + ), $atts, 'code-engine' );
660 667
661 668 $id = $atts['id'];
662 669 $target = $atts['target'];
663 670 $code = $atts['code'];
@@ -740,9 +747,10 @@
740 747 $output = '<script>' . $snippet['code'] . '</script>';
741 748 }
742 749
743 750 if ( $is_content_php ) {
744 - $output = $this->run_non_fn_snippet( $id );
751 + $prefix = "\$mwcode_atts = unserialize( '" . serialize( $user_atts ) . "' );";
752 + $output = $this->run_non_fn_snippet( $id, null, false, $prefix );
745 753 }
746 754
747 755 return $output;
748 756 }