PluginProbe
Translate and boost SEO – Automatic AI translation – wpLingua / 2.16.8
Translate and boost SEO – Automatic AI translation – wpLingua v2.16.8
2.16.8 2.16.7 2.16.6 2.16.5 2.16.4 2.16.3 2.16.2 2.16.1 2.16.0 2.15.2 2.15.1 2.15.0 2.14.3 2.14.2 2.14.1 2.14.0 2.13.1 2.13.0 2.12.3 2.12.2 2.12.1 trunk 1.0.3 1.0.4 1.0.5 All 113 releases
← All changes | inc/api-key.php +417 -415 2.12.22.16.8 View file →
@@ -1,415 +1,417 @@
1 -<?php
2 -
3 -// If this file is called directly, abort.
4 -if ( ! defined( 'WPINC' ) ) {
5 - die;
6 -}
7 -
8 -
9 -/**
10 - * Validate a wpLingua API key
11 - *
12 - * @param string $api_key
13 - * @return bool
14 - */
15 -function wplng_is_valid_api_key_format( $api_key ) {
16 -
17 - $regex = '/^[a-zA-Z0-9]{42}$/s';
18 -
19 - if (
20 - empty( $api_key )
21 - || ! is_string( $api_key )
22 - || false === preg_match( $regex, $api_key )
23 - ) {
24 - return false;
25 - }
26 -
27 - return true;
28 -}
29 -
30 -
31 -/**
32 - * Get the wpLingua registered API key
33 - *
34 - * @return string
35 - */
36 -function wplng_get_api_key() {
37 -
38 - $api_key = trim( get_option( 'wplng_api_key' ) );
39 -
40 - if ( ! wplng_is_valid_api_key_format( $api_key ) ) {
41 - $api_key = '';
42 - }
43 -
44 - return $api_key;
45 -}
46 -
47 -
48 -/**
49 - * Get wpLingua API key data
50 - * - Website language (id or 'all')
51 - * - Target language(s) (array)
52 - * - Enabled features
53 - *
54 - * @return array
55 - */
56 -function wplng_get_api_data( $try_update_from_api = false ) {
57 -
58 - global $wplng_api_data;
59 -
60 - if ( $wplng_api_data !== null && $try_update_from_api === false ) {
61 - return $wplng_api_data;
62 - }
63 -
64 - if ( empty( wplng_get_api_key() ) ) {
65 - return array();
66 - }
67 -
68 - /**
69 - * Get data from cache or API
70 - */
71 -
72 - $data_checked = array();
73 - $data = array();
74 - $data_from_cache = get_option( 'wplng_api_key_data' );
75 -
76 - if ( ! empty( $data_from_cache ) ) {
77 - $data_from_cache = json_decode( $data_from_cache, true );
78 - if ( ! is_array( $data_from_cache ) ) {
79 - $data_from_cache = array();
80 - }
81 - }
82 -
83 - if ( empty( $data_from_cache ) ) {
84 -
85 - /**
86 - * No data in cache
87 - */
88 -
89 - // Try to get update from API
90 - $data = wplng_api_call_validate_api_key();
91 -
92 - // If no data in cache and no data from API, return empty array
93 - if ( empty( $data ) ) {
94 - return array();
95 - }
96 -
97 - $data['time'] = time();
98 -
99 - } else {
100 -
101 - /**
102 - * Data is in cache
103 - */
104 -
105 - $data = $data_from_cache;
106 -
107 - // Time of last update is not define, set is as current time
108 - if ( empty( $data['time'] )
109 - || ! is_int( $data['time'] )
110 - ) {
111 - $data['time'] = time();
112 - }
113 -
114 - // Time of last update older than 8 hours
115 - // Or $try_update_from_api is true
116 - // Try to get update from API
117 - if ( ( $data['time'] + ( 8 * HOUR_IN_SECONDS ) ) <= time()
118 - || $try_update_from_api === true
119 - ) {
120 -
121 - $data_from_api = wplng_api_call_validate_api_key();
122 -
123 - if ( ! empty( $data_from_api ) ) {
124 - $data = $data_from_api;
125 - $data['time'] = time();
126 - }
127 - }
128 - }
129 -
130 - /**
131 - * Check the API key data
132 - */
133 -
134 - if ( ! empty( $data['language_original'] )
135 - && (
136 - wplng_is_valid_language_id( $data['language_original'] )
137 - || 'all' === $data['language_original']
138 - )
139 - && ! empty( $data['languages_target'] )
140 - && wplng_is_valid_language_ids( $data['languages_target'] )
141 - && isset( $data['features'] )
142 - && is_array( $data['features'] )
143 - && ! empty( $data['status'] )
144 - && ! empty( $data['time'] )
145 - && is_int( $data['time'] )
146 - ) {
147 -
148 - /**
149 - * Sanitize languages target
150 - */
151 -
152 - $languages_target = array();
153 -
154 - foreach ( $data['languages_target'] as $id ) {
155 -
156 - if ( ! wplng_is_valid_language_id( $id ) ) {
157 - continue;
158 - }
159 -
160 - $languages_target[] = sanitize_key( $id );
161 - }
162 -
163 - /**
164 - * Sanitize features list
165 - */
166 -
167 - $features = array();
168 -
169 - foreach ( $data['features'] as $key => $allow ) {
170 -
171 - if ( ! is_string( $key ) || ! is_bool( $allow ) ) {
172 - continue;
173 - }
174 -
175 - $key = sanitize_key( $key );
176 - $allow = ( true === $allow );
177 -
178 - $features[ $key ] = $allow;
179 - }
180 -
181 - /**
182 - * Sanitize status
183 - */
184 -
185 - $status = 'FREE';
186 -
187 - if ( 'PREMIUM' === $data['status']
188 - || 'VIP' === $data['status']
189 - ) {
190 - $status = $data['status'];
191 - }
192 -
193 - /**
194 - * Make the checked response
195 - */
196 -
197 - $data_checked = array(
198 - 'language_original' => sanitize_key( $data['language_original'] ),
199 - 'languages_target' => $languages_target,
200 - 'features' => $features,
201 - 'status' => $status,
202 - 'time' => $data['time'],
203 - );
204 -
205 - /**
206 - * Add expiration
207 - */
208 -
209 - if ( ! empty( $data['expiration'] )
210 - && is_string( $data['expiration'] )
211 - ) {
212 - $data_checked['expiration'] = $data['expiration'];
213 - }
214 - }
215 -
216 - // Set data in DB cache (option)
217 - if ( ! empty( $data_checked )
218 - && $data_checked !== $data_from_cache
219 - ) {
220 - update_option(
221 - 'wplng_api_key_data',
222 - wp_json_encode( $data_checked ),
223 - true
224 - );
225 -
226 - wp_cache_flush();
227 - }
228 -
229 - // Set data for global variable
230 - $wplng_api_data = $data_checked;
231 -
232 - return $data_checked;
233 -}
234 -
235 -
236 -/**
237 - * Get website language from wpLingua API data
238 - *
239 - * @return string Language ID, 'all' or ''
240 - */
241 -function wplng_get_api_language_website() {
242 -
243 - $data = wplng_get_api_data();
244 -
245 - if (
246 - ! empty( $data['language_original'] )
247 - && (
248 - wplng_is_valid_language_id( $data['language_original'] )
249 - || 'all' === $data['language_original']
250 - )
251 - ) {
252 - return $data['language_original'];
253 - }
254 -
255 - return '';
256 -}
257 -
258 -
259 -/**
260 - * Get target languages from wpLingua API data
261 - *
262 - * @return mixed Language IDs array, 'all' or false
263 - */
264 -function wplng_get_api_languages_target() {
265 -
266 - $data = wplng_get_api_data();
267 -
268 - if ( empty( $data['languages_target'] ) ) {
269 - return false;
270 - } elseif ( 'all' === $data['languages_target'] ) {
271 - return 'all';
272 - } elseif ( is_array( $data['languages_target'] ) ) {
273 -
274 - $all_languages = wplng_get_languages_all();
275 - $languages_id_ordered = array();
276 -
277 - foreach ( $all_languages as $language ) {
278 - foreach ( $data['languages_target'] as $language_id ) {
279 -
280 - if (
281 - ! wplng_is_valid_language_id( $language_id )
282 - || empty( $language['id'] )
283 - || $language['id'] !== $language_id
284 - ) {
285 - continue;
286 - }
287 -
288 - $languages_id_ordered[] = $language_id;
289 - break;
290 -
291 - }
292 - }
293 -
294 - return $languages_id_ordered;
295 - }
296 -
297 - return false;
298 -}
299 -
300 -
301 -/**
302 - * Get enabled features from wpLingua API data
303 - * ('search', 'commercial', 'detection')
304 - *
305 - * @return array
306 - */
307 -function wplng_get_api_feature() {
308 -
309 - $data = wplng_get_api_data();
310 - $all = array( 'search', 'commercial', 'detection' );
311 - $features = array();
312 -
313 - if ( ! empty( $data['features'] ) && is_array( $data['features'] ) ) {
314 - foreach ( $data['features'] as $feature_name => $feature_allow ) {
315 - if ( $feature_allow && in_array( $feature_name, $all ) ) {
316 - $features[] = $feature_name;
317 - }
318 - }
319 - }
320 -
321 - return $features;
322 -}
323 -
324 -
325 -/**
326 - * Return true if the feature is enable in wpLingua API key data
327 - *
328 - * @param string $feature_name
329 - * @return bool
330 - */
331 -function wplng_api_feature_is_allow( $feature_name ) {
332 - return in_array( $feature_name, wplng_get_api_feature() );
333 -}
334 -
335 -
336 -/**
337 - * Check if the wpLingua API is overloaded
338 - *
339 - * This function determines whether the wpLingua API is currently overloaded
340 - * based on a stored timestamp. If the API is overloaded, it returns true.
341 - * Otherwise, it clears the overloaded status and returns false.
342 - *
343 - * @global bool|null $wplng_api_is_overloaded Cached overloaded status
344 - * @return bool True if the API is overloaded, false otherwise
345 - */
346 -function wplng_get_api_overloaded() {
347 -
348 - global $wplng_api_is_overloaded;
349 -
350 - // If overload is true, return directly
351 - // Else, recheck the value
352 - if ( ! empty( $wplng_api_is_overloaded ) ) {
353 - return $wplng_api_is_overloaded;
354 - }
355 -
356 - $overloaded = get_option( 'wplng_api_overloaded' );
357 -
358 - if ( ! empty( $overloaded )
359 - && ( $overloaded + ( 2 * MINUTE_IN_SECONDS ) ) > time()
360 - ) {
361 - $wplng_api_is_overloaded = true;
362 - } else {
363 - $wplng_api_is_overloaded = false;
364 - delete_option( 'wplng_api_overloaded' );
365 - }
366 -
367 - return $wplng_api_is_overloaded;
368 -}
369 -
370 -
371 -/**
372 - * Mark the wpLingua API as overloaded
373 - *
374 - * This function sets the overloaded status for the wpLingua API by updating
375 - * a timestamp in the database. If the API is already marked as overloaded,
376 - * the function does nothing.
377 - *
378 - * @global bool|null $wplng_api_is_overloaded Cached overloaded status
379 - * @return void
380 - */
381 -function wplng_set_api_overloaded() {
382 -
383 - if ( wplng_get_api_overloaded() ) {
384 - return;
385 - }
386 -
387 - global $wplng_api_is_overloaded;
388 - $wplng_api_is_overloaded = true;
389 -
390 - update_option(
391 - 'wplng_api_overloaded',
392 - time(),
393 - true
394 - );
395 -
396 - wp_cache_flush();
397 -}
398 -
399 -
400 -/**
401 - * Clear wpLingua API key data if wpLingua key is changed
402 - *
403 - * @param string $old_value JSON
404 - * @param string $new_value JSON
405 - * @return void
406 - */
407 -function wplng_on_update_option_wplng_api_key( $old_value, $new_value ) {
408 -
409 - delete_option( 'wplng_api_key_data' );
410 - delete_option( 'wplng_website_language' );
411 - delete_option( 'wplng_website_flag' );
412 -
413 - wplng_clear_translations_cache();
414 - wplng_clear_slugs_cache();
415 -}
1 +<?php
2 +
3 +// If this file is called directly, abort.
4 +if ( ! defined( 'WPINC' ) ) {
5 + die;
6 +}
7 +
8 +
9 +/**
10 + * Validate a wpLingua API key
11 + *
12 + * @param string $api_key
13 + * @return bool
14 + */
15 +function wplng_is_valid_api_key_format( $api_key ) {
16 +
17 + $regex = '/^[a-zA-Z0-9]{42}$/s';
18 +
19 + if (
20 + empty( $api_key )
21 + || ! is_string( $api_key )
22 + || false === preg_match( $regex, $api_key )
23 + ) {
24 + return false;
25 + }
26 +
27 + return true;
28 +}
29 +
30 +
31 +/**
32 + * Get the wpLingua registered API key
33 + *
34 + * @return string
35 + */
36 +function wplng_get_api_key() {
37 +
38 + $api_key = trim( get_option( 'wplng_api_key' ) );
39 +
40 + if ( ! wplng_is_valid_api_key_format( $api_key ) ) {
41 + $api_key = '';
42 + }
43 +
44 + return $api_key;
45 +}
46 +
47 +
48 +/**
49 + * Get wpLingua API key data
50 + * - Website language (id or 'all')
51 + * - Target language(s) (array)
52 + * - Enabled features
53 + *
54 + * @return array
55 + */
56 +function wplng_get_api_data( $try_update_from_api = false ) {
57 +
58 + global $wplng_api_data;
59 +
60 + if ( $wplng_api_data !== null && $try_update_from_api === false ) {
61 + return $wplng_api_data;
62 + }
63 +
64 + if ( empty( wplng_get_api_key() ) ) {
65 + return array();
66 + }
67 +
68 + /**
69 + * Get data from cache or API
70 + */
71 +
72 + $data_checked = array();
73 + $data = array();
74 + $data_from_cache = get_option( 'wplng_api_key_data' );
75 +
76 + if ( ! empty( $data_from_cache ) ) {
77 + $data_from_cache = json_decode( $data_from_cache, true );
78 + if ( ! is_array( $data_from_cache ) ) {
79 + $data_from_cache = array();
80 + }
81 + }
82 +
83 + if ( empty( $data_from_cache ) ) {
84 +
85 + /**
86 + * No data in cache
87 + */
88 +
89 + // Try to get update from API
90 + $data = wplng_api_call_validate_api_key();
91 +
92 + // If no data in cache and no data from API, return empty array
93 + if ( empty( $data ) ) {
94 + return array();
95 + }
96 +
97 + $data['time'] = time();
98 +
99 + } else {
100 +
101 + /**
102 + * Data is in cache
103 + */
104 +
105 + $data = $data_from_cache;
106 +
107 + // Time of last update is not define, set is as current time
108 + if ( empty( $data['time'] )
109 + || ! is_int( $data['time'] )
110 + ) {
111 + $data['time'] = time();
112 + }
113 +
114 + // Time of last update older than 8 hours
115 + // Or $try_update_from_api is true
116 + // Try to get update from API
117 + if ( ( $data['time'] + ( 8 * HOUR_IN_SECONDS ) ) <= time()
118 + || $try_update_from_api === true
119 + ) {
120 +
121 + $data_from_api = wplng_api_call_validate_api_key();
122 +
123 + if ( ! empty( $data_from_api ) ) {
124 + $data = $data_from_api;
125 + $data['time'] = time();
126 + }
127 + }
128 + }
129 +
130 + /**
131 + * Check the API key data
132 + */
133 +
134 + if ( ! empty( $data['language_original'] )
135 + && (
136 + wplng_is_valid_language_id( $data['language_original'] )
137 + || 'all' === $data['language_original']
138 + )
139 + && ! empty( $data['languages_target'] )
140 + && wplng_is_valid_language_ids( $data['languages_target'] )
141 + && isset( $data['features'] )
142 + && is_array( $data['features'] )
143 + && ! empty( $data['status'] )
144 + && ! empty( $data['time'] )
145 + && is_int( $data['time'] )
146 + ) {
147 +
148 + /**
149 + * Sanitize languages target
150 + */
151 +
152 + $languages_target = array();
153 +
154 + foreach ( $data['languages_target'] as $id ) {
155 +
156 + if ( ! wplng_is_valid_language_id( $id ) ) {
157 + continue;
158 + }
159 +
160 + $languages_target[] = sanitize_key( $id );
161 + }
162 +
163 + /**
164 + * Sanitize features list
165 + */
166 +
167 + $features = array();
168 +
169 + foreach ( $data['features'] as $key => $allow ) {
170 +
171 + if ( ! is_string( $key ) || ! is_bool( $allow ) ) {
172 + continue;
173 + }
174 +
175 + $key = sanitize_key( $key );
176 + $allow = ( true === $allow );
177 +
178 + $features[ $key ] = $allow;
179 + }
180 +
181 + /**
182 + * Sanitize status
183 + */
184 +
185 + $status = 'FREE';
186 +
187 + if ( 'PREMIUM' === $data['status']
188 + || 'VIP' === $data['status']
189 + ) {
190 + $status = $data['status'];
191 + }
192 +
193 + /**
194 + * Make the checked response
195 + */
196 +
197 + $data_checked = array(
198 + 'language_original' => sanitize_key( $data['language_original'] ),
199 + 'languages_target' => $languages_target,
200 + 'features' => $features,
201 + 'status' => $status,
202 + 'time' => $data['time'],
203 + );
204 +
205 + /**
206 + * Add expiration
207 + */
208 +
209 + if ( ! empty( $data['expiration'] )
210 + && is_string( $data['expiration'] )
211 + ) {
212 + $data_checked['expiration'] = sanitize_text_field(
213 + $data['expiration']
214 + );
215 + }
216 + }
217 +
218 + // Set data in DB cache (option)
219 + if ( ! empty( $data_checked )
220 + && $data_checked !== $data_from_cache
221 + ) {
222 + update_option(
223 + 'wplng_api_key_data',
224 + wp_json_encode( $data_checked ),
225 + true
226 + );
227 +
228 + wp_cache_flush();
229 + }
230 +
231 + // Set data for global variable
232 + $wplng_api_data = $data_checked;
233 +
234 + return $data_checked;
235 +}
236 +
237 +
238 +/**
239 + * Get website language from wpLingua API data
240 + *
241 + * @return string Language ID, 'all' or ''
242 + */
243 +function wplng_get_api_language_website() {
244 +
245 + $data = wplng_get_api_data();
246 +
247 + if (
248 + ! empty( $data['language_original'] )
249 + && (
250 + wplng_is_valid_language_id( $data['language_original'] )
251 + || 'all' === $data['language_original']
252 + )
253 + ) {
254 + return $data['language_original'];
255 + }
256 +
257 + return '';
258 +}
259 +
260 +
261 +/**
262 + * Get target languages from wpLingua API data
263 + *
264 + * @return mixed Language IDs array, 'all' or false
265 + */
266 +function wplng_get_api_languages_target() {
267 +
268 + $data = wplng_get_api_data();
269 +
270 + if ( empty( $data['languages_target'] ) ) {
271 + return false;
272 + } elseif ( 'all' === $data['languages_target'] ) {
273 + return 'all';
274 + } elseif ( is_array( $data['languages_target'] ) ) {
275 +
276 + $all_languages = wplng_get_languages_all();
277 + $languages_id_ordered = array();
278 +
279 + foreach ( $all_languages as $language ) {
280 + foreach ( $data['languages_target'] as $language_id ) {
281 +
282 + if (
283 + ! wplng_is_valid_language_id( $language_id )
284 + || empty( $language['id'] )
285 + || $language['id'] !== $language_id
286 + ) {
287 + continue;
288 + }
289 +
290 + $languages_id_ordered[] = $language_id;
291 + break;
292 +
293 + }
294 + }
295 +
296 + return $languages_id_ordered;
297 + }
298 +
299 + return false;
300 +}
301 +
302 +
303 +/**
304 + * Get enabled features from wpLingua API data
305 + * ('search', 'commercial', 'detection')
306 + *
307 + * @return array
308 + */
309 +function wplng_get_api_feature() {
310 +
311 + $data = wplng_get_api_data();
312 + $all = array( 'search', 'commercial', 'detection' );
313 + $features = array();
314 +
315 + if ( ! empty( $data['features'] ) && is_array( $data['features'] ) ) {
316 + foreach ( $data['features'] as $feature_name => $feature_allow ) {
317 + if ( $feature_allow && in_array( $feature_name, $all, true ) ) {
318 + $features[] = $feature_name;
319 + }
320 + }
321 + }
322 +
323 + return $features;
324 +}
325 +
326 +
327 +/**
328 + * Return true if the feature is enable in wpLingua API key data
329 + *
330 + * @param string $feature_name
331 + * @return bool
332 + */
333 +function wplng_api_feature_is_allow( $feature_name ) {
334 + return in_array( $feature_name, wplng_get_api_feature(), true );
335 +}
336 +
337 +
338 +/**
339 + * Check if the wpLingua API is overloaded
340 + *
341 + * This function determines whether the wpLingua API is currently overloaded
342 + * based on a stored timestamp. If the API is overloaded, it returns true.
343 + * Otherwise, it clears the overloaded status and returns false.
344 + *
345 + * @global bool|null $wplng_api_is_overloaded Cached overloaded status
346 + * @return bool True if the API is overloaded, false otherwise
347 + */
348 +function wplng_get_api_overloaded() {
349 +
350 + global $wplng_api_is_overloaded;
351 +
352 + // If overload is true, return directly
353 + // Else, recheck the value
354 + if ( ! empty( $wplng_api_is_overloaded ) ) {
355 + return $wplng_api_is_overloaded;
356 + }
357 +
358 + $overloaded = get_option( 'wplng_api_overloaded' );
359 +
360 + if ( ! empty( $overloaded )
361 + && ( $overloaded + ( 2 * MINUTE_IN_SECONDS ) ) > time()
362 + ) {
363 + $wplng_api_is_overloaded = true;
364 + } else {
365 + $wplng_api_is_overloaded = false;
366 + delete_option( 'wplng_api_overloaded' );
367 + }
368 +
369 + return $wplng_api_is_overloaded;
370 +}
371 +
372 +
373 +/**
374 + * Mark the wpLingua API as overloaded
375 + *
376 + * This function sets the overloaded status for the wpLingua API by updating
377 + * a timestamp in the database. If the API is already marked as overloaded,
378 + * the function does nothing.
379 + *
380 + * @global bool|null $wplng_api_is_overloaded Cached overloaded status
381 + * @return void
382 + */
383 +function wplng_set_api_overloaded() {
384 +
385 + if ( wplng_get_api_overloaded() ) {
386 + return;
387 + }
388 +
389 + global $wplng_api_is_overloaded;
390 + $wplng_api_is_overloaded = true;
391 +
392 + update_option(
393 + 'wplng_api_overloaded',
394 + time(),
395 + true
396 + );
397 +
398 + wp_cache_flush();
399 +}
400 +
401 +
402 +/**
403 + * Clear wpLingua API key data if wpLingua key is changed
404 + *
405 + * @param string $old_value JSON
406 + * @param string $new_value JSON
407 + * @return void
408 + */
409 +function wplng_on_update_option_wplng_api_key( $old_value, $new_value ) {
410 +
411 + delete_option( 'wplng_api_key_data' );
412 + delete_option( 'wplng_website_language' );
413 + delete_option( 'wplng_website_flag' );
414 +
415 + wplng_clear_translations_cache();
416 + wplng_clear_slugs_cache();
417 +}