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

477 lines 16.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 $data = wp_remote_retrieve_body( $this->response );
193
194 // returning in JSON format
195 if( $this->results_format == 'json_string' || $this->results_format == 'json_decoded' )
196 $data = $this->return_data( $data );
197
198 return apply_filters( 'wpgetapi_raw_data', $data, $this );
199
200 }
201
202
203 /**
204 * Build the request url with the ability to add args
205 */
206 public function build_url() {
207
208 // first make sure our endpoint starts with a slash
209 if ( substr( $this->endpoint, 0, 1 ) != '/' )
210 $this->endpoint = '/' . $this->endpoint;
211
212 $url = untrailingslashit( $this->base_url ) . $this->endpoint;
213
214 // add empty array - was getting errors if it was just null or false
215 $params = empty( $this->query_parameters ) ? array(''=>'') : $this->query_parameters;
216
217 return add_query_arg( $params, $url );
218
219 }
220
221
222 /**
223 * build the header with the ability to add args
224 */
225 public function build_request_args() {
226
227 // add our header parameters to the headers
228 $headers = apply_filters( 'wpgetapi_header_parameters', array(
229 'headers' => $this->header_parameters,
230 ), $this );
231
232
233 // if doing POST request, include body paramters
234 if( $this->method == 'POST' ) {
235
236 $this->body_parameters = apply_filters( 'wpgetapi_body_parameters', $this->body_parameters, $this );
237
238 // do we json_encode the entire body as a string
239 if( $this->body_json_encode == true )
240 $this->body_parameters = json_encode( $this->body_parameters );
241
242
243 // do we urlencode the entire body as a string
244 if( $this->body_url_encode == true ) {
245 $data_raw = '';
246 foreach ($this->body_parameters as $key => $value){
247 $data_raw = $data_raw . $key . "=" . urlencode($value) . "&";
248 }
249 $this->body_parameters = $data_raw;
250
251 }
252
253 // add our body parameters
254 if( $this->body_parameters && ! empty( $this->body_parameters ) )
255 $headers['body'] = $this->body_parameters;
256
257 }
258
259 // add headers to our final request args
260 $this->final_request_args = wp_parse_args( $headers, $this->final_request_args );
261
262 // build the args taht are sent to the request
263 $default_args = apply_filters( 'wpgetapi_default_request_args_parameters', array(
264 'timeout' => $this->timeout,
265 'sslverify' => $this->sslverify,
266 'redirection' => 5,
267 'blocking' => true,
268 'cookies' => array(),
269 ) );
270
271 return wp_parse_args( $this->final_request_args, $default_args );
272
273 }
274
275
276 /**
277 * Do a GET request
278 */
279 public function GET_request() {
280 $response = '';
281 // so we can so something before the remote_get (caching)
282 $response = apply_filters( 'wpgetapi_before_get_request', $response, $this );
283 if( empty( $response ) )
284 $response = wp_remote_get( $this->final_url, $this->final_request_args );
285
286 return $response;
287 }
288
289
290 /**
291 * Do a POST request
292 */
293 public function POST_request() {
294 $response = wp_remote_post( $this->final_url, $this->final_request_args );
295 return $response;
296 }
297
298
299 /**
300 * return data
301 */
302 public function return_data( $data ) {
303
304 // converts all data to arrays, removing objects
305 $data = json_decode( $data, true );
306 $data = apply_filters( 'wpgetapi_json_response_body', $data, $this->keys );
307
308 if( $this->results_format == 'json_string' )
309 return trim( json_encode( $data ),'"');
310
311 if( $this->results_format == 'json_decoded' )
312 return $data;
313
314 }
315
316
317 /**
318 * decrypt our parameters from the DB
319 */
320 public function decrypt( $array_or_string ) {
321
322 if( is_string($array_or_string) ){
323 $array_or_string = $this->encryption->decrypt($array_or_string);
324 }elseif( is_array($array_or_string) ){
325 foreach ( $array_or_string as $key => &$value ) {
326 if( $key === 'name' )
327 continue;
328 if ( is_array( $value ) ) {
329 $value = $this->decrypt($value);
330 }
331 else {
332 $value = $this->encryption->decrypt($value);
333
334 }
335 }
336 }
337 return $array_or_string;
338 }
339
340
341 /**
342 * debug
343 */
344 public function maybe_add_debug_info( $data, $this_data ) {
345
346 if( isset( $this->args['debug'] ) && ( $this->args['debug'] === true || $this->args['debug'] === 'true' ) ) {
347
348 ob_start(); ?>
349
350 <style>
351
352 .wpgetapi-debug {
353 background: #f4f4f4;
354 padding: 20px;
355 border: 1px solid #ccc;
356 margin: 20px;
357 font-size: 15px;
358 }
359 .wpgetapi-debug
360 .wpgetapi-debug p
361 .wpgetapi-debug h5
362 .wpgetapi-debug h6 {
363 color: #000;
364 line-height: 1 !important;
365 text-transform: none !important;
366 font-family: sans-serif !important;
367 letter-spacing: 0px !important;
368 }
369 .wpgetapi-debug p.small {
370 font-size: 85%;
371 color: #999;
372 margin-bottom: 15px !important
373 }
374 .wpgetapi-debug h5 {
375 font-weight: bold;
376 font-size: 18px;
377 margin: 0 0 3px;
378 text-transform: none !important;
379 }
380 .wpgetapi-debug .debug-item {
381 margin: 10px 0;
382 background: #fff;
383 padding: 15px 20px;
384 display: inline-block !important;;
385 width: 100% !important;
386 box-shadow: 0 0 5px rgba(0,0,0,0.1)
387 }
388 .wpgetapi-debug .debug-item h6 {
389 font-weight: bold;
390 font-size: 16px;
391 margin: 0 0 3px;
392 text-transform: none !important;
393 }
394 .wpgetapi-debug .debug-item .debug-result,
395 .wpgetapi-debug .debug-item .debug-result pre {
396 font-family: monospace !important;
397 font-size: 15px !important;
398 margin: 0 !important;
399 padding: 10px 12px;
400 background: #f8f8f8;
401 }
402 .wpgetapi-debug .debug-item .debug-result pre {
403 border: none;
404 padding: 5px
405 }
406
407 </style>
408
409 <div class="wpgetapi-debug">
410
411 <h5><strong>WPGetAPI, Debug Mode - Plugin Version <?php esc_html_e( WpGetApi()->version ); ?></strong></h5>
412 <p class="small">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.<br>Connecting to API's can be tricky - if you require help, please see the <a target="_blank" href="https://wpgetapi.com/docs/">Documentation</a> and if you can't find the answer then please use the contact form on our <a target="_blank" title="Connect WordPress with external API" href="https://wpgetapi.com/">website</a> to get assistance.</p>
413
414 <div class="debug-item">
415 <h6>Full URL</h6>
416 <p class="small">The full URL that is being called.</p>
417 <div class="debug-result"><?php esc_html_e( $this->final_url ); ?></div>
418 </div>
419
420 <div class="debug-item">
421 <h6>Data Output</h6>
422 <p class="small">The resulting output that has been returned from the API.</p>
423 <div class="debug-result"><?php wpgetapi_pp( $data ); ?></div>
424 </div>
425
426 <div class="debug-item">
427 <h6>Arguments</h6>
428 <p class="small">The arguments set within your shortcode or template tag.</p>
429 <div class="debug-result"><?php wpgetapi_pp( $this->args ); ?></div>
430 </div>
431
432 <div class="debug-item">
433 <h6>Query String</h6>
434 <p class="small">The query string parameters (if any) that you have set within the endpoint settings.</p>
435 <div class="debug-result"><?php wpgetapi_pp( $this->query_parameters ); ?></div>
436 </div>
437
438 <div class="debug-item">
439 <h6>Headers</h6>
440 <p class="small">The headers parameters (if any) that you have set within the endpoint settings.</p>
441 <div class="debug-result"><?php wpgetapi_pp( $this->header_parameters ); ?></div>
442 </div>
443
444 <div class="debug-item">
445 <h6>Body</h6>
446 <p class="small">The body parameters (if any) that you have set within the endpoint settings.</p>
447 <div class="debug-result"><?php wpgetapi_pp( $this->body_parameters ); ?></div>
448 </div>
449
450 <div class="debug-item">
451 <h6>Final Request Arguments</h6>
452 <p class="small">The final request arguments sent in the API request. Includes headers and body arguments.</p>
453 <div class="debug-result"><?php wpgetapi_pp( $this->final_request_args ); ?></div>
454 </div>
455
456 <div class="debug-item">
457 <h6>Response</h6>
458 <p class="small">The full response from the API request.</p>
459 <div class="debug-result"><?php wpgetapi_pp( $this->response); ?></div>
460 </div>
461
462 </div>
463
464 <?php
465
466 return ob_get_clean();
467
468 } else {
469
470 return $data;
471
472 }
473
474 }
475
476
477 }