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 | common/helpers.php +75 -33 0.3.30.4.3 View file →
@@ -1,10 +1,10 @@
1 1 <?php
2 2
3 -if ( !class_exists( 'MeowCommon_Helpers' ) ) {
3 +if ( !class_exists( 'MeowKit_MWCODE_Helpers' ) ) {
4 4
5 - class MeowCommon_Helpers {
6 - //public static $version = MeowCommon_Admin::version;
5 + class MeowKit_MWCODE_Helpers {
6 + //public static $version = MeowKit_MWCODE_Admin::version;
7 7 private static $startTimes = [];
8 8 private static $startQueries = [];
9 9
10 10 public static function is_divi_builder() {
@@ -92,42 +92,43 @@
92 92 $diff = array_diff( $first, $second );
93 93 return implode( ' ', $diff );
94 94 }
95 95
96 - // Originally created by matzeeable, modified by jordymeow
96 + // From August 2025: The New 'is_rest' function, more reliable, much cleaner.
97 97 public static function is_rest() {
98 98
99 - // WP_REST_Request init.
100 - $is_rest_request = defined( 'REST_REQUEST' ) && REST_REQUEST;
101 - if ( $is_rest_request ) {
102 - MeowCommon_Rest::init_once();
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();
103 102 return true;
104 103 }
105 104
106 - // Plain permalinks.
107 - $prefix = rest_get_url_prefix();
108 - $request_contains_rest = isset( $_GET['rest_route'] ) && strpos( trim( $_GET['rest_route'], '\\/' ), $prefix, 0 ) === 0;
109 - if ( $request_contains_rest ) {
110 - MeowCommon_Rest::init_once();
105 + // Classic flag set during REST bootstrap (safe at any time).
106 + if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) {
107 + MeowKit_MWCODE_Rest::init_once();
111 108 return true;
112 109 }
113 110
114 - // It can happen that WP_Rewrite is not yet initialized, so better to do it.
115 - global $wp_rewrite;
116 - if ( $wp_rewrite === null ) {
117 - $wp_rewrite = new WP_Rewrite();
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;
118 115 }
119 - $rest_url = wp_parse_url( trailingslashit( get_rest_url() ) );
120 - $current_url = wp_parse_url( add_query_arg( [] ) );
121 - if ( !$rest_url || !$current_url ) {
122 - return false;
123 - }
124 116
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();
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_MWCODE_Rest::init_once();
130 131 return true;
131 132 }
132 133 }
133 134
@@ -133,8 +134,49 @@
133 134
134 135 return false;
135 136 }
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_MWCODE_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_MWCODE_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_MWCODE_Rest::init_once();
172 + // return true;
173 + // }
174 + // }
175 +
176 + // return false;
177 + // }
178 +
137 179 public static function test_error( $error = 'timeout', $diceSides = 1 ) {
138 180 if ( mt_rand( 1, $diceSides ) === 1 ) {
139 181 if ( $error === 'timeout' ) {
140 182 header( 'HTTP/1.0 408 Request Timeout' );
@@ -234,19 +276,19 @@
234 276 // }
235 277 }
236 278
237 279 public static function timer_start( $timerName = 'default' ) {
238 - MeowCommon_Helpers::$startQueries[ $timerName ] = get_num_queries();
239 - MeowCommon_Helpers::$startTimes[ $timerName ] = microtime( true );
280 + MeowKit_MWCODE_Helpers::$startQueries[ $timerName ] = get_num_queries();
281 + MeowKit_MWCODE_Helpers::$startTimes[ $timerName ] = microtime( true );
240 282 }
241 283
242 284 public static function timer_elapsed( $timerName = 'default' ) {
243 - return microtime( true ) - MeowCommon_Helpers::$startTimes[ $timerName ];
285 + return microtime( true ) - MeowKit_MWCODE_Helpers::$startTimes[ $timerName ];
244 286 }
245 287
246 288 public static function timer_log_elapsed( $timerName = 'default' ) {
247 - $elapsed = MeowCommon_Helpers::timer_elapsed( $timerName );
248 - $queries = get_num_queries() - MeowCommon_Helpers::$startQueries[ $timerName ];
289 + $elapsed = MeowKit_MWCODE_Helpers::timer_elapsed( $timerName );
290 + $queries = get_num_queries() - MeowKit_MWCODE_Helpers::$startQueries[ $timerName ];
249 291 error_log( $timerName . ': ' . $elapsed . 'ms (' . $queries . ' queries)' );
250 292 }
251 293 }
252 294
@@ -251,8 +293,8 @@
251 293 }
252 294
253 295 // Asked by WP Security Team to remove this.
254 296
255 - // if ( MeowCommon_Helpers::is_rest() ) {
297 + // if ( MeowKit_MWCODE_Helpers::is_rest() ) {
256 298 // ini_set( 'display_errors', 0 );
257 299 // }
258 300 }