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

393 lines 13.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 = ''; // the body_json_encode
31
32 public $response = ''; // the returned response
33
34 public $final_url = ''; // final URL
35 public $final_request_args = array(); // final request_args
36
37 public $results_format = 'json_string'; // reseults format
38
39 public $timeout = 10; // the timeout
40 public $sslverify = 1; // the paramaters
41
42
43 /**
44 * Main constructor
45 *
46 * @since 1.0.0
47 *
48 */
49 public function __construct( $api_id = '', $endpoint_id = '', $args = array(), $keys = array() ) {
50
51 $this->setup = get_option( 'wpgetapi_setup' );
52 $this->api = get_option( 'wpgetapi_' . $api_id );
53
54 $this->encryption = new WpGetApi_Encryption();
55 $this->api_id = sanitize_text_field( $api_id );
56 $this->endpoint_id = sanitize_text_field( $endpoint_id );
57 $this->keys = $keys;
58 $this->args = $args;
59
60 add_filter( 'wpgetapi_raw_data', array( $this, 'maybe_add_debug_info' ), 5, 2 );
61
62 }
63
64
65 /**
66 * Init our api data
67 */
68 public function init() {
69
70 // do some checks
71 if( empty( $this->setup ) || ! isset( $this->setup['apis'] ) || empty( $this->setup['apis'] ) )
72 return 'No API found.';
73
74 // do some checks
75 if( ! $this->api || ! isset( $this->api['endpoints'] ) || empty( $this->api['endpoints'] ))
76 return 'API not found.';
77
78 // loop through api's
79 // set base_url
80 foreach ( $this->setup['apis'] as $index => $api_item ) {
81 if( $this->api_id == $api_item['id'] ) {
82 $this->base_url = isset( $api_item['base_url'] ) && ! empty( $api_item['base_url'] ) ? esc_url_raw( $api_item['base_url'] ) : '';
83 }
84 }
85
86 // loop through endpoints
87 foreach ( $this->api['endpoints'] as $index => $endpoint ) {
88
89 if( $this->endpoint_id == $endpoint['id'] ) {
90
91 $this->method = isset( $endpoint['method'] ) && $endpoint['method'] != '' ? sanitize_text_field( $endpoint['method'] ) : 'GET';
92 $this->cache_time = isset( $endpoint['cache_time'] ) && ! empty( $endpoint['cache_time'] ) ? absint( $endpoint['cache_time'] ) : '';
93 $this->endpoint = isset( $endpoint['endpoint'] ) && ! empty( $endpoint['endpoint'] ) ? sanitize_text_field( $endpoint['endpoint'] ) : '';
94
95 $this->query_parameters = isset( $endpoint['query_parameters'] ) && ! empty( $endpoint['query_parameters'] ) ? $this->do_parameters( $endpoint['query_parameters'] ) : array();
96
97 $this->header_parameters = isset( $endpoint['header_parameters'] ) && ! empty( $endpoint['header_parameters'] ) ? $this->do_parameters( $endpoint['header_parameters'] ) : array();
98
99 $this->body_parameters = isset( $endpoint['body_parameters'] ) && ! empty( $endpoint['body_parameters'] ) ? $this->do_parameters( $endpoint['body_parameters'] ) : array();
100
101 $this->body_json_encode = isset( $endpoint['body_json_encode'] ) && ! empty( $endpoint['body_json_encode'] ) ? sanitize_text_field( $endpoint['body_json_encode'] ) : true;
102 $this->results_format = isset( $endpoint['results_format'] ) ? sanitize_text_field( $endpoint['results_format'] ) : $this->results_format;
103 }
104 }
105
106 $this->timeout = isset( $this->api['timeout'] ) && ! empty( $this->api['timeout'] ) ? $this->api['timeout'] : $this->timeout;
107 $this->sslverify = isset( $this->api['sslverify'] ) ? absint( $this->api['sslverify'] ) : $this->sslverify;
108
109 }
110
111
112 /**
113 * The main function to output the data
114 *
115 * @param string $field Field to retrieve
116 */
117 public function endpoint_output() {
118 return $this->do_the_call();
119 }
120
121
122 /**
123 * Sort out the parameters if they exist
124 */
125 public function do_parameters( $parameters ) {
126
127 $array = array();
128 $parameters = $this->decrypt($parameters);
129
130 if( is_array( $parameters ) ) {
131 foreach ( $parameters as $key => $parameter ) {
132 if( ! empty( $parameter['name'] ) && ! empty( $parameter['value'] ) ) {
133 $parameter['value'] = stripslashes( $parameter['value'] );
134 $array[ sanitize_text_field( $parameter['name'] ) ] = $parameter['value'];
135 }
136 }
137 }
138
139 return $array;
140
141 }
142
143 /**
144 * Send the request and return our data
145 */
146 public function do_the_call() {
147
148 $this->init();
149
150 // build the URL
151 $this->final_url = apply_filters( 'wpgetapi_final_url', $this->build_url(), $this );
152
153 // build the request args
154 $this->final_request_args = apply_filters( 'wpgetapi_final_request_args', $this->build_request_args(), $this );
155
156 // POST request
157 if( $this->method == 'POST' )
158 $this->response = $this->POST_request();
159
160 // GET request
161 if( $this->method == 'GET' )
162 $this->response = $this->GET_request();
163
164 // wp error
165 if( is_wp_error( $this->response ) ) {
166 return apply_filters( 'wpgetapi_raw_data', json_encode( $this->response ), $this );
167 }
168
169 $data = wp_remote_retrieve_body( $this->response );
170
171 // returning in JSON format
172 if( $this->results_format == 'json_string' || $this->results_format == 'json_decoded' )
173 $data = $this->output_json( $data );
174
175 return apply_filters( 'wpgetapi_raw_data', $data, $this );
176
177 }
178
179
180 /**
181 * Build the request url with the ability to add args
182 */
183 public function build_url() {
184
185 // first make sure our endpoint starts with a slash
186 if ( substr( $this->endpoint, 0, 1 ) != '/' )
187 $this->endpoint = '/' . $this->endpoint;
188
189 $url = untrailingslashit( $this->base_url ) . $this->endpoint;
190
191 // add empty array - was getting errors if it was just null or false
192 $params = empty( $this->query_parameters ) ? array(''=>'') : $this->query_parameters;
193
194 return add_query_arg( $params, $url );
195
196 }
197
198
199 /**
200 * build the header with the ability to add args
201 */
202 public function build_request_args() {
203
204 if( $this->method == 'POST' ) {
205
206 if( isset( $this->body_parameters ) && $this->body_parameters != '' ) {
207
208 foreach ($this->body_parameters as $key => $value ) {
209
210 // checking if the body parameters have a json string
211 if ( substr( $value, 0, 1 ) === '{' && substr( $value, -1 ) === '}' ) {
212 $this->body_parameters[ $key ] = json_decode( $value, true);
213 }
214
215 // checking if the body parameters have an array within the string
216 // if they do, create them as an actual array
217 if ( substr( $value, 0, 1 ) === '[' && substr( $value, -1 ) === ']' ) {
218 $this->body_parameters[ $key ] = array( $value );
219 }
220
221 }
222
223 // do we json_encode the entire body as a string
224 if( $this->body_json_encode === true || $this->body_json_encode === 'true' )
225 $this->body_parameters = json_encode( $this->body_parameters );
226
227 $body = apply_filters( 'wpgetapi_body_parameters', array(
228 'body' => $this->body_parameters,
229 ) );
230
231 $this->final_request_args = wp_parse_args( $body, $this->final_request_args );
232 }
233
234 }
235
236 if( isset( $this->header_parameters ) && $this->header_parameters != '' ) {
237
238 foreach ($this->header_parameters as $key => $value ) {
239
240 // checking if the body parameters have a json string
241 if ( substr( $value, 0, 1 ) === '{' && substr( $value, -1 ) === '}' ) {
242 $this->header_parameters[ $key ] = json_decode( $value, true);
243 }
244
245 // checking if the body parameters have an array within the string
246 // if they do, create them as an actual array
247 if ( substr( $value, 0, 1 ) === '[' && substr( $value, -1 ) === ']' ) {
248 $this->header_parameters[ $key ] = array( $value );
249 }
250
251 }
252
253 $headers = apply_filters( 'wpgetapi_header_parameters', array(
254 'headers' => $this->header_parameters,
255 ) );
256
257 $this->final_request_args = wp_parse_args( $headers, $this->final_request_args );
258 }
259
260
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 JSON data
301 */
302 public function output_json( $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 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 <div class="wpgetapi-debug" style="background:#efefef; padding:20px; border:1px solid #ccc; ">
351
352 <p style="margin-bottom:5px"><strong>WPGetAPI, Debug Mode - Plugin Version <?php esc_html_e( WpGetApi()->version ); ?></strong></p>
353 <p style="font-size:80%;margin-bottom:20px"><i>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.</i></p>
354
355 <strong>Final URL</strong><br>
356 <?php esc_html_e( $this->final_url ); ?><br><br>
357
358 <strong>Data Output</strong><br>
359 <?php wpgetapi_pp( $data ); ?>
360
361 <strong>Args</strong><br>
362 <?php wpgetapi_pp( $this->args ); ?>
363
364 <strong>Query Parameters</strong><br>
365 <?php wpgetapi_pp( $this->query_parameters ); ?>
366
367 <strong>Header Paramaters</strong><br>
368 <?php wpgetapi_pp( $this->header_parameters ); ?>
369
370 <strong>Request Args</strong><br>
371 <?php wpgetapi_pp( $this->final_request_args ); ?>
372
373 <strong>Response</strong><br>
374 <?php wpgetapi_pp($this->response); ?>
375
376 </div>
377
378 <?php
379
380 return ob_get_clean();
381
382 } else {
383
384 return $data;
385
386 }
387
388
389
390 }
391
392
393 }