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

391 lines 13.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 = ''; // 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 $array[ sanitize_text_field( $parameter['name'] ) ] = sanitize_text_field( $parameter['value'] );
134 }
135 }
136
137 return $array;
138
139 }
140
141 /**
142 * Send the request and return our data
143 */
144 public function do_the_call() {
145
146 $this->init();
147
148 // build the URL
149 $this->final_url = apply_filters( 'wpgetapi_final_url', $this->build_url(), $this );
150
151 // build the request args
152 $this->final_request_args = apply_filters( 'wpgetapi_final_request_args', $this->build_request_args(), $this );
153
154 // POST request
155 if( $this->method == 'POST' )
156 $this->response = $this->POST_request();
157
158 // GET request
159 if( $this->method == 'GET' )
160 $this->response = $this->GET_request();
161
162 // wp error
163 if( is_wp_error( $this->response ) ) {
164 return apply_filters( 'wpgetapi_raw_data', json_encode( $this->response ), $this );
165 }
166
167 $data = wp_remote_retrieve_body( $this->response );
168
169 // returning in JSON format
170 if( $this->results_format == 'json_string' || $this->results_format == 'json_decoded' )
171 $data = $this->output_json( $data );
172
173 return apply_filters( 'wpgetapi_raw_data', $data, $this );
174
175 }
176
177
178 /**
179 * Build the request url with the ability to add args
180 */
181 public function build_url() {
182
183 // first make sure our endpoint starts with a slash
184 if ( substr( $this->endpoint, 0, 1 ) != '/' )
185 $this->endpoint = '/' . $this->endpoint;
186
187 $url = untrailingslashit( $this->base_url ) . $this->endpoint;
188
189 // add empty array - was getting errors if it was just null or false
190 $params = empty( $this->query_parameters ) ? array(''=>'') : $this->query_parameters;
191
192 return add_query_arg( $params, $url );
193
194 }
195
196
197 /**
198 * build the header with the ability to add args
199 */
200 public function build_request_args() {
201
202 if( $this->method == 'POST' ) {
203
204 if( isset( $this->body_parameters ) && $this->body_parameters != '' ) {
205
206 foreach ($this->body_parameters as $key => $value ) {
207
208 // checking if the body parameters have a json string
209 if ( substr( $value, 0, 1 ) === '{' && substr( $value, -1 ) === '}' ) {
210 $this->body_parameters[ $key ] = json_decode( $value, true);
211 }
212
213 // checking if the body parameters have an array within the string
214 // if they do, create them as an actual array
215 if ( substr( $value, 0, 1 ) === '[' && substr( $value, -1 ) === ']' ) {
216 $this->body_parameters[ $key ] = array( $value );
217 }
218
219 }
220
221 // do we json_encode the entire body as a string
222 if( $this->body_json_encode === true || $this->body_json_encode === 'true' )
223 $this->body_parameters = json_encode( $this->body_parameters );
224
225 $body = apply_filters( 'wpgetapi_body_parameters', array(
226 'body' => $this->body_parameters,
227 ) );
228
229 $this->final_request_args = wp_parse_args( $body, $this->final_request_args );
230 }
231
232 }
233
234 if( isset( $this->header_parameters ) && $this->header_parameters != '' ) {
235
236 foreach ($this->header_parameters as $key => $value ) {
237
238 // checking if the body parameters have a json string
239 if ( substr( $value, 0, 1 ) === '{' && substr( $value, -1 ) === '}' ) {
240 $this->header_parameters[ $key ] = json_decode( $value, true);
241 }
242
243 // checking if the body parameters have an array within the string
244 // if they do, create them as an actual array
245 if ( substr( $value, 0, 1 ) === '[' && substr( $value, -1 ) === ']' ) {
246 $this->header_parameters[ $key ] = array( $value );
247 }
248
249 }
250
251 $headers = apply_filters( 'wpgetapi_header_parameters', array(
252 'headers' => $this->header_parameters,
253 ) );
254
255 $this->final_request_args = wp_parse_args( $headers, $this->final_request_args );
256 }
257
258
259
260 // build the args taht are sent to the request
261 $default_args = apply_filters( 'wpgetapi_default_request_args_parameters', array(
262 'timeout' => $this->timeout,
263 'sslverify' => $this->sslverify,
264 'redirection' => 5,
265 'blocking' => true,
266 'cookies' => array(),
267 ) );
268
269 return wp_parse_args( $this->final_request_args, $default_args );
270
271 }
272
273
274 /**
275 * Do a GET request
276 */
277 public function GET_request() {
278 $response = '';
279 // so we can so something before the remote_get (caching)
280 $response = apply_filters( 'wpgetapi_before_get_request', $response, $this );
281 if( empty( $response ) )
282 $response = wp_remote_get( $this->final_url, $this->final_request_args );
283
284 return $response;
285 }
286
287
288 /**
289 * Do a POST request
290 */
291 public function POST_request() {
292 $response = wp_remote_post( $this->final_url, $this->final_request_args );
293 return $response;
294 }
295
296
297 /**
298 * return JSON data
299 */
300 public function output_json( $data ) {
301
302 // converts all data to arrays, removing objects
303 $data = json_decode( $data, true );
304 $data = apply_filters( 'wpgetapi_json_response_body', $data, $this->keys );
305
306 if( $this->results_format == 'json_string' )
307 return json_encode( $data );
308
309 if( $this->results_format == 'json_decoded' )
310 return $data;
311
312 }
313
314
315 /**
316 * decrypt our parameters from the DB
317 */
318 public function decrypt( $array_or_string ) {
319
320 if( is_string($array_or_string) ){
321 $array_or_string = $this->encryption->decrypt($array_or_string);
322 }elseif( is_array($array_or_string) ){
323 foreach ( $array_or_string as $key => &$value ) {
324 if( $key === 'name' )
325 continue;
326 if ( is_array( $value ) ) {
327 $value = $this->decrypt($value);
328 }
329 else {
330 $value = $this->encryption->decrypt($value);
331
332 }
333 }
334 }
335 return $array_or_string;
336 }
337
338
339 /**
340 * debug
341 */
342 public function maybe_add_debug_info( $data, $this_data ) {
343
344 if( isset( $this->args['debug'] ) && ( $this->args['debug'] === true || $this->args['debug'] === 'true' ) ) {
345
346 ob_start(); ?>
347
348 <div class="wpgetapi-debug" style="background:#efefef; padding:20px; border:1px solid #ccc; ">
349
350 <p style="margin-bottom:5px"><strong>WPGetAPI, Debug Mode - Plugin Version <?php esc_html_e( WpGetApi()->version ); ?></strong></p>
351 <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>
352
353 <strong>Final URL</strong><br>
354 <?php esc_html_e( $this->final_url ); ?><br><br>
355
356 <strong>Data Output</strong><br>
357 <?php wpgetapi_pp( $data ); ?>
358
359 <strong>Args</strong><br>
360 <?php wpgetapi_pp( $this->args ); ?>
361
362 <strong>Query Parameters</strong><br>
363 <?php wpgetapi_pp( $this->query_parameters ); ?>
364
365 <strong>Header Paramaters</strong><br>
366 <?php wpgetapi_pp( $this->header_parameters ); ?>
367
368 <strong>Request Args</strong><br>
369 <?php wpgetapi_pp( $this->final_request_args ); ?>
370
371 <strong>Response</strong><br>
372 <?php wpgetapi_pp($this->response); ?>
373
374 </div>
375
376 <?php
377
378 return ob_get_clean();
379
380 } else {
381
382 return $data;
383
384 }
385
386
387
388 }
389
390
391 }