PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.0.3
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.0.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 11 months ago helpers.php 10 months ago issues.php 11 months ago news.php 11 months ago ratings.php 11 months ago releases.txt 2 years ago rest.php 11 months ago
helpers.php
305 lines
1 <?php
2
3 if ( !class_exists( 'MeowCommon_Helpers' ) ) {
4
5 class MeowCommon_Helpers {
6 //public static $version = MeowCommon_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 MeowCommon_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 MeowCommon_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 MeowCommon_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 $home_path = wp_parse_url( home_url( '/' ), PHP_URL_PATH ); // e.g. '/' or '/blog/'
122 $home_path = trailingslashit( $home_path ? $home_path : '/' );
123
124 $prefix = trim( rest_get_url_prefix(), '/' ); // e.g. 'wp-json' or custom
125
126 // /wp-json/ or /blog/wp-json/
127 $base = $home_path . trailingslashit( $prefix );
128
129 // /index.php/wp-json/ or /blog/index.php/wp-json/ (index permalinks)
130 $base_index = $home_path . 'index.php/' . trailingslashit( $prefix );
131
132 $path = trailingslashit( $req_path );
133 if ( strpos( $path, $base ) === 0 || strpos( $path, $base_index ) === 0 ) {
134 MeowCommon_Rest::init_once();
135 return true;
136 }
137 }
138
139 return false;
140 }
141
142 // Originally created by matzeeable, modified by jordymeow
143 // public static function is_rest() {
144
145 // // WP_REST_Request init.
146 // $is_rest_request = defined( 'REST_REQUEST' ) && REST_REQUEST;
147 // if ( $is_rest_request ) {
148 // MeowCommon_Rest::init_once();
149 // return true;
150 // }
151
152 // // Plain permalinks.
153 // $prefix = rest_get_url_prefix();
154 // $request_contains_rest = isset( $_GET['rest_route'] ) && strpos( trim( $_GET['rest_route'], '\\/' ), $prefix, 0 ) === 0;
155 // if ( $request_contains_rest ) {
156 // MeowCommon_Rest::init_once();
157 // return true;
158 // }
159
160 // // It can happen that WP_Rewrite is not yet initialized, so better to do it.
161 // global $wp_rewrite;
162 // if ( $wp_rewrite === null ) {
163 // $wp_rewrite = new WP_Rewrite();
164 // }
165 // $rest_url = wp_parse_url( trailingslashit( get_rest_url() ) );
166 // $current_url = wp_parse_url( add_query_arg( [] ) );
167 // if ( !$rest_url || !$current_url ) {
168 // return false;
169 // }
170
171 // // URL Path begins with wp-json.
172 // if ( !empty( $current_url['path'] ) && !empty( $rest_url['path'] ) ) {
173 // $request_contains_rest = strpos( $current_url['path'], $rest_url['path'], 0 ) === 0;
174 // if ( $request_contains_rest ) {
175 // MeowCommon_Rest::init_once();
176 // return true;
177 // }
178 // }
179
180 // return false;
181 // }
182
183 public static function test_error( $error = 'timeout', $diceSides = 1 ) {
184 if ( mt_rand( 1, $diceSides ) === 1 ) {
185 if ( $error === 'timeout' ) {
186 header( 'HTTP/1.0 408 Request Timeout' );
187 die();
188 }
189 else {
190 trigger_error( 'Error', E_USER_ERROR );
191 }
192 }
193 }
194
195 public static function php_error_logs() {
196 $errorpath = ini_get( 'error_log' );
197 $output_lines = [];
198 if ( !empty( $errorpath ) && file_exists( $errorpath ) ) {
199 try {
200 $file = new SplFileObject( $errorpath, 'r' );
201 $file->seek( PHP_INT_MAX );
202 $last_line = $file->key();
203 $iterator = new LimitIterator( $file, $last_line > 3500 ? $last_line - 3500 : 0, $last_line );
204 $lines = iterator_to_array( $iterator );
205 $previous_line = null;
206 foreach ( $lines as $line ) {
207
208 // Parse the date
209 $date = '';
210 try {
211 $dateArr = [];
212 preg_match( '~^\[(.*?)\]~', $line, $dateArr );
213 if ( isset( $dateArr[0] ) ) {
214 $line = str_replace( $dateArr[0], '', $line );
215 $line = trim( $line );
216 $date = new DateTime( $dateArr[1] );
217 $date = get_date_from_gmt( $date->format( 'Y-m-d H:i:s' ), 'Y-m-d H:i:s' );
218 }
219 else {
220 continue;
221 }
222 }
223 catch ( Exception $e ) {
224 continue;
225 }
226
227 // Parse the error
228 $type = '';
229 if ( preg_match( '/PHP Fatal error/', $line ) ) {
230 $line = trim( str_replace( 'PHP Fatal error:', '', $line ) );
231 $type = 'fatal';
232 }
233 else if ( preg_match( '/PHP Warning/', $line ) ) {
234 $line = trim( str_replace( 'PHP Warning:', '', $line ) );
235 $type = 'warning';
236 }
237 else if ( preg_match( '/PHP Notice/', $line ) ) {
238 $line = trim( str_replace( 'PHP Notice:', '', $line ) );
239 $type = 'notice';
240 }
241 else if ( preg_match( '/PHP Parse error/', $line ) ) {
242 $line = trim( str_replace( 'PHP Parse error:', '', $line ) );
243 $type = 'parse';
244 }
245 else if ( preg_match( '/PHP Exception/', $line ) ) {
246 $line = trim( str_replace( 'PHP Exception:', '', $line ) );
247 $type = 'exception';
248 }
249 else {
250 continue;
251 }
252
253 // Skip the error if is the same as before.
254 if ( $line !== $previous_line ) {
255 array_push( $output_lines, [ 'date' => $date, 'type' => $type, 'content' => $line ] );
256 $previous_line = $line;
257 }
258 }
259 }
260 catch ( OutOfBoundsException $e ) {
261 error_log( $e->getMessage() );
262 return [];
263 }
264 }
265 return $output_lines;
266
267 // else {
268 // $output_lines = array_reverse( $output_lines );
269 // $html = '';
270 // $previous = '';
271 // foreach ( $output_lines as $line ) {
272 // // Let's avoid similar errors, since it's not useful. We should also make this better
273 // // and not only theck this depending on tie.
274 // if ( preg_replace( '/\[.*\] PHP/', '', $previous ) !== preg_replace( '/\[.*\] PHP/', '', $line ) ) {
275 // $html .= $line;
276 // $previous = $line;
277 // }
278 // }
279 // return $html;
280 // }
281 }
282
283 public static function timer_start( $timerName = 'default' ) {
284 MeowCommon_Helpers::$startQueries[ $timerName ] = get_num_queries();
285 MeowCommon_Helpers::$startTimes[ $timerName ] = microtime( true );
286 }
287
288 public static function timer_elapsed( $timerName = 'default' ) {
289 return microtime( true ) - MeowCommon_Helpers::$startTimes[ $timerName ];
290 }
291
292 public static function timer_log_elapsed( $timerName = 'default' ) {
293 $elapsed = MeowCommon_Helpers::timer_elapsed( $timerName );
294 $queries = get_num_queries() - MeowCommon_Helpers::$startQueries[ $timerName ];
295 error_log( $timerName . ': ' . $elapsed . 'ms (' . $queries . ' queries)' );
296 }
297 }
298
299 // Asked by WP Security Team to remove this.
300
301 // if ( MeowCommon_Helpers::is_rest() ) {
302 // ini_set( 'display_errors', 0 );
303 // }
304 }
305