PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.5.3
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.5.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 / common / helpers.php
ai-engine / common Last commit date
admin.php 1 month ago helpers.php 6 months ago issues.php 7 months ago news.php 7 months ago ratings.php 7 months ago releases.txt 2 years ago rest.php 1 month ago
helpers.php
301 lines
1 <?php
2
3 if ( !class_exists( 'MeowKit_MWAI_Helpers' ) ) {
4
5 class MeowKit_MWAI_Helpers {
6 //public static $version = MeowKit_MWAI_Admin::version;
7 private static $startTimes = [];
8 private static $startQueries = [];
9
10 public static function is_divi_builder() {
11 return isset( $_GET['et_fb'] ) && $_GET['et_fb'] === '1';
12 }
13
14 public static function is_beaver_builder() {
15 return isset( $_GET['fl_builder'] );
16 }
17
18 public static function is_cornerstone_builder() {
19 return isset( $_GET['cs-render'] ) && $_GET['cs-render'] === '1';
20 }
21
22 public static function is_pagebuilder_request() {
23 return self::is_divi_builder() || self::is_cornerstone_builder() || self::is_beaver_builder();
24 }
25
26 public static function is_asynchronous_request() {
27 return self::is_ajax_request() || self::is_woocommerce_ajax_request() || self::is_rest();
28 }
29
30 public static function is_ajax_request() {
31 return wp_doing_ajax();
32 }
33
34 public static function is_woocommerce_ajax_request() {
35 return !empty( $_GET['wc-ajax'] );
36 }
37
38 // This function makes sure that only the allowed HTML element names,
39 // attribute names, attribute values, and HTML entities will occur in the given text string.
40 public static function wp_kses( $html ) {
41 return wp_kses( $html, [
42 'style' => [],
43 'script' => [],
44 'div' => [
45 'class' => [],
46 'data-rating-date' => [],
47 'style' => [],
48 ],
49 'img' => [
50 'src' => [],
51 'decoding' => [],
52 'class' => [],
53 'style' => [],
54 ],
55 'p' => [
56 'style' => [],
57 ],
58 'h2' => [
59 'class' => [],
60 ],
61 'br' => [],
62 'label' => [],
63 'b' => [],
64 'small' => [],
65 'a' => [
66 'href' => [],
67 'target' => [],
68 'class' => [],
69 'style' => [],
70 ],
71 'form' => [
72 'method' => [],
73 'action' => [],
74 'class' => [],
75 'style' => [],
76 ],
77 'input' => [
78 'type' => [],
79 'checked' => [],
80 'name' => [],
81 'value' => [],
82 'id' => [],
83 'class' => [],
84 ],
85 ] );
86 }
87
88 // Diff between two strings
89 public static function diff( $first, $second ) {
90 $first = explode( ' ', $first );
91 $second = explode( ' ', $second );
92 $diff = array_diff( $first, $second );
93 return implode( ' ', $diff );
94 }
95
96 // From August 2025: The New 'is_rest' function, more reliable, much cleaner.
97 public static function is_rest() {
98
99 // WP 6.5+: only reliable after parse_request; otherwise skip this branch.
100 if ( function_exists( 'wp_is_serving_rest_request' ) && did_action( 'parse_request' ) && wp_is_serving_rest_request() ) {
101 MeowKit_MWAI_Rest::init_once();
102 return true;
103 }
104
105 // Classic flag set during REST bootstrap (safe at any time).
106 if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) {
107 MeowKit_MWAI_Rest::init_once();
108 return true;
109 }
110
111 // Plain permalinks: ?rest_route=/... (route does NOT include the prefix).
112 if ( isset( $_GET['rest_route'] ) ) {
113 MeowKit_MWAI_Rest::init_once();
114 return true;
115 }
116
117 // Pretty permalinks: compare request PATH to the site's REST base path, without using rest_url().
118 // This works early in the bootstrap (no dependency on $wp_rewrite).
119 $req_path = isset( $_SERVER['REQUEST_URI'] ) ? wp_parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ) : null;
120 if ( $req_path ) {
121 $prefix = rest_get_url_prefix(); // e.g. 'wp-json' or custom
122
123 // Check if the path contains /wp-json/ or /index.php/wp-json/
124 // This handles multilingual plugins (WPML, Polylang) that add language prefixes like /fr/wp-json/
125 $path = trailingslashit( $req_path );
126 $rest_pattern = '/' . trim( $prefix, '/' ) . '/';
127 $rest_pattern_index = '/index.php/' . trim( $prefix, '/' ) . '/';
128
129 if ( strpos( $path, $rest_pattern ) !== false || strpos( $path, $rest_pattern_index ) !== false ) {
130 MeowKit_MWAI_Rest::init_once();
131 return true;
132 }
133 }
134
135 return false;
136 }
137
138 // Originally created by matzeeable, modified by jordymeow
139 // public static function is_rest() {
140
141 // // WP_REST_Request init.
142 // $is_rest_request = defined( 'REST_REQUEST' ) && REST_REQUEST;
143 // if ( $is_rest_request ) {
144 // MeowKit_MWAI_Rest::init_once();
145 // return true;
146 // }
147
148 // // Plain permalinks.
149 // $prefix = rest_get_url_prefix();
150 // $request_contains_rest = isset( $_GET['rest_route'] ) && strpos( trim( $_GET['rest_route'], '\\/' ), $prefix, 0 ) === 0;
151 // if ( $request_contains_rest ) {
152 // MeowKit_MWAI_Rest::init_once();
153 // return true;
154 // }
155
156 // // It can happen that WP_Rewrite is not yet initialized, so better to do it.
157 // global $wp_rewrite;
158 // if ( $wp_rewrite === null ) {
159 // $wp_rewrite = new WP_Rewrite();
160 // }
161 // $rest_url = wp_parse_url( trailingslashit( get_rest_url() ) );
162 // $current_url = wp_parse_url( add_query_arg( [] ) );
163 // if ( !$rest_url || !$current_url ) {
164 // return false;
165 // }
166
167 // // URL Path begins with wp-json.
168 // if ( !empty( $current_url['path'] ) && !empty( $rest_url['path'] ) ) {
169 // $request_contains_rest = strpos( $current_url['path'], $rest_url['path'], 0 ) === 0;
170 // if ( $request_contains_rest ) {
171 // MeowKit_MWAI_Rest::init_once();
172 // return true;
173 // }
174 // }
175
176 // return false;
177 // }
178
179 public static function test_error( $error = 'timeout', $diceSides = 1 ) {
180 if ( mt_rand( 1, $diceSides ) === 1 ) {
181 if ( $error === 'timeout' ) {
182 header( 'HTTP/1.0 408 Request Timeout' );
183 die();
184 }
185 else {
186 trigger_error( 'Error', E_USER_ERROR );
187 }
188 }
189 }
190
191 public static function php_error_logs() {
192 $errorpath = ini_get( 'error_log' );
193 $output_lines = [];
194 if ( !empty( $errorpath ) && file_exists( $errorpath ) ) {
195 try {
196 $file = new SplFileObject( $errorpath, 'r' );
197 $file->seek( PHP_INT_MAX );
198 $last_line = $file->key();
199 $iterator = new LimitIterator( $file, $last_line > 3500 ? $last_line - 3500 : 0, $last_line );
200 $lines = iterator_to_array( $iterator );
201 $previous_line = null;
202 foreach ( $lines as $line ) {
203
204 // Parse the date
205 $date = '';
206 try {
207 $dateArr = [];
208 preg_match( '~^\[(.*?)\]~', $line, $dateArr );
209 if ( isset( $dateArr[0] ) ) {
210 $line = str_replace( $dateArr[0], '', $line );
211 $line = trim( $line );
212 $date = new DateTime( $dateArr[1] );
213 $date = get_date_from_gmt( $date->format( 'Y-m-d H:i:s' ), 'Y-m-d H:i:s' );
214 }
215 else {
216 continue;
217 }
218 }
219 catch ( Exception $e ) {
220 continue;
221 }
222
223 // Parse the error
224 $type = '';
225 if ( preg_match( '/PHP Fatal error/', $line ) ) {
226 $line = trim( str_replace( 'PHP Fatal error:', '', $line ) );
227 $type = 'fatal';
228 }
229 else if ( preg_match( '/PHP Warning/', $line ) ) {
230 $line = trim( str_replace( 'PHP Warning:', '', $line ) );
231 $type = 'warning';
232 }
233 else if ( preg_match( '/PHP Notice/', $line ) ) {
234 $line = trim( str_replace( 'PHP Notice:', '', $line ) );
235 $type = 'notice';
236 }
237 else if ( preg_match( '/PHP Parse error/', $line ) ) {
238 $line = trim( str_replace( 'PHP Parse error:', '', $line ) );
239 $type = 'parse';
240 }
241 else if ( preg_match( '/PHP Exception/', $line ) ) {
242 $line = trim( str_replace( 'PHP Exception:', '', $line ) );
243 $type = 'exception';
244 }
245 else {
246 continue;
247 }
248
249 // Skip the error if is the same as before.
250 if ( $line !== $previous_line ) {
251 array_push( $output_lines, [ 'date' => $date, 'type' => $type, 'content' => $line ] );
252 $previous_line = $line;
253 }
254 }
255 }
256 catch ( OutOfBoundsException $e ) {
257 error_log( $e->getMessage() );
258 return [];
259 }
260 }
261 return $output_lines;
262
263 // else {
264 // $output_lines = array_reverse( $output_lines );
265 // $html = '';
266 // $previous = '';
267 // foreach ( $output_lines as $line ) {
268 // // Let's avoid similar errors, since it's not useful. We should also make this better
269 // // and not only theck this depending on tie.
270 // if ( preg_replace( '/\[.*\] PHP/', '', $previous ) !== preg_replace( '/\[.*\] PHP/', '', $line ) ) {
271 // $html .= $line;
272 // $previous = $line;
273 // }
274 // }
275 // return $html;
276 // }
277 }
278
279 public static function timer_start( $timerName = 'default' ) {
280 MeowKit_MWAI_Helpers::$startQueries[ $timerName ] = get_num_queries();
281 MeowKit_MWAI_Helpers::$startTimes[ $timerName ] = microtime( true );
282 }
283
284 public static function timer_elapsed( $timerName = 'default' ) {
285 return microtime( true ) - MeowKit_MWAI_Helpers::$startTimes[ $timerName ];
286 }
287
288 public static function timer_log_elapsed( $timerName = 'default' ) {
289 $elapsed = MeowKit_MWAI_Helpers::timer_elapsed( $timerName );
290 $queries = get_num_queries() - MeowKit_MWAI_Helpers::$startQueries[ $timerName ];
291 error_log( $timerName . ': ' . $elapsed . 'ms (' . $queries . ' queries)' );
292 }
293 }
294
295 // Asked by WP Security Team to remove this.
296
297 // if ( MeowKit_MWAI_Helpers::is_rest() ) {
298 // ini_set( 'display_errors', 0 );
299 // }
300 }
301