PluginProbe
WPGet API – Connect to any external REST API / 2.2.4
WPGet API – Connect to any external REST API v2.2.4
1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.1.0 2.1.1 2.1.3 2.1.4 2.1.5 2.2.0 2.2.1 2.2.10 2.2.2 2.2.3 All 97 releases
wpgetapi / includes / class-api.php

class-api.php in WPGet API – Connect to any external REST API 2.2.4, at includes/class-api.php

853 lines 35.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // Exit if accessed directly
4 if ( ! defined( 'ABSPATH' ) ) exit;
5
6 /**
7 * The main class
8 *
9 * @since 1.0.0
10 */
11 class WpGetApi_Api {
12
13 public $encryption = ''; // the encryption class
14
15 public $setup = ''; // store the setup data from the admin page
16 public $api = ''; // store the api's from the admin page
17
18 public $api_id = ''; // the api_id that we are wanting to get
19 public $endpoint_id = ''; // the endpoint_id that we are wanting to get
20 public $args = ''; // the args
21 public $keys = ''; // the keys we want to retrieve
22
23 public $base_url = ''; // base url of the API
24 public $method = 'GET'; // the endpoint method GET POST etc
25 public $cache_time = ''; // the time to cache
26 public $endpoint = ''; // the endpoint that we will get
27 public $query_parameters = ''; // the query paramaters appended to url
28 public $header_parameters = ''; // the header paramaters
29 public $body_parameters = ''; // the body paramaters
30 public $body_json_encode = ''; // body_json_encode body
31 public $body_url_encode = ''; // urlencode body
32 public $body_base64_encode = ''; // base64 encode body
33 public $body_xml_format = ''; // xml format body
34 public $xml_root_node = 'root'; // root node for xml
35
36 public $response = ''; // the returned response
37
38 public $final_url = ''; // final URL
39 public $final_request_args = array(); // final request_args
40
41 public $results_format = 'json_string'; // results format
42
43 public $response_code = ''; // the response code from the call
44
45 public $timeout = 10; // the timeout
46 public $sslverify = 1; // ssl verify
47 public $debug = false;
48
49 public $pro_plugin = false;
50
51
52 /**
53 * Main constructor
54 *
55 * @since 1.0.0
56 *
57 */
58 public function __construct( $api_id = '', $endpoint_id = '', $args = array(), $keys = array() ) {
59
60 $this->setup = get_option( 'wpgetapi_setup' );
61 $this->api = get_option( 'wpgetapi_' . $api_id );
62
63 $this->encryption = new WpGetApi_Encryption();
64 $this->api_id = sanitize_text_field( $api_id );
65 $this->endpoint_id = sanitize_text_field( $endpoint_id );
66 $this->keys = $keys;
67 $this->args = $args;
68
69 add_filter( 'wpgetapi_raw_error_data', array( $this, 'maybe_add_debug_info' ), 99, 2 );
70 add_filter( 'wpgetapi_raw_data', array( $this, 'maybe_add_debug_info' ), 99, 2 );
71
72 }
73
74
75 /**
76 * Init our api data
77 */
78 public function init() {
79
80 if ( ! function_exists( 'is_plugin_active' ) ) {
81 include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
82 }
83
84 $this->pro_plugin = is_plugin_active( 'wpgetapi-extras/wpgetapi-extras.php' ) ? true : false;
85
86 // if we are doing importer plugin,
87 // we need to intercept and modify most of our methods values
88 if( $this->api_id === 'wpgetapi_importer' ) {
89
90 $data = apply_filters( 'wpgetapi_api_importer_init', $this );
91
92 if( $data ) {
93
94 foreach ($data as $key => $value) {
95 $this->{$key} = $value;
96 }
97
98 $this->query_parameters = ! empty( $this->query_parameters ) ? $this->do_parameters( $this->query_parameters ) : array();
99 $this->header_parameters = ! empty( $this->header_parameters ) ? $this->do_parameters( $this->header_parameters ) : array();
100 $this->body_parameters = ! empty( $this->body_parameters ) ? $this->do_parameters( $this->body_parameters ) : array();
101 return;
102
103 }
104
105 }
106
107 // do some checks
108 if( empty( $this->setup ) || ! isset( $this->setup['apis'] ) || empty( $this->setup['apis'] ) )
109 return 'No API found.';
110
111 // do some checks
112 if( ! $this->api || ! isset( $this->api['endpoints'] ) || empty( $this->api['endpoints'] ))
113 return 'API not found.';
114
115 // loop through api's
116 // set base_url
117 foreach ( $this->setup['apis'] as $index => $api_item ) {
118 if( $this->api_id == $api_item['id'] ) {
119 $this->base_url = isset( $api_item['base_url'] ) && ! empty( $api_item['base_url'] ) ? esc_url_raw( $api_item['base_url'] ) : '';
120 }
121 }
122
123 // loop through endpoints
124 foreach ( $this->api['endpoints'] as $index => $endpoint ) {
125
126 if( $this->endpoint_id == $endpoint['id'] ) {
127
128 $this->method = isset( $endpoint['method'] ) && $endpoint['method'] != '' ? sanitize_text_field( $endpoint['method'] ) : 'GET';
129 $this->timeout = isset( $endpoint['timeout'] ) && ! empty( $endpoint['timeout'] ) ? absint( $endpoint['timeout'] ) : '';
130 $this->cache_time = isset( $endpoint['cache_time'] ) && ! empty( $endpoint['cache_time'] ) ? absint( $endpoint['cache_time'] ) : '';
131 $this->endpoint = isset( $endpoint['endpoint'] ) && ! empty( $endpoint['endpoint'] ) ? sanitize_text_field( $endpoint['endpoint'] ) : '';
132
133 $this->query_parameters = isset( $endpoint['query_parameters'] ) && ! empty( $endpoint['query_parameters'] ) ? $this->do_parameters( $endpoint['query_parameters'] ) : array();
134
135 $this->header_parameters = isset( $endpoint['header_parameters'] ) && ! empty( $endpoint['header_parameters'] ) ? $this->do_parameters( $endpoint['header_parameters'] ) : array();
136
137 $this->body_parameters = isset( $endpoint['body_parameters'] ) && ! empty( $endpoint['body_parameters'] ) ? $this->do_parameters( $endpoint['body_parameters'] ) : array();
138
139 // how to encode the body
140 $this->body_json_encode = isset( $endpoint['body_json_encode'] ) && $endpoint['body_json_encode'] == 'true' ? true : false;
141 $this->body_url_encode = isset( $endpoint['body_json_encode'] ) && $endpoint['body_json_encode'] == 'url' ? true : false;
142 $this->body_base64_encode = isset( $endpoint['body_json_encode'] ) && $endpoint['body_json_encode'] == 'base64' ? true : false;
143 $this->body_xml_format = isset( $endpoint['body_json_encode'] ) && $endpoint['body_json_encode'] == 'xml' ? true : false;
144
145 $this->xml_root_node = isset( $endpoint['xml_root'] ) && ! empty( $endpoint['xml_root'] ) ? $endpoint['xml_root'] : $this->xml_root_node;
146
147 $this->results_format = isset( $endpoint['results_format'] ) ? sanitize_text_field( $endpoint['results_format'] ) : $this->results_format;
148
149
150 if(
151 // set the format to php array data if html format is set
152 ( isset( $this->args['format'] ) && $this->args['format'] == 'html' && $this->results_format != 'xml_array' ) ||
153 // set the format to php array data if it is set in the args (coming from the importer)
154 ( isset( $this->args['results_format'] ) && $this->args['results_format'] == 'json_decoded' )
155 ) {
156 $this->results_format = 'json_decoded';
157 }
158
159 // set the format to JSON string if it is set in the args (coming from the wpdatatables integration)
160 if( isset( $this->args['results_format'] ) && $this->args['results_format'] == 'json_string' ) {
161 $this->results_format = 'json_string';
162 }
163
164 // set the format to JSON string if it is set in the args (coming from the wpdatatables integration)
165 if( isset( $this->args['results_format'] ) && $this->args['results_format'] == 'json_decoded' ) {
166 $this->results_format = 'json_decoded';
167 }
168
169 }
170
171 }
172
173 $this->timeout = isset( $this->api['timeout'] ) && ! empty( $this->api['timeout'] ) ? $this->api['timeout'] : $this->timeout;
174 $this->sslverify = isset( $this->api['sslverify'] ) ? absint( $this->api['sslverify'] ) : $this->sslverify;
175
176 }
177
178
179 /**
180 * The main function to output the data
181 *
182 * @param string $field Field to retrieve
183 */
184 public function endpoint_output() {
185
186 do_action( 'wpgetapi_before_do_the_call', $this );
187
188 return $this->do_the_call();
189
190 }
191
192
193 /**
194 * Send the request and return our data
195 */
196 public function do_the_call() {
197
198 $this->init();
199
200 // build the URL
201 $this->final_url = apply_filters( 'wpgetapi_final_url', $this->build_url(), $this );
202
203 // build the request args
204 $this->final_request_args = apply_filters( 'wpgetapi_final_request_args', $this->build_request_args(), $this );
205
206 /**
207 * Check if we should stop or not. Setting $on to true, will stop us calling the api.
208 * @param bool $on Whether on is set or not.
209 */
210
211 if ( apply_filters( 'wpgetapi_should_we_stop', false, $this ) ) {
212 return;
213 }
214
215 // POST request
216 if( $this->method == 'POST' )
217 $this->response = $this->POST_request();
218
219 // PUT request
220 if( $this->method == 'PUT' )
221 $this->response = $this->PUT_request();
222
223 // PATCH request
224 if( $this->method == 'PATCH' )
225 $this->response = $this->PATCH_request();
226
227 // GET request
228 if( $this->method == 'GET' )
229 $this->response = $this->GET_request();
230
231 // DELETE request
232 if( $this->method == 'DELETE' )
233 $this->response = $this->DELETE_request();
234
235 // wp error
236 if( is_wp_error( $this->response ) ) {
237 return apply_filters( 'wpgetapi_raw_error_data', json_encode( $this->response ), $this );
238 }
239
240 // get response_code
241 $this->response_code = wp_remote_retrieve_response_code( $this->response );
242
243 // action to intercept call depending on response_code
244 $this->response = apply_filters( 'wpgetapi_before_retrieve_body', $this->response, $this->response_code, $this );
245
246 // get body
247 // modified in version 1.6.1 to allow for OAuth 2.0 plugin returning body already
248 $data = isset( $this->response['body'] ) ? $this->response['body'] : $this->response;
249
250 // returning in JSON format
251 if( $this->results_format == 'json_string' || $this->results_format == 'json_decoded' )
252 $data = $this->return_data( $data );
253
254 if( $data === 'null' )
255 $data = 'Result is null. Check that all endpoint settings are correct.';
256
257 return apply_filters( 'wpgetapi_raw_data', $data, $this );
258
259 }
260
261
262 /**
263 * Build the request url with the ability to add args
264 */
265 public function build_url() {
266
267 // first make sure our endpoint starts with a slash
268 if ( substr( $this->endpoint, 0, 1 ) != '/' )
269 $this->endpoint = '/' . $this->endpoint;
270
271 // if we have item_key from api to posts plugin
272 // replace our keyword with the actual item_key value
273 if ( isset( $this->args['item_key'] ) && strpos( $this->endpoint, '(importer:item_key)' ) !== false ) {
274 $this->endpoint = str_replace( '(importer:item_key)', $this->args['item_key'], $this->endpoint );
275 }
276
277 $this->endpoint = apply_filters( 'wpgetapi_endpoint', $this->endpoint, $this );
278
279 $url = untrailingslashit( $this->base_url ) . $this->endpoint;
280
281 // if we have a URL pagination event from the import plugin
282 // we need to modify the URL here
283 if( isset( $this->args['paginate_url'] ) )
284 $url = $this->args['paginate_url'];
285
286 // filter our params - added for use in Oauth 2.0 plugin
287 $params = apply_filters( 'wpgetapi_query_parameters', $this->query_parameters, $this );
288
289 // add empty array - was getting errors if it was just null or false
290 $params = empty( $params ) ? array(''=>'') : $params;
291
292 $result = add_query_arg( $params, $url );
293
294 return $result;
295
296 }
297
298
299 /**
300 * build the header with the ability to add args
301 */
302 public function build_request_args() {
303
304 // add our header parameters to the headers
305 $headers = apply_filters( 'wpgetapi_header_parameters', array(
306 'headers' => $this->header_parameters,
307 ), $this );
308
309
310 // if doing POST request, include body paramters
311 if( $this->method == 'POST' || $this->method == 'PUT' || $this->method == 'DELETE' || $this->method == 'PATCH' ) {
312
313 // tokens are sent through here
314 $this->body_parameters = apply_filters( 'wpgetapi_body_parameters', $this->body_parameters, $this );
315
316 // do we json_encode the entire body
317 if( $this->body_json_encode == true ) {
318 $this->body_parameters = json_encode( $this->body_parameters );
319 }
320
321 // do we urlencode the entire body
322 if( $this->body_parameters && $this->body_url_encode == true ) {
323
324 // checking if the parameters have a json string (raw)
325 if (
326 ( ! is_array( $this->body_parameters ) ) &&
327 ( substr( $this->body_parameters, 0, 1 ) === '{' || substr( $this->body_parameters, 0, 1 ) === '[' )
328 ) {
329 $this->body_parameters = json_decode( $this->body_parameters, true );
330 }
331
332 $this->body_parameters = http_build_query( $this->body_parameters, '', '&' );
333
334 }
335
336 // do we xml the entire body
337 if( $this->body_parameters && $this->body_xml_format == true ) {
338
339 $root_node = $this->xml_root_node != '' ? '<' . $this->xml_root_node . '/>' : '';
340
341 $xml_element = apply_filters( 'wpgetapi_xml_element', '<?xml version="1.0" encoding="UTF-8"?>' . $root_node );
342
343 $xml = new SimpleXmlElement( $xml_element );
344
345 foreach( $this->body_parameters as $key => $value) {
346 $xml->addChild( $key, $value );
347 }
348
349 $this->body_parameters = $xml->asXML();
350
351 }
352
353 // do we base64 encode the entire body
354 if( $this->body_parameters && $this->body_base64_encode == true ) {
355
356 $this->body_parameters = is_array( $this->body_parameters ) ? json_encode( $this->body_parameters ) : $this->body_parameters;
357 $this->body_parameters = base64_encode( $this->body_parameters );
358
359 }
360
361 $this->body_parameters = apply_filters( 'wpgetapi_modify_formatted_body_parameters', $this->body_parameters, $this );
362
363 // add our body parameters
364 if( $this->body_parameters && ! empty( $this->body_parameters ) )
365 $headers['body'] = $this->body_parameters;
366
367 }
368
369 // get our body paramters as they are formatted
370 // this won't change anything, it just allows us to get the parameters
371 $this->body_parameters = apply_filters( 'wpgetapi_final_body_parameters', $this->body_parameters, $this );
372
373 // add headers to our final request args
374 $this->final_request_args = wp_parse_args( $headers, $this->final_request_args );
375
376 // build the args taht are sent to the request
377 $default_args = apply_filters( 'wpgetapi_default_request_args_parameters', array(
378 'timeout' => ( absint( $this->timeout ) > 0 ? absint( $this->timeout ) : 10 ),
379 'sslverify' => $this->sslverify,
380 'redirection' => 5,
381 'blocking' => true,
382 'cookies' => array(),
383 ) );
384
385 return wp_parse_args( $this->final_request_args, $default_args );
386
387 }
388
389
390
391
392 /**
393 * Do a GET request
394 */
395 public function GET_request() {
396
397 $response = '';
398 // so we can so something before the remote_get (caching)
399 $response = apply_filters( 'wpgetapi_before_get_request', $response, $this );
400
401 if( empty( $response ) )
402 $response = wp_remote_get( $this->final_url, $this->final_request_args );
403
404 return $response;
405
406 }
407
408 /**
409 * Do a POST request
410 */
411 public function POST_request() {
412
413 $response = '';
414 // so we can so something before the remote_post (caching)
415 $response = apply_filters( 'wpgetapi_before_post_request', $response, $this );
416
417 //$this->final_request_args['method'] = 'POST';
418
419 if( empty( $response ) )
420 $response = wp_remote_post( $this->final_url, $this->final_request_args );
421
422 return $response;
423 }
424
425 /**
426 * Do a PUT request
427 */
428 public function PUT_request() {
429 $this->final_request_args['method'] = 'PUT';
430 $response = wp_remote_request( $this->final_url, $this->final_request_args );
431 return $response;
432 }
433
434 /**
435 * Do a PATCH request
436 */
437 public function PATCH_request() {
438 $this->final_request_args['method'] = 'PATCH';
439 $response = wp_remote_request( $this->final_url, $this->final_request_args );
440 return $response;
441 }
442
443 /**
444 * Do a DELETE request
445 */
446 public function DELETE_request() {
447 $this->final_request_args['method'] = 'DELETE';
448 $response = wp_remote_request( $this->final_url, $this->final_request_args );
449 return $response;
450 }
451
452
453 /**
454 * return data
455 */
456 public function return_data( $data ) {
457
458 $data = apply_filters( 'wpgetapi_json_response_body_before_decode', $data, $this->keys );
459
460 // converts all data to arrays, removing objects
461 if( is_string( $data ) ) {
462 $decode = json_decode( $data, true );
463 if( json_last_error() ) {
464 return esc_html( $data );
465 } else {
466 $data = $decode;
467 }
468 }
469
470 $data = apply_filters( 'wpgetapi_json_response_body', $data, $this->keys );
471
472 if( $this->results_format == 'json_string' )
473 return trim( json_encode( $data, JSON_PRETTY_PRINT ),'"');
474
475 if( $this->results_format == 'json_decoded' )
476 return $data;
477
478 }
479
480 /**
481 * Sort out the parameters if they exist
482 */
483 public function do_parameters( $parameters ) {
484
485 $new_array = array();
486 $raw = '';
487 $parameters = $this->decrypt( $parameters );
488
489 if( is_array( $parameters ) ) {
490 foreach ( $parameters as $key => $parameter ) {
491
492 if( ! empty( $parameter['name'] ) && ( ! empty( $parameter['value'] ) || $parameter['value'] == 0 ) ) {
493
494 $parameter['value'] = stripslashes( $parameter['value'] );
495
496 // if we have wpgetapi_on, delete it so we don't send to api
497 if( $parameter['name'] == 'wpgetapi_on' ) {
498 unset( $parameters[ $key ] );
499 continue;
500 }
501
502 // if we have item_key from api to posts plugin
503 // replace our keyword with the actual item_key value
504 if ( isset( $this->args['item_key'] ) && strpos( $parameter['value'], '(importer:item_key)' ) !== false ) {
505 $parameter['value'] = str_replace( '(importer:item_key)', $this->args['item_key'], $parameter['value'] );
506 }
507
508 $new_array[ sanitize_text_field( $parameter['name'] ) ] = $parameter['value'];
509
510 // if we are sending raw body
511 } else if( empty( $parameter['name'] ) && ! empty( $parameter['value'] ) ) {
512
513 $raw = stripslashes( $parameter['value'] );
514
515 }
516
517 }
518 }
519
520 // now look for array or json string and sort these out - for using such things in shortcode
521 if( ! empty( $new_array ) ) {
522
523 foreach ( $new_array as $key => $value ) {
524
525 // checking if the parameters have a json string
526 if ( strpos( $value, '{"' ) !== false && strpos( $value, '}' ) !== false ) {
527
528 $tmp_val = $value;
529 $tmp_val = json_decode( $tmp_val, true );
530 $new_array[ $key ] = $tmp_val ? $tmp_val : $value;
531
532 } else
533
534 // checking if the parameters have an array within the string
535 // if they do, create them as an actual array
536 if ( substr( $value, 0, 1 ) === '[' && substr( $value, -1 ) === ']' ) {
537 $valueArr = trim( $value );
538 $valueArr = $this->check_contains_array_value( $valueArr ); //If array value pass in body then convert to array from string
539 $new_array[ $key ] = $valueArr;
540 }
541
542 // set value as integer
543 if ( strpos( $value, 'integer(' ) !== false && substr( $value, -1 ) === ')' ) {
544
545 preg_match("/\(([^\)]*)\)/", $value, $match );
546 $result = trim( $match[1] );
547
548 // checking if we have additional token within
549 // and we need to send this directly to PRO plugin from here
550 if( strpos( $value, '(' ) !== false && strpos( $value, ':' ) !== false && $this->pro_plugin ) {
551 $result = $this->replace_tokens( $result );
552 } else {
553 $result = $result;
554 }
555
556 $new_array[ $key ] = absint( $result );
557
558 }
559
560 // set value as float
561 if ( strpos( $value, 'float(' ) !== false && substr( $value, -1 ) === ')' ) {
562
563 preg_match("/\(([^\)]*)\)/", $value, $match );
564 $result = trim( $match[1] );
565 if ( substr( $result, 0, 1 ) === '"' && substr( $result, -1 ) === '"' )
566 $result = trim( $result,'""' );
567
568 // checking if we have additional token within
569 // and we need to send this directly to PRO plugin from here
570 if( strpos( $value, '(' ) !== false && strpos( $value, ':' ) !== false && $this->pro_plugin ) {
571 $result = $this->replace_tokens( $result );
572 }
573
574 $new_array[ $key ] = (float) $result;
575
576 }
577
578 // set value as boolean
579 if ( strpos( $value, 'boolean(' ) !== false && substr( $value, -1 ) === ')' ) {
580 preg_match("/\(([^\)]*)\)/", $value, $match );
581 $result = $match[1];
582
583 // checking if we have additional token within
584 // and we need to send this directly to PRO plugin from here
585 if( strpos( $value, '(' ) !== false && strpos( $value, ':' ) !== false && $this->pro_plugin ) {
586 $result = $this->replace_tokens( $result );
587 } else {
588 $result = $result;
589 }
590
591 $result = filter_var( $result, FILTER_VALIDATE_BOOLEAN );
592
593 $new_array[ $key ] = $result;
594
595 }
596
597 }
598
599 }
600
601 return $raw ? $raw : $new_array;
602
603 }
604
605
606 /**
607 * Do a direct token replacement if PRO plugin installed and is required.
608 */
609 public function replace_tokens( $value ) {
610 $tokens = new WpGetApi_Extras_Tokens();
611 $action_args = isset( $this->args['action_args'] ) ? $this->args['action_args'] : null;
612 $value = ( substr( $value, -1 ) !== ')' ? $value . ')' : $value );
613 $result = $tokens->replace_tokens( $value, $action_args );
614 return $result;
615 }
616
617
618 /**
619 * decrypt our parameters from the DB
620 */
621 public function decrypt( $array_or_string ) {
622
623 if( is_string($array_or_string) ){
624 $array_or_string = $this->encryption->decrypt($array_or_string);
625 }elseif( is_array($array_or_string) ){
626 foreach ( $array_or_string as $key => &$value ) {
627 if( $key === 'name' )
628 continue;
629 if ( is_array( $value ) ) {
630 $value = $this->decrypt($value);
631 }
632 else {
633 $value = $this->encryption->decrypt($value);
634
635 }
636 }
637 }
638 return $array_or_string;
639 }
640
641
642 /**
643 * check parameter value contains array value
644 * @param string $parameter_value // parameter value
645 */
646 public function check_contains_array_value( $parameter_value ) {
647 //check $parameter_value first character [ and last character is ]
648 if( substr( $parameter_value, 0, 1 ) === '[' && substr( $parameter_value, -1 ) === ']' ) {
649 $parameter_value = str_replace( "'", '"', $parameter_value ); // replce single quote with the double quote convert into array
650 $parameter_value = json_decode( $parameter_value, true ); //If array value pass in body then convert to array
651 }
652 return $parameter_value;
653 }
654
655
656 /**
657 * debug
658 */
659 public function maybe_add_debug_info( $data, $wpgetapi ) {
660
661 if(
662 ( isset( $this->args['debug'] ) && ( $this->args['debug'] === true || $this->args['debug'] === 'true' ) ) ||
663 ( isset( $this->args['test_endpoint'] ) && ( $this->args['test_endpoint'] === true ) )
664 ) {
665
666 $this->debug = true;
667
668 // admin test endpoint button
669 $testing = isset( $this->args['test_endpoint'] ) && ( $this->args['test_endpoint'] === true ) ? true : false;
670
671 // get api status from response code
672 $status = array(
673 'title' => 'Error in API response.',
674 'desc' => 'Check all details within your endpoint. Something is misconfigured.',
675 'type' => '<span class="dashicons dashicons-dismiss"></span>'
676 );
677
678 $search = 'cURL error 28';
679 if( isset( $data ) && ! is_array( $data ) && preg_match( "/{$search}/i", $data ) ) {
680 $status = array(
681 'title' => 'Error!',
682 'desc' => 'Timeout error. Try increasing the timeout value.',
683 'type' => '<span class="dashicons dashicons-dismiss"></span>'
684 );
685 }
686
687 $search = 'cURL error 60';
688 if( isset( $data ) && ! is_array( $data ) && preg_match( "/{$search}/i", $data ) ) {
689 $status = array(
690 'title' => 'Error!',
691 'desc' => 'SSL verification has failed. See <a href="https://wordpress.stackexchange.com/a/167910/11827" target="_blank">here</a> for possible solution.',
692 'type' => '<span class="dashicons dashicons-dismiss"></span>'
693 );
694 }
695
696 if( $this->response_code >= 200 && $this->response_code <= 299 ) {
697 $status = array(
698 'title' => 'Success!',
699 'desc' => 'Your API is returning a success message and is returning the data as shown in the Data Output section below. You can modify this by changing the Results Format option or see <a href="https://wpgetapi.com/docs/format-api-data-as-html/">here</a> for info on formatting this data.',
700 'type' => '<span class="dashicons dashicons-yes-alt"></span>'
701 );
702 }
703 if( $this->response_code >= 400 && $this->response_code <= 499 ) {
704 $status = array(
705 'title' => 'Bad Request',
706 'desc' => 'This could indicate that the URL you are calling is incorrect or that some other data is missing or incorrect. Please check your Base URL and Endpoint are correct as well as the Request Method.',
707 'type' => '<span class="dashicons dashicons-dismiss"></span>'
708 );
709 }
710 if( $this->response_code == 401 ) {
711 $status = array(
712 'title' => 'Unauthorised',
713 'desc' => 'You are successfully connecting to your API. But your API key, login or API credentials are incorrect. See <a href="https://wpgetapi.com/docs/authentication-authorization/">here</a> for info on correctly authorizing your API requests.',
714 'type' => '<span class="dashicons dashicons-warning"></span>'
715 );
716 }
717 if( $this->response_code == 403 ) {
718 $status = array(
719 'title' => 'Forbidden',
720 'desc' => 'This could indicate that you may need to get your IP address whitelisted with your API provider or that you do not have access to this API.',
721 'type' => '<span class="dashicons dashicons-dismiss"></span>'
722 );
723 }
724 if( $this->response_code == 405 ) {
725 $status = array(
726 'title' => 'Method Not Allowed',
727 'desc' => 'Try changing the Request Method within the endpoint settings.',
728 'type' => '<span class="dashicons dashicons-dismiss"></span>'
729 );
730 }
731 if( $this->response_code == 415 ) {
732 $status = array(
733 'title' => 'Unsupported Media Type',
734 'desc' => 'Try adding "Content-type" to the Headers with the Value of "json/application" as shown <a href="https://wpgetapi.com/docs/troubleshooting/">here</a>.',
735 'type' => '<span class="dashicons dashicons-dismiss"></span>'
736 );
737 }
738 if( $this->response_code >= 500 && $this->response_code <= 599 ) {
739 $status = array(
740 'title' => 'Internal Server Error',
741 'desc' => 'This indicates an issue with the API server. Contact your API provider.',
742 'type' => '<span class="dashicons dashicons-dismiss"></span>'
743 );
744 }
745
746
747 ob_start(); ?>
748
749 <div class="wpgetapi-debug <?php echo $testing ? 'testing' : ''; ?>">
750
751 <?php if( $testing ) { ?>
752
753 <div class="debug-item status">
754 <div class="">
755 <h5><?php _e( $status['type'] ); ?> <?php esc_html_e( $status['title'] ); ?></h5>
756 <span class="desc"><?php _e( $status['desc'] ); ?></span>
757 </div>
758 </div>
759 <div class="debug-item">
760 <h6><?php esc_html_e( 'Full URL', 'wpgetapi' ); ?></h6>
761 <p class="small"><?php esc_html_e( 'The full URL that is being called.', 'wpgetapi' ); ?></p>
762 <div class="debug-result"><?php esc_html_e( $this->final_url ); ?></div>
763 </div>
764
765 <div class="debug-item">
766 <h6><?php esc_html_e( 'Data Output', 'wpgetapi' ); ?></h6>
767 <p class="small"><?php esc_html_e( 'The output that has been returned from the API. This is what the shortcode or template tag will display and can be formatted however you like.', 'wpgetapi' ); ?></p>
768 <div class="debug-result"><?php wpgetapi_pp( $data ); ?></div>
769 </div>
770
771 <div class="debug-item">
772 <h6><?php esc_html_e( 'Final Request Arguments', 'wpgetapi' ); ?></h6>
773 <p class="small"><?php esc_html_e( 'The final request arguments sent in the API request. Includes headers and body arguments.', 'wpgetapi' ); ?></p>
774 <div class="debug-result"><?php wpgetapi_pp( $this->final_request_args ); ?></div>
775 </div>
776
777 <div class="debug-item">
778 <h6><?php esc_html_e( 'Response', 'wpgetapi' ); ?></h6>
779 <p class="small"><?php esc_html_e( 'The full response from the API request.', 'wpgetapi' ); ?></p>
780 <div class="debug-result"><?php wpgetapi_pp( $this->response); ?></div>
781 </div>
782
783 <?php } else { ?>
784
785 <h5><strong><?php esc_html_e( 'WPGetAPI, Debug Mode - Plugin Version', 'wpgetapi' ); ?> <?php esc_html_e( WpGetApi()->version ); ?></strong></h5>
786 <p class="small"><?php esc_html_e( 'Below you will find debug info for the current API call. To turn this off, set debug to false in your shortcode or template tag.', 'wpgetapi' ); ?><br><?php esc_html_e( 'Connecting to API\'s can be tricky - if you require help, please see the', 'wpgetapi' ); ?> <a target="_blank" href="https://wpgetapi.com/docs/"><?php esc_html_e( 'Documentation', 'wpgetapi' ); ?></a>.</p>
787
788 <div class="debug-item">
789 <h6><?php esc_html_e( 'Full URL', 'wpgetapi' ); ?></h6>
790 <p class="small"><?php esc_html_e( 'The full URL that is being called.', 'wpgetapi' ); ?></p>
791 <div class="debug-result"><?php esc_html_e( $this->final_url ); ?></div>
792 </div>
793
794 <div class="debug-item">
795 <h6><?php esc_html_e( 'Data Output', 'wpgetapi' ); ?></h6>
796 <p class="small"><?php esc_html_e( 'The resulting output that has been returned from the API.', 'wpgetapi' ); ?></p>
797 <div class="debug-result"><?php wpgetapi_pp( $data ); ?></div>
798 </div>
799
800 <div class="debug-item">
801 <h6><?php esc_html_e( 'Query String', 'wpgetapi' ); ?></h6>
802 <p class="small"><?php esc_html_e( 'The query string parameters (if any) that you have set within the endpoint settings.', 'wpgetapi' ); ?></p>
803 <div class="debug-result"><?php wpgetapi_pp( $this->query_parameters ); ?></div>
804 </div>
805
806 <div class="debug-item">
807 <h6><?php esc_html_e( 'Headers', 'wpgetapi' ); ?></h6>
808 <p class="small"><?php esc_html_e( 'The header parameters (if any) that you have set within the endpoint settings.', 'wpgetapi' ); ?></p>
809 <div class="debug-result"><?php wpgetapi_pp( $this->header_parameters ); ?></div>
810 </div>
811
812 <div class="debug-item">
813 <h6><?php esc_html_e( 'Body', 'wpgetapi' ); ?></h6>
814 <p class="small"><?php esc_html_e( 'The body parameters (if any) that you have set within the endpoint settings.', 'wpgetapi' ); ?></p>
815 <div class="debug-result"><?php wpgetapi_pp( $this->body_parameters ); ?></div>
816 </div>
817
818 <div class="debug-item">
819 <h6><?php esc_html_e( 'Final Request Arguments', 'wpgetapi' ); ?></h6>
820 <p class="small"><?php esc_html_e( 'The final request arguments sent in the API request. Includes headers and body arguments.', 'wpgetapi' ); ?></p>
821 <div class="debug-result"><?php wpgetapi_pp( $this->final_request_args ); ?></div>
822 </div>
823
824 <div class="debug-item">
825 <h6><?php esc_html_e( 'Arguments', 'wpgetapi' ); ?></h6>
826 <p class="small"><?php esc_html_e( 'The arguments set within your shortcode or template tag.', 'wpgetapi' ); ?></p>
827 <div class="debug-result"><?php wpgetapi_pp( $this->args ); ?></div>
828 </div>
829
830 <div class="debug-item">
831 <h6><?php esc_html_e( 'Response', 'wpgetapi' ); ?></h6>
832 <p class="small"><?php esc_html_e( 'The full response from the API request.', 'wpgetapi' ); ?></p>
833 <div class="debug-result"><?php wpgetapi_pp( $this->response); ?></div>
834 </div>
835
836 <?php } ?>
837
838 </div>
839
840 <?php
841
842 return ob_get_clean();
843
844 } else {
845
846 return $data;
847
848 }
849
850 }
851
852
853 }