PluginProbe
WPGet API – Connect to any external REST API / 1.7.9
WPGet API – Connect to any external REST API v1.7.9
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 1.7.9, at includes/class-api.php

583 lines 21.2 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
33 public $response = ''; // the returned response
34
35 public $final_url = ''; // final URL
36 public $final_request_args = array(); // final request_args
37
38 public $results_format = 'json_string'; // reseults format
39
40 public $timeout = 10; // the timeout
41 public $sslverify = 1; // the paramaters
42 public $debug = false;
43
44
45 /**
46 * Main constructor
47 *
48 * @since 1.0.0
49 *
50 */
51 public function __construct( $api_id = '', $endpoint_id = '', $args = array(), $keys = array() ) {
52
53 $this->setup = get_option( 'wpgetapi_setup' );
54 $this->api = get_option( 'wpgetapi_' . $api_id );
55
56 $this->encryption = new WpGetApi_Encryption();
57 $this->api_id = sanitize_text_field( $api_id );
58 $this->endpoint_id = sanitize_text_field( $endpoint_id );
59 $this->keys = $keys;
60 $this->args = $args;
61
62 add_filter( 'wpgetapi_raw_data', array( $this, 'maybe_add_debug_info' ), 5, 2 );
63
64 }
65
66
67 /**
68 * Init our api data
69 */
70 public function init() {
71
72 // do some checks
73 if( empty( $this->setup ) || ! isset( $this->setup['apis'] ) || empty( $this->setup['apis'] ) )
74 return 'No API found.';
75
76 // do some checks
77 if( ! $this->api || ! isset( $this->api['endpoints'] ) || empty( $this->api['endpoints'] ))
78 return 'API not found.';
79
80 // loop through api's
81 // set base_url
82 foreach ( $this->setup['apis'] as $index => $api_item ) {
83 if( $this->api_id == $api_item['id'] ) {
84 $this->base_url = isset( $api_item['base_url'] ) && ! empty( $api_item['base_url'] ) ? esc_url_raw( $api_item['base_url'] ) : '';
85 }
86 }
87
88 // loop through endpoints
89 foreach ( $this->api['endpoints'] as $index => $endpoint ) {
90
91 if( $this->endpoint_id == $endpoint['id'] ) {
92
93 $this->method = isset( $endpoint['method'] ) && $endpoint['method'] != '' ? sanitize_text_field( $endpoint['method'] ) : 'GET';
94 $this->cache_time = isset( $endpoint['cache_time'] ) && ! empty( $endpoint['cache_time'] ) ? absint( $endpoint['cache_time'] ) : '';
95 $this->endpoint = isset( $endpoint['endpoint'] ) && ! empty( $endpoint['endpoint'] ) ? sanitize_text_field( $endpoint['endpoint'] ) : '';
96
97 $this->query_parameters = isset( $endpoint['query_parameters'] ) && ! empty( $endpoint['query_parameters'] ) ? $this->do_parameters( $endpoint['query_parameters'] ) : array();
98
99 $this->header_parameters = isset( $endpoint['header_parameters'] ) && ! empty( $endpoint['header_parameters'] ) ? $this->do_parameters( $endpoint['header_parameters'] ) : array();
100
101 $this->body_parameters = isset( $endpoint['body_parameters'] ) && ! empty( $endpoint['body_parameters'] ) ? $this->do_parameters( $endpoint['body_parameters'] ) : array();
102
103 $this->body_json_encode = isset( $endpoint['body_json_encode'] ) && $endpoint['body_json_encode'] == 'true' ? true : false;
104 $this->body_url_encode = isset( $endpoint['body_json_encode'] ) && $endpoint['body_json_encode'] == 'url' ? true : false;
105
106 $this->results_format = isset( $endpoint['results_format'] ) ? sanitize_text_field( $endpoint['results_format'] ) : $this->results_format;
107 }
108 }
109
110 $this->timeout = isset( $this->api['timeout'] ) && ! empty( $this->api['timeout'] ) ? $this->api['timeout'] : $this->timeout;
111 $this->sslverify = isset( $this->api['sslverify'] ) ? absint( $this->api['sslverify'] ) : $this->sslverify;
112
113 }
114
115
116 /**
117 * The main function to output the data
118 *
119 * @param string $field Field to retrieve
120 */
121 public function endpoint_output() {
122
123 do_action( 'wpgetapi_before_do_the_call', $this );
124
125 return $this->do_the_call();
126
127 }
128
129
130 /**
131 * Sort out the parameters if they exist
132 */
133 public function do_parameters( $parameters ) {
134
135 $new_array = array();
136 $parameters = $this->decrypt( $parameters );
137
138 if( is_array( $parameters ) ) {
139 foreach ( $parameters as $key => $parameter ) {
140 if( ! empty( $parameter['name'] ) && ! empty( $parameter['value'] ) ) {
141 $parameter['value'] = stripslashes( $parameter['value'] );
142 $new_array[ sanitize_text_field( $parameter['name'] ) ] = $parameter['value'];
143 }
144 }
145 }
146
147 // look for array or json string and sort these out - for using such things in shortcode
148 if( is_array( $new_array ) ) {
149
150 foreach ( $new_array as $key => $value ) {
151
152 // checking if the parameters have a json string
153 if ( substr( $value, 0, 1 ) === '{' && substr( $value, -1 ) === '}' ) {
154 $new_array[ $key ] = json_decode( $value, true );
155 }
156
157 // checking if the parameters have an array within the string
158 // if they do, create them as an actual array
159 if ( substr( $value, 0, 1 ) === '[' && substr( $value, -1 ) === ']' ) {
160 $value = trim( $value,"[]" );
161 $new_array[ $key ] = array( $value );
162
163 }
164
165 // set value as integer
166 if ( strpos( $value, 'integer(' ) !== false && substr( $value, -1 ) === ')' ) {
167 preg_match("/\(([^\)]*)\)/", $value, $match );
168 $result = $match[1];
169 $new_array[ $key ] = absint( $result );
170
171 }
172
173 // set value as float
174 if ( strpos( $value, 'float(' ) !== false && substr( $value, -1 ) === ')' ) {
175 preg_match("/\(([^\)]*)\)/", $value, $match );
176 $result = $match[1];
177 $new_array[ $key ] = (float) $result;
178
179 }
180
181 }
182
183 }
184
185 return $new_array;
186
187 }
188
189 /**
190 * Send the request and return our data
191 */
192 public function do_the_call() {
193
194 $this->init();
195
196 // build the URL
197 $this->final_url = apply_filters( 'wpgetapi_final_url', $this->build_url(), $this );
198
199 // build the request args
200 $this->final_request_args = apply_filters( 'wpgetapi_final_request_args', $this->build_request_args(), $this );
201
202 // POST request
203 if( $this->method == 'POST' )
204 $this->response = $this->POST_request();
205
206 // PUT request
207 if( $this->method == 'PUT' )
208 $this->response = $this->PUT_request();
209
210 // GET request
211 if( $this->method == 'GET' )
212 $this->response = $this->GET_request();
213
214 // DELETE request
215 if( $this->method == 'DELETE' )
216 $this->response = $this->DELETE_request();
217
218 // wp error
219 if( is_wp_error( $this->response ) ) {
220 return apply_filters( 'wpgetapi_raw_error_data', json_encode( $this->response ), $this );
221 }
222
223 // get response_code
224 $response_code = wp_remote_retrieve_response_code( $this->response );
225
226 // action to intercept call depending on response_code
227 $this->response = apply_filters( 'wpgetapi_before_retrieve_body', $this->response, $response_code, $this );
228
229 // get body
230 // modified in version 1.6.1 to allow for OAuth 2.0 plugin returning body already
231 $data = isset( $this->response['body'] ) ? $this->response['body'] : $this->response;
232
233 // returning in JSON format
234 if( $this->results_format == 'json_string' || $this->results_format == 'json_decoded' )
235 $data = $this->return_data( $data );
236
237 return apply_filters( 'wpgetapi_raw_data', $data, $this );
238
239 }
240
241
242 /**
243 * Build the request url with the ability to add args
244 */
245 public function build_url() {
246
247 // first make sure our endpoint starts with a slash
248 if ( substr( $this->endpoint, 0, 1 ) != '/' )
249 $this->endpoint = '/' . $this->endpoint;
250
251 $this->endpoint = apply_filters( 'wpgetapi_endpoint', $this->endpoint, $this );
252
253 $url = untrailingslashit( $this->base_url ) . $this->endpoint;
254
255 // filter our params - added for use in Oauth 2.0 plugin
256 $params = apply_filters( 'wpgetapi_query_parameters', $this->query_parameters, $this );
257
258 // add empty array - was getting errors if it was just null or false
259 $params = empty( $params ) ? array(''=>'') : $params;
260
261 return add_query_arg( $params, $url );
262
263 }
264
265
266 /**
267 * build the header with the ability to add args
268 */
269 public function build_request_args() {
270
271 // add our header parameters to the headers
272 $headers = apply_filters( 'wpgetapi_header_parameters', array(
273 'headers' => $this->header_parameters,
274 ), $this );
275
276
277 // if doing POST request, include body paramters
278 if( $this->method == 'POST' || $this->method == 'PUT' || $this->method == 'DELETE' ) {
279
280 $this->body_parameters = apply_filters( 'wpgetapi_body_parameters', $this->body_parameters, $this );
281
282 // do we json_encode the entire body as a string
283 if( $this->body_json_encode == true ) {
284 $this->body_parameters = json_encode( $this->body_parameters );
285 }
286
287
288 // do we urlencode the entire body as a string
289 if( $this->body_url_encode == true ) {
290 $data_raw = '';
291 foreach ($this->body_parameters as $key => $value){
292 $data_raw = $data_raw . $key . "=" . urlencode($value) . "&";
293 }
294 $this->body_parameters = $data_raw;
295 }
296
297 // add our body parameters
298 if( $this->body_parameters && ! empty( $this->body_parameters ) )
299 $headers['body'] = $this->body_parameters;
300
301 }
302
303 // add headers to our final request args
304 $this->final_request_args = wp_parse_args( $headers, $this->final_request_args );
305
306 // build the args taht are sent to the request
307 $default_args = apply_filters( 'wpgetapi_default_request_args_parameters', array(
308 'timeout' => $this->timeout,
309 'sslverify' => $this->sslverify,
310 'redirection' => 5,
311 'blocking' => true,
312 'cookies' => array(),
313 ) );
314
315 return wp_parse_args( $this->final_request_args, $default_args );
316
317 }
318
319
320 /**
321 * Do a GET request
322 */
323 public function GET_request() {
324 $response = '';
325 // so we can so something before the remote_get (caching)
326 $response = apply_filters( 'wpgetapi_before_get_request', $response, $this );
327 if( empty( $response ) )
328 $response = wp_remote_get( $this->final_url, $this->final_request_args );
329
330 return $response;
331 }
332
333 /**
334 * Do a POST request
335 */
336 public function POST_request() {
337 $response = wp_remote_post( $this->final_url, $this->final_request_args );
338 return $response;
339 }
340
341 /**
342 * Do a PUT request
343 */
344 public function PUT_request() {
345 $this->final_request_args['method'] = 'PUT';
346 $response = wp_remote_request( $this->final_url, $this->final_request_args );
347 return $response;
348 }
349
350 /**
351 * Do a DELETE request
352 */
353 public function DELETE_request() {
354 $this->final_request_args['method'] = 'DELETE';
355 $response = wp_remote_request( $this->final_url, $this->final_request_args );
356 return $response;
357 }
358
359
360 /**
361 * return data
362 */
363 public function return_data( $data ) {
364
365 $data = apply_filters( 'wpgetapi_json_response_body_before_decode', $data, $this->keys );
366
367 // converts all data to arrays, removing objects
368 if( is_string( $data ) )
369 $data = json_decode( $data, true );
370
371 $data = apply_filters( 'wpgetapi_json_response_body', $data, $this->keys );
372
373 if( $this->results_format == 'json_string' )
374 return trim( json_encode( $data ),'"');
375
376 if( $this->results_format == 'json_decoded' )
377 return $data;
378
379 }
380
381
382 /**
383 * decrypt our parameters from the DB
384 */
385 public function decrypt( $array_or_string ) {
386
387 if( is_string($array_or_string) ){
388 $array_or_string = $this->encryption->decrypt($array_or_string);
389 }elseif( is_array($array_or_string) ){
390 foreach ( $array_or_string as $key => &$value ) {
391 if( $key === 'name' )
392 continue;
393 if ( is_array( $value ) ) {
394 $value = $this->decrypt($value);
395 }
396 else {
397 $value = $this->encryption->decrypt($value);
398
399 }
400 }
401 }
402 return $array_or_string;
403 }
404
405
406 /**
407 * debug
408 */
409 public function maybe_add_debug_info( $data, $wpgetapi ) {
410
411 if(
412 ( isset( $this->args['debug'] ) && ( $this->args['debug'] === true || $this->args['debug'] === 'true' ) ) ||
413 ( isset( $this->args['test_endpoint'] ) && ( $this->args['test_endpoint'] === true ) )
414 ) {
415
416 $this->debug = true;
417
418 $testing = isset( $this->args['test_endpoint'] ) && ( $this->args['test_endpoint'] === true ) ? true : false;
419
420 ob_start(); ?>
421
422 <style>
423
424 .wpgetapi-debug {
425 background: #fff;
426 padding: 20px;
427 box-shadow: 0 0 1px #aaa;
428 margin: 20px;
429 font-size: 15px;
430 }
431 .wpgetapi-debug
432 .wpgetapi-debug p
433 .wpgetapi-debug h5
434 .wpgetapi-debug h6 {
435 color: #000;
436 line-height: 1 !important;
437 text-transform: none !important;
438 font-family: sans-serif !important;
439 letter-spacing: 0px !important;
440 }
441 .wpgetapi-debug p.small {
442 font-size: 85%;
443 color: #999;
444 margin: 0 0 12px !important;
445 }
446 .wpgetapi-debug h5 {
447 font-weight: bold;
448 font-size: 18px;
449 margin: 0 0 3px;
450 text-transform: none !important;
451 }
452 .wpgetapi-debug .debug-item {
453 margin: 10px 0;
454 background: #fff;
455 padding: 15px 20px;
456 display: inline-block !important;
457 width: 100% !important;
458 box-shadow: 3px 3px 0 rgb(0 0 0 / 8%);
459 border: 1px solid #efefef;
460 }
461 .wpgetapi-debug .debug-item h6 {
462 font-weight: bold;
463 font-size: 14px;
464 margin: 0;
465 text-transform: none !important;
466 }
467 .wpgetapi-debug .debug-item .debug-result,
468 .wpgetapi-debug .debug-item .debug-result pre {
469 font-family: monospace !important;
470 font-size: 13px !important;
471 margin: 0 !important;
472 padding: 8px 12px;
473 background: #f8f8f8;
474 }
475 .wpgetapi-debug .debug-item .debug-result pre {
476 border: none;
477 padding: 5px
478 }
479
480 .wpgetapi-debug.testing {
481 background: transparent;
482 padding: 0;
483 box-shadow: none;
484 }
485 .wpgetapi-debug.testing .debug-item {
486 margin: 5px 0;
487 }
488 </style>
489
490 <div class="wpgetapi-debug <?php echo $testing ? 'testing' : ''; ?>">
491
492 <?php if( $testing ) { ?>
493
494 <div class="debug-item">
495 <h6><?php esc_html_e( 'Full URL', 'wpgetapi' ); ?></h6>
496 <p class="small"><?php esc_html_e( 'The full URL that is being called.', 'wpgetapi' ); ?></p>
497 <div class="debug-result"><?php esc_html_e( $this->final_url ); ?></div>
498 </div>
499
500 <div class="debug-item">
501 <h6><?php esc_html_e( 'Data Output', 'wpgetapi' ); ?></h6>
502 <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>
503 <p class="small"><?php esc_html_e( 'See the ', 'wpgetapi' ); ?> <a target="_blank" href="https://wpgetapi.com/docs/?utm_campaign=Test Endpoint&utm_medium=Admin&utm_source=User"><?php esc_html_e( 'documentation', 'wpgetapi' ); ?></a> <?php esc_html_e( ' for help in formatting.', 'wpgetapi' ); ?></p>
504 <div class="debug-result"><?php wpgetapi_pp( $data ); ?></div>
505 </div>
506
507 <div class="debug-item">
508 <h6><?php esc_html_e( 'Response', 'wpgetapi' ); ?></h6>
509 <p class="small"><?php esc_html_e( 'The full response from the API request.', 'wpgetapi' ); ?></p>
510 <div class="debug-result"><?php wpgetapi_pp( $this->response); ?></div>
511 </div>
512
513 <?php } else { ?>
514
515 <h5><strong><?php esc_html_e( 'WPGetAPI, Debug Mode - Plugin Version', 'wpgetapi' ); ?> <?php esc_html_e( WpGetApi()->version ); ?></strong></h5>
516 <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>
517
518 <div class="debug-item">
519 <h6><?php esc_html_e( 'Full URL', 'wpgetapi' ); ?></h6>
520 <p class="small"><?php esc_html_e( 'The full URL that is being called.', 'wpgetapi' ); ?></p>
521 <div class="debug-result"><?php esc_html_e( $this->final_url ); ?></div>
522 </div>
523
524 <div class="debug-item">
525 <h6><?php esc_html_e( 'Data Output', 'wpgetapi' ); ?></h6>
526 <p class="small"><?php esc_html_e( 'The resulting output that has been returned from the API.', 'wpgetapi' ); ?></p>
527 <div class="debug-result"><?php wpgetapi_pp( $data ); ?></div>
528 </div>
529
530 <div class="debug-item">
531 <h6><?php esc_html_e( 'Query String', 'wpgetapi' ); ?></h6>
532 <p class="small"><?php esc_html_e( 'The query string parameters (if any) that you have set within the endpoint settings.', 'wpgetapi' ); ?></p>
533 <div class="debug-result"><?php wpgetapi_pp( $this->query_parameters ); ?></div>
534 </div>
535
536 <div class="debug-item">
537 <h6><?php esc_html_e( 'Headers', 'wpgetapi' ); ?></h6>
538 <p class="small"><?php esc_html_e( 'The header parameters (if any) that you have set within the endpoint settings.', 'wpgetapi' ); ?></p>
539 <div class="debug-result"><?php wpgetapi_pp( $this->header_parameters ); ?></div>
540 </div>
541
542 <div class="debug-item">
543 <h6><?php esc_html_e( 'Body', 'wpgetapi' ); ?></h6>
544 <p class="small"><?php esc_html_e( 'The body parameters (if any) that you have set within the endpoint settings.', 'wpgetapi' ); ?></p>
545 <div class="debug-result"><?php wpgetapi_pp( $this->body_parameters ); ?></div>
546 </div>
547
548 <div class="debug-item">
549 <h6><?php esc_html_e( 'Final Request Arguments', 'wpgetapi' ); ?></h6>
550 <p class="small"><?php esc_html_e( 'The final request arguments sent in the API request. Includes headers and body arguments.', 'wpgetapi' ); ?></p>
551 <div class="debug-result"><?php wpgetapi_pp( $this->final_request_args ); ?></div>
552 </div>
553
554 <div class="debug-item">
555 <h6><?php esc_html_e( 'Arguments', 'wpgetapi' ); ?></h6>
556 <p class="small"><?php esc_html_e( 'The arguments set within your shortcode or template tag.', 'wpgetapi' ); ?></p>
557 <div class="debug-result"><?php wpgetapi_pp( $this->args ); ?></div>
558 </div>
559
560 <div class="debug-item">
561 <h6><?php esc_html_e( 'Response', 'wpgetapi' ); ?></h6>
562 <p class="small"><?php esc_html_e( 'The full response from the API request.', 'wpgetapi' ); ?></p>
563 <div class="debug-result"><?php wpgetapi_pp( $this->response); ?></div>
564 </div>
565
566 <?php } ?>
567
568 </div>
569
570 <?php
571
572 return ob_get_clean();
573
574 } else {
575
576 return $data;
577
578 }
579
580 }
581
582
583 }