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

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