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