PluginProbe
WPGet API – Connect to any external REST API / 2.2.1
WPGet API – Connect to any external REST API v2.2.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-admin-options.php

class-admin-options.php in WPGet API – Connect to any external REST API 2.2.1, at includes/class-admin-options.php

1,028 lines 32.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Settings Required
4 *
5 */
6
7 // Exit if accessed directly.
8 if ( ! defined( 'ABSPATH' ) ) exit;
9
10 if ( ! class_exists( 'WpGetApi_Admin_Options' ) ) :
11
12 /**
13 * CMB2 Theme Options
14 * @version 0.1.0
15 */
16 class WpGetApi_Admin_Options {
17
18 /**
19 * Array of metaboxes/fields
20 * @var array
21 */
22 public $option_metabox = array();
23
24 /**
25 * Array of metaboxes/fields
26 * @var array
27 */
28 public $metabox_id = '';
29
30 /**
31 * Options Page title
32 * @var string
33 */
34 protected $title = '';
35
36 /**
37 * Options Page title
38 * @var string
39 */
40 protected $menu_title = '';
41
42 /**
43 * Options Tab Pages
44 * @var array
45 */
46 public $options_pages = array();
47
48 /**
49 * Is pro plugin installed
50 * @var array
51 */
52 public $pro_plugin = false;
53
54 /**
55 * Holds an instance of the object
56 *
57 * @var Myprefix_Admin
58 **/
59 private static $instance = null;
60
61 /**
62 * Constructor
63 * @since 0.1.0
64 */
65 private function __construct() {
66 // Set our title
67 $this->menu_title = __( 'WPGetAPI', 'wpgetapi' );
68 $this->title = __( 'WPGetAPI', 'wpgetapi' );
69
70 }
71
72 /**
73 * Returns the running object
74 *
75 * @return Myprefix_Admin
76 **/
77 public static function get_instance() {
78 if( is_null( self::$instance ) ) {
79 self::$instance = new self();
80 self::$instance->hooks();
81 }
82 return self::$instance;
83 }
84
85 /**
86 * Initiate our hooks
87 * @since 0.1.0
88 */
89 public function hooks() {
90 add_action( 'admin_init', array( $this, 'init' ) );
91 add_action( 'admin_menu', array( $this, 'add_options_pages' ) );
92
93 add_action( 'cmb2_admin_init', array( $this, 'init_custom_fields' ) );
94
95 add_action( "cmb2_save_options-page_fields", array( $this, 'redirect' ), 1, 2 );
96
97 add_action( 'admin_footer', array( $this, 'load_testing_javascript' ) );
98
99 add_action( 'wp_ajax_wpgetapi_test_endpoint', array( $this, 'test_the_endpoint' ) );
100
101 add_action( 'wp_ajax_wpgetapi_export_endpoints', array( $this, 'export_endpoints' ) );
102 add_action( 'wp_ajax_wpgetapi_import_endpoints', array( $this, 'import_endpoints' ) );
103
104 }
105
106
107 /**
108 * Setup our custom fields
109 * @since 0.1.0
110 */
111 public function init_custom_fields() {
112 require_once WPGETAPIDIR . 'includes/class-fields.php';
113 WpGetApi_Parameter_Field::init_parameter();
114 }
115
116 /**
117 * Register our setting to WP
118 * @since 0.1.0
119 */
120 public function init() {
121 $this->pro_plugin = is_plugin_active( 'wpgetapi-extras/wpgetapi-extras.php' ) ? true : false;
122 $option_tabs = self::option_fields();
123 foreach ($option_tabs as $index => $option_tab) {
124 register_setting( $option_tab['id'], $option_tab['id'] );
125 }
126 }
127
128
129 /**
130 * Get our saved API's from setup
131 * @since 0.1.0
132 */
133 public function get_apis() {
134 $setup = get_option( 'wpgetapi_setup' );
135 if( empty( $setup ) || ! isset( $setup['apis'] ) || empty( $setup['apis'] ) )
136 return;
137 return $setup['apis'];
138 }
139
140
141 /**
142 * Add the options metabox to the array of metaboxes
143 * @since 0.1.0
144 */
145 public function option_fields() {
146
147 //Only need to initiate the array once per page-load
148 if ( ! empty( $this->option_metabox ) ) {
149 return $this->option_metabox;
150 }
151
152 // setup tab
153 $option_metabox[] = array(
154 'title' => __( 'Setup', 'wpgetapi' ),
155 'menu_title' => __( 'Setup', 'wpgetapi' ),
156 'id' => 'wpgetapi_setup',
157 'desc' => __( 'Add the details of the API(s) you are using. Endpoints will be setup in the next step after hitting save.', 'wpgetapi' ),
158 'show_on' => array( 'key' => 'options-page', 'value' => array( 'wpgetapi_setup' ), ),
159 'show_names' => true,
160 'fields' => $this->setup_fields(),
161 );
162
163 // get our saved API's and create as tabs
164 if( $this->get_apis() ) {
165
166 foreach ( $this->get_apis() as $index => $api ) {
167
168 $name = isset( $api['name'] ) && $api['name'] != '' ? sanitize_text_field( $api['name'] ) : 'API ' . absint( $index );
169 $api_id = isset( $api['id'] ) && $api['id'] != '' ? sanitize_text_field( $api['id'] ) : $name;
170 $metabox_id = strtolower( str_replace( '-', '_', sanitize_file_name( 'wpgetapi-' . $api_id ) ) );
171 $base_url = isset( $api['base_url'] ) && $api['base_url'] != '' ? esc_url_raw( $api['base_url'], array( 'http', 'https' ) ) : '';
172 $type = isset( $api['auth_type'] ) && $api['auth_type'] != '' ? sanitize_text_field( $api['auth_type'] ) : '';
173
174 // tab
175 $option_metabox[] = array(
176 'title' => $name,
177 'menu_title' => $name,
178 'id' => $metabox_id,
179 'desc' => '',
180 'show_on' => array( 'key' => 'options-page', 'value' => array( $metabox_id ), ),
181 'show_names' => true,
182 'fields' => $this->endpoint_fields( $type, $api_id, $base_url ),
183 );
184
185 }
186
187 }
188
189 $option_metabox = apply_filters( 'wpgetapi_admin_pages', $option_metabox );
190
191 return $option_metabox;
192
193 }
194
195 public function setup_fields() {
196
197 $fields[] = array(
198 'id' => 'apis',
199 'type' => 'group',
200 'name' => '',
201 'description' => '',
202 'options' => array(
203 'group_title' => __( 'API {#}', 'wpgetapi' ),
204 'add_button' => __( 'Add New API', 'wpgetapi' ),
205 'remove_button' => __( 'Remove API', 'wpgetapi' ),
206 'sortable' => true, // beta
207 ),
208 'fields' => array(
209 array(
210 'name' => __( 'API Name', 'wpgetapi' ) . '<span class="dashicons dashicons-editor-help" data-tip="' . __( 'The name of this API. Call it whatever you like.', 'wpgetapi' ) . '"></span>',
211 'id' => 'name',
212 'type' => 'text',
213 'classes' => 'api-name',
214 'attributes' => array(
215 'required' => true,
216 'placeholder' => 'Google Maps',
217 ),
218 'desc' => '',
219 ),
220 array(
221 'name' => __( 'Unique ID', 'wpgetapi' ) . '<span class="dashicons dashicons-editor-help" data-tip="' . __( 'Choose your own unique ID for this API. Use lowercase letters and underscores only!', 'wpgetapi' ) . '"></span>',
222 'id' => 'id',
223 'type' => 'text',
224 'attributes' => array(
225 'required' => true,
226 'placeholder' => 'google_maps',
227 ),
228 'desc' => '',
229 'sanitization_cb' => 'wpgetapi_sanitize_unique_id'
230 ),
231 array(
232 'name' => __( 'Base URL', 'wpgetapi' ) . '<span class="dashicons dashicons-editor-help" data-tip="' . __( 'The base URL of the API you are connecting to.', 'wpgetapi' ) . '"></span>',
233 'id' => 'base_url',
234 'type' => 'text',
235 'attributes' => array(
236 'required' => true,
237 'placeholder' => 'https://maps.googleapis.com/maps/api',
238 ),
239 'desc' => '',
240 ),
241
242 )
243 );
244
245 return $fields;
246
247 }
248
249
250 /**
251 * Endpoint settings.
252 * @return sale info array
253 *
254 */
255 public function endpoint_fields( $type = '', $api_id = '', $base_url = '' ) {
256
257 $fields = array();
258
259 $cache_disabled = $this->pro_plugin ? '' : 'disabled';
260 $cache_url = $this->pro_plugin ? '<a target="_blank" href="https://wpgetapi.com/docs/caching-api-calls/">Caching Help</a>' : '<a target="_blank" href="https://wpgetapi.com/downloads/pro-plugin/?utm_campaign=Pro&utm_medium=Admin&utm_source=Cache">View PRO Plugin</a>';
261 $cache_desc = $this->pro_plugin ? '' : 'Available in PRO plugin.';
262
263 $endpoint_fields = apply_filters( 'wpgetapi_fields_endpoints', array(
264 array(
265 'name' => __( 'Unique ID', 'wpgetapi' ) . '<span class="dashicons dashicons-editor-help" data-tip="' . __( 'Choose your own unique ID for this endpoint. Use lowercase letters and underscores only!', 'wpgetapi' ) . '"></span>',
266 'id' => 'id',
267 'type' => 'text',
268 'classes' => 'field-id field-half',
269 'attributes' => array(
270 'required' => true,
271 'placeholder' => 'new_endpoint',
272 ),
273 'desc' => '',
274 'before_row' => "wpgetapi_output_top_of_endpoint",
275 'api_id' => $api_id,
276 'sanitization_cb' => 'wpgetapi_sanitize_unique_id'
277
278 ),
279 array(
280 'name' => __( 'Endpoint', 'wpgetapi' ) . '<span class="dashicons dashicons-editor-help" data-tip="' . __( 'This Endpoint will be appended to the Base URL to create the full URL that will be called.', 'wpgetapi' ) . '"></span>',
281 'id' => 'endpoint',
282 'type' => 'text',
283 'classes' => 'field-endpoint field-half',
284 'attributes' => array(
285 'required' => true,
286 'placeholder' => '/newendpoint',
287 ),
288 'desc' => '',
289 ),
290 array(
291 'name' => __( 'Method', 'wpgetapi' ) . '<span class="dashicons dashicons-editor-help" data-tip="' . __( 'The Request Method for this endpoint. If you are displaying data from the API, it will usually be GET. If you are sending to the API, it will usually be POST.', 'wpgetapi' ) . '"></span>',
292 'id' => 'method',
293 'type' => 'select',
294 'classes' => 'field-method field-half',
295 'attributes' => array(
296 'required' => true,
297 ),
298 'options' => array(
299 'GET' => 'GET',
300 'POST' => 'POST',
301 'PUT' => 'PUT',
302 'PATCH' => 'PATCH',
303 'DELETE' => 'DELETE',
304 ),
305 'desc' => '',
306 ),
307
308 array(
309 'name' => __( 'Results Format', 'wpgetapi' ) .
310 '<span class="dashicons dashicons-editor-help" data-tip="' .
311 sprintf(
312 __( 'The format that the API data will be returned in. To format the data as HTML, click the link below to learn how. %1s', 'wpgetapi' ),
313 htmlentities( '<br><a target="_blank" href="https://wpgetapi.com/docs/formatting-json-data/?utm_campaign=Shortcode JSON&utm_medium=Admin&utm_source=User">Format as HTML</a>' )
314 ) .
315 '"></span>',
316 'id' => 'results_format',
317 'type' => 'select',
318 'classes' => 'field-results-format field-half',
319 'attributes' => array(
320 'required' => true,
321 ),
322 'options_cb' => 'wpgetapi_results_format_options',
323 'desc' => ''
324 ),
325
326 array(
327 'name' => __( 'Timeout', 'wpgetapi' ) .
328 '<span class="dashicons dashicons-editor-help" data-tip="How long the connection should stay open in seconds. Default is 10. If you receive curl 28 errors, try increasing this value."></span>',
329 'id' => 'timeout',
330 'type' => 'text',
331 'default' => '10',
332 'classes' => 'field-timeout field-half',
333 'attributes' => array(
334 'placeholder' => '10',
335 ),
336 'desc' => ''
337 ),
338
339 array(
340 'name' => __( 'Cache Time', 'wpgetapi' ) .
341 '<span class="dashicons dashicons-editor-help" data-tip="' .
342 sprintf(
343 __( 'The time in seconds to cache this request for. %1s', 'wpgetapi' ),
344 htmlentities( '<br>' . $cache_url )
345 ) .
346 '"></span>',
347 'id' => 'cache_time',
348 'type' => 'text',
349 'classes' => 'field-cache-time field-half',
350 'attributes' => array(
351 'placeholder' => '3600',
352 $cache_disabled => $cache_disabled,
353 ),
354 'desc' => $cache_desc,
355 'after_row' => '</div>'
356 ),
357
358 array(
359 'name' => __( 'Query String', 'wpgetapi' ) .
360 '<span class="dashicons dashicons-editor-help" data-tip="' .
361 sprintf(
362 __( 'Parameters as name/value pairs that will be appended to the URL. The query string is the part of the URL after the question mark, like so: https://yoururl.com<b>?key=value&key3=value3</b> %1s', 'wpgetapi' ),
363 htmlentities( '<br><a target="_blank" href="https://wpgetapi.com/docs/adding-query-string-parameters/?utm_campaign=Query String&utm_medium=Admin&utm_source=User">More Info</a>' )
364 ) .
365 '"></span>',
366 'id' => 'query_parameters',
367 'type' => 'parameter',
368 'classes' => 'field-query-parameters',
369 'repeatable' => true,
370 'desc' => '',
371 'before_row' => '<div class="fields-wrapper">'
372 ),
373 array(
374 'name' => __( 'Headers', 'wpgetapi' ) .
375 '<span class="dashicons dashicons-editor-help" data-tip="' .
376 sprintf(
377 __( 'Parameters as name/value pairs, sent in the Headers. %1s', 'wpgetapi' ),
378 htmlentities( '<br><a target="_blank" href="https://wpgetapi.com/docs/sending-headers-in-request/?utm_campaign=Headers&utm_medium=Admin&utm_source=User">More Info</a>' )
379 ) .
380 '"></span>',
381 'id' => 'header_parameters',
382 'type' => 'parameter',
383 'classes' => 'field-header-parameters',
384 'repeatable' => true,
385 'desc' => ''
386 ),
387 array(
388 'name' => __( 'Body', 'wpgetapi' ) .
389 '<span class="dashicons dashicons-editor-help" data-tip="' .
390 sprintf(
391 __( 'Parameters as name/value pairs, sent in the Body as POST fields. %1s', 'wpgetapi' ),
392 htmlentities( '<br><a target="_blank" href="https://wpgetapi.com/docs/sending-post-fields-in-request/?utm_campaign=Body&utm_medium=Admin&utm_source=User">More Info</a>' )
393 ) .
394 '"></span>',
395 'id' => 'body_parameters',
396 'type' => 'parameter',
397 'classes' => 'field-body-parameters',
398 'repeatable' => true,
399 'desc' => ''
400 ),
401 array(
402 'name' => __( 'Encode Body', 'wpgetapi' ) . '<span class="dashicons dashicons-editor-help" data-tip="' . __( 'Encoding of the above Body parameters.', 'wpgetapi' ) . '"></span>',
403 'id' => 'body_json_encode',
404 'type' => 'select',
405 'classes' => 'field-body-json-encode',
406 'options' => array(
407 'false' => __( 'No encoding (raw)', 'wpgetapi' ),
408 'true' => __( 'JSON encode', 'wpgetapi' ),
409 'url' => __( 'URL encode (x-www-form-urlencoded)', 'wpgetapi' ),
410 'base64' => __( 'Base64 encode', 'wpgetapi' ),
411 'xml' => __( 'XML format (available in PRO)', 'wpgetapi' ),
412
413 ),
414 'desc' => '',
415 'after_row' => '</div>',
416 ),
417 array(
418 'name' => __( 'Actions', 'wpgetapi' ) . '<span class="dashicons dashicons-editor-help" data-tip="' .
419 sprintf(
420 __( 'Call this endpoint when your chosen action runs. This feature is available in the PRO plugin. %1s', 'wpgetapi' ),
421 htmlentities( '<br><a target="_blank" href="https://wpgetapi.com/downloads/pro-plugin/?utm_campaign=Pro&utm_medium=Admin&utm_source=Actions">View PRO Plugin</a>' )
422 ) .
423 '"></span>',
424 'id' => 'actions',
425 'type' => 'select',
426 'classes' => 'field-actions',
427 'desc' => __( 'Available in PRO plugin.', 'wpgetapi' ),
428 'options' => array(
429 '' => __( '-- No Action --', 'wpgetapi-extras' ),
430 'new_post_published' => __( 'Post/Custom Post - New Post Published', 'wpgetapi-extras' ),
431 'transition_post_status' => __( 'Post/Custom Post - Status Changed', 'wpgetapi-extras' ),
432 'delete_post' => __( 'Post/Custom Post - Delete Post', 'wpgetapi-extras' ),
433
434 'user_register' => __( 'User - New User Registered', 'wpgetapi-extras' ),
435 'delete_user' => __( 'User - Delete User', 'wpgetapi-extras' ),
436 'user_login' => __( 'User - User Logs In', 'wpgetapi-extras' ),
437 'woocommerce_new_product' => __( 'WooCommerce - New Product Created', 'wpgetapi-extras' ),
438 'woocommerce_new_order' => __( 'WooCommerce - New Order Created', 'wpgetapi-extras' ),
439 'woocommerce_order_status_changed' => __( 'WooCommerce - Order Status Changed', 'wpgetapi-extras' ),
440 'contact_form_7' => __( 'Contact Form 7', 'wpgetapi-extras' ),
441 'gravity_forms' => __( 'Gravity Forms', 'wpgetapi-extras' ),
442 'wpforms' => __( 'WPForms', 'wpgetapi-extras' ),
443 'jetformbuilder' => __( 'JetFormBuilder', 'wpgetapi-extras' ),
444 'formidable_forms' => __( 'Formidable Forms', 'wpgetapi-extras' ),
445 'pmp' => __( 'Paid Memberships Pro - After Checkout', 'wpgetapi-extras' ),
446 'edd' => __( 'Easy Digital Downloads - Complete Purchase', 'wpgetapi-extras' ),
447 ),
448 'default' => '',
449 )
450
451 ) );
452
453 $fields[] = array(
454 'id' => 'endpoints',
455 'type' => 'group',
456 'name' => '',
457 'description' => '',
458 'options' => array(
459 'group_title' => __( 'Endpoint {#}', 'wpgetapi' ),
460 'add_button' => __( 'Add Endpoint', 'wpgetapi' ),
461 'remove_button' => __( 'Remove Endpoint', 'wpgetapi' ),
462 'sortable' => true, // beta
463 //'closed' => true,
464 ),
465 'before_group' => '<pre class="url"><div>Base URL:</div> <span>' . $base_url . '</span></pre>
466 <div class="import-export"><a href="#TB_inline?&width=600&height=550&inlineId=my-content-id" class="button thickbox">Import/Export</a></div>
467 <div class="collapse open"><a class="button" title="Collapse all endpoints"><span class="dashicons dashicons-arrow-down"></span></a></div>',
468 'fields' => $endpoint_fields,
469 );
470
471 return apply_filters( 'wpgetapi_fields', $fields );
472
473 }
474
475
476 public function add_options_pages() {
477 add_thickbox();
478
479 $option_tabs = self::option_fields();
480
481 foreach ($option_tabs as $index => $option_tab) {
482 if ( $index == 0) {
483
484 $this->options_pages[] = add_menu_page( $this->title, $this->menu_title, 'manage_options', $option_tab['id'], array( $this, 'admin_page_display' ), 'none'
485 ); //Link admin menu to first tab
486
487 add_submenu_page( $option_tabs[0]['id'], $this->menu_title, $option_tab['menu_title'], 'manage_options', $option_tab['id'], array( $this, 'admin_page_display' ) ); //Duplicate menu link for first submenu page
488 } else {
489 $this->options_pages[] = add_submenu_page( $option_tabs[0]['id'], $this->menu_title, $option_tab['menu_title'], 'manage_options', $option_tab['id'], array( $this, 'admin_page_display' ) );
490 }
491 }
492
493 foreach ( $this->options_pages as $page ) {
494 // Include CMB CSS in the head to avoid FOUC
495 add_action( "admin_print_styles-{$page}", array( 'CMB2_Hookup', 'enqueue_cmb_css' ) );
496 }
497
498 }
499
500 /**
501 * Admin page markup. Mmply handled by CMB2
502 * @since 0.1.0
503 */
504 public function admin_page_display() {
505
506 $option_tabs = self::option_fields(); //get all option tabs
507 $tab_forms = array();
508
509 $l = '';
510 if( $this->pro_plugin ) {
511 $l = get_option( 'wpgetapi_pro_license_status' );
512 }
513
514 ?>
515
516 <div class="wrap wpgetapi <?php esc_attr_e( $l ); ?>">
517
518 <div class="main_content_cell">
519
520 <h1 class="wp-heading-inline">
521 <img width="24" height="22" src="<?php echo esc_url( WPGETAPIURL . 'assets/img/wpgetapi-icon.png' ); ?>" /> <?php esc_html_e( $this->title, 'wpgetapi' ) ?> <span class="vnum"><?php echo WPGETAPIVERSION; ?></span>
522 </h1>
523
524 <div class="outer-box">
525 <!-- Options Page Nav Tabs -->
526 <h2 class="nav-tab-wrapper">
527 <?php foreach ($option_tabs as $option_tab) :
528
529 $tab_slug = $option_tab['id'];
530 $nav_class = 'nav-tab';
531 if ( $tab_slug == $_GET['page'] ) {
532 $nav_class .= ' nav-tab-active'; //add active class to current tab
533 $tab_forms[] = $option_tab; //add current tab to forms to be rendered
534 }
535
536 ?>
537
538 <a class="<?php esc_attr_e( $nav_class ); ?>" href="<?php esc_url( menu_page_url( $tab_slug ) ); ?>"><?php esc_attr_e( $option_tab['menu_title'], 'wpgetapi' ); ?></a>
539
540 <?php endforeach; ?>
541 </h2>
542 <!-- End of Nav Tabs -->
543
544 <?php
545 //render all tab forms (normaly just 1 form)
546 foreach ($tab_forms as $tab_form) : ?>
547
548 <div id="<?php esc_attr_e($tab_form['id']); ?>" class="cmb-form group">
549 <div class="metabox-holder">
550
551 <div id="my-content-id" style="display:none;">
552 <div>
553 <?php echo $this->get_import_export(); ?>
554 </div>
555 </div>
556
557 <div class="pmpbox pad">
558 <h3 class="title"><?php esc_html_e($tab_form['title'], 'wpgetapi'); ?></h3>
559 <div class="desc"><?php echo wp_kses_post( $tab_form['desc'] ); ?></div>
560 <?php cmb2_metabox_form( $tab_form, $tab_form['id'], $tab_form ); ?>
561 </div>
562 </div>
563 </div>
564
565 <?php endforeach; ?>
566
567 </div>
568
569 </div>
570
571 <div class="sidebar_cell">
572
573 <?php
574 $sidebar = self::sidebar_display();
575 echo apply_filters( 'wpgetapi_admin_sidebar_display', $sidebar );
576 ?>
577
578 </div>
579
580 </div>
581
582 <?php
583
584 }
585
586
587 public function test_the_endpoint() {
588
589 $api_id = sanitize_text_field( $_POST['api_id'] );
590 $endpoint_id = sanitize_text_field( $_POST['endpoint_id'] );
591 $data = wpgetapi_endpoint( $api_id, $endpoint_id, array( 'test_endpoint' => true ) );
592
593 $output = array(
594 'data' => $data,
595 'endpoint_id' => $endpoint_id
596 );
597 echo json_encode( $output );
598
599 wp_die(); // this is required to terminate immediately and return a proper response
600
601 }
602
603 public function get_import_export() {
604 ob_start(); ?>
605
606 <div class="wpgetapi-export">
607 <h3><span class="dashicons dashicons-download"></span> Export Endpoints</h3>
608 <p>Export the endpoints for this API.<br>After clicking the button below, copy the entire contents of the export.</p>
609 <button class="button button-primary">Export Endpoints</button>
610 <div class="message"></div>
611 </div>
612
613 <div class="wpgetapi-import">
614 <h3><span class="dashicons dashicons-upload"></span> Import Endpoints</h3>
615 <p>Paste your exported JSON data into the field below to import endpoints into this API.</p>
616 <textarea></textarea>
617 <button class="button button-primary">Import Endpoints</button>
618 <div class="message"></div>
619 </div>
620
621 <?php
622 $content = ob_get_contents();
623 ob_end_clean();
624 return $content;
625 }
626
627 /**
628 * AJAX function to get our endpoints for export.
629 *
630 */
631 public function export_endpoints() {
632 $api_id = sanitize_text_field( $_POST['api_id'] );
633 $data = get_option( $api_id );
634
635 if( ! isset( $data['endpoints'] ) )
636 wp_die();
637
638 $encryption = new WpGetApi_Encryption();
639
640 foreach ( $data['endpoints'] as $i => $endpoint ) {
641 if( isset( $endpoint['query_parameters'] ) ) {
642 foreach ( $endpoint['query_parameters'] as $i2 => $query_parameters ) {
643 if( isset( $query_parameters['value'] ) )
644 $data['endpoints'][ $i ]['query_parameters'][ $i2 ]['value'] = $encryption->decrypt( $query_parameters['value'] );
645 }
646 }
647 if( isset( $endpoint['header_parameters'] ) ) {
648 foreach ( $endpoint['header_parameters'] as $i2 => $header_parameters ) {
649 if( isset( $header_parameters['value'] ) )
650 $data['endpoints'][ $i ]['header_parameters'][ $i2 ]['value'] = $encryption->decrypt( $header_parameters['value'] );
651 }
652 }
653 if( isset( $endpoint['body_parameters'] ) ) {
654 foreach ( $endpoint['body_parameters'] as $i2 => $body_parameters ) {
655 if( isset( $body_parameters['value'] ) )
656 $data['endpoints'][ $i ]['body_parameters'][ $i2 ]['value'] = $encryption->decrypt( $body_parameters['value'] );
657 }
658 }
659 }
660
661 echo json_encode( $data );
662 wp_die(); // this is required to terminate immediately and return a proper response
663 }
664
665 /**
666 * AJAX function to import our endpoints.
667 *
668 */
669 public function import_endpoints() {
670
671 $api_id = sanitize_text_field( $_POST['api_id'] );
672 $textarea = sanitize_textarea_field( $_POST['textarea'] );
673 $existing_data = get_option( $api_id );
674
675 if( ! $textarea ) {
676 echo 'No data found.';
677 wp_die();
678 }
679
680 $new_data = json_decode( stripslashes( $textarea ), true );
681 if( ! isset( $new_data['endpoints'] ) ){
682 echo 'No endpoints found.';
683 wp_die();
684 }
685
686 $encryption = new WpGetApi_Encryption();
687
688 foreach ( $new_data['endpoints'] as $i => $endpoint ) {
689 if( isset( $endpoint['query_parameters'] ) ) {
690 foreach ( $endpoint['query_parameters'] as $i2 => $query_parameters ) {
691 if( isset( $query_parameters['value'] ) )
692 $new_data['endpoints'][ $i ]['query_parameters'][ $i2 ]['value'] = $encryption->encrypt( $query_parameters['value'] );
693 }
694 }
695 if( isset( $endpoint['header_parameters'] ) ) {
696 foreach ( $endpoint['header_parameters'] as $i2 => $header_parameters ) {
697 if( isset( $header_parameters['value'] ) )
698 $new_data['endpoints'][ $i ]['header_parameters'][ $i2 ]['value'] = $encryption->encrypt( $header_parameters['value'] );
699 }
700 }
701 if( isset( $endpoint['body_parameters'] ) ) {
702 foreach ( $endpoint['body_parameters'] as $i2 => $body_parameters ) {
703 if( isset( $body_parameters['value'] ) )
704 $new_data['endpoints'][ $i ]['body_parameters'][ $i2 ]['value'] = $encryption->encrypt( $body_parameters['value'] );
705 }
706 }
707 }
708
709 // if no existing endpoints, simply add it
710 if( ! $existing_data ) {
711 update_option( $api_id, $new_data, 'no' );
712 } else {
713
714 $merged['endpoints'] = array_merge( $existing_data['endpoints'], $new_data['endpoints'] );
715 update_option( $api_id, $merged, 'no' );
716 }
717
718 echo 'Successfully imported. Reloading...';
719 wp_die(); // this is required to terminate immediately and return a proper response
720 }
721
722
723 public function load_testing_javascript() { ?>
724
725 <script type="text/javascript" >
726
727 jQuery(document).ready(function($) {
728
729 /**
730 * Collapse the endpoints
731 *
732 */
733 $('body').on( 'click', '.wpgetapi .collapse .button', function(){
734
735 var $this = $(this);
736 var $collapse = $(this).parents('.collapse');
737 var status = 'open';
738
739 $collapse.toggleClass('open');
740
741 if( ! $collapse.hasClass( 'open' ) )
742 status = 'closed';
743
744 var $endpoints = $( '#endpoints_repeat .postbox.cmb-repeatable-grouping' );
745 $endpoints.each( function() {
746
747 if( status == 'closed' ) {
748 $( this ).addClass('closed');
749 } else {
750 $( this ).removeClass('closed');
751 }
752
753 });
754
755 });
756
757 /**
758 * Run the export
759 *
760 */
761 $('body').on( 'click', '.wpgetapi-export .button', function(){
762
763 var $this = $(this);
764 var api_id = $('.wpgetapi.wrap').find( '.cmb-form.group' ).attr( 'id' );
765
766 // disable button
767 $this.attr( 'disabled', true );
768
769 var data = {
770 'action': 'wpgetapi_export_endpoints',
771 'api_id': api_id,
772 };
773
774 // send and get response
775 jQuery.post(ajaxurl, data, function( response ) {
776 $( '.wpgetapi-export .message' ).show().html( response );
777 // enable button
778 $( '.wpgetapi-export .button' ).attr( 'disabled', false );
779
780 });
781
782 });
783
784 /**
785 * Run the import
786 *
787 */
788 $('body').on( 'click', '.wpgetapi-import .button', function(){
789
790 var $this = $(this);
791 var api_id = $('.wpgetapi.wrap').find( '.cmb-form.group' ).attr( 'id' );
792 var textarea = $('.wpgetapi-import textarea').val();
793
794 // disable button
795 $this.attr( 'disabled', true );
796
797 var data = {
798 'action': 'wpgetapi_import_endpoints',
799 'textarea': textarea,
800 'api_id': api_id,
801 };
802
803 // send and get response
804 jQuery.post(ajaxurl, data, function( response ) {
805
806 $( '.wpgetapi-import .message' ).html( response );
807
808 if( response == 'Successfully imported. Reloading...' ) {
809 setTimeout(function(){
810 location.reload();
811 }, 1000);
812 } else {
813 $( '.wpgetapi-import .button' ).attr( 'disabled', false );
814 }
815
816 });
817
818 });
819
820 /**
821 * Run the endpoint test
822 *
823 */
824 $('body').on( 'click', '.wpgetapi .test-endpoint-button', function(){//delegated
825
826 var $this = $(this);
827 var $parent = $this.closest( '.cmb-repeatable-grouping' );
828 var area = $parent.find( '.wpgetapi-test-area' );
829 var api_id = $( area ).data( 'api' );
830 var endpoint_id = $( area ).data( 'endpoint' );
831
832 // disable button
833 $this.attr( 'disabled', true );
834
835 var data = {
836 'action': 'wpgetapi_test_endpoint',
837 'api_id': api_id,
838 'endpoint_id': endpoint_id
839 };
840
841 // send and get response
842 jQuery.post(ajaxurl, data, function( response ) {
843
844 var output = JSON.parse( response );
845
846 $( '.wpgetapi-test-area[data-endpoint="' + output.endpoint_id + '"] .handle' ).show();
847 $( '.wpgetapi-test-area[data-endpoint="' + output.endpoint_id + '"] .wpgetapi-result' ).html( output.data);
848
849 // enable button
850 $( '.wpgetapi .test-endpoint-button' ).attr( 'disabled', false );
851
852 });
853
854 });
855
856 $( '.wpgetapi-test-area .handle' ).on('click', function() {
857 $('.wpgetapi-result').toggle();
858 });
859
860 });
861
862 </script> <?php
863
864 }
865
866
867 /**
868 * Sidebar markup.
869 * @since 1.4.1
870 */
871 public function sidebar_display() {
872
873 ob_start();
874
875 // do our setup page
876 if( isset( $_GET['page'] ) && $_GET['page'] === 'wpgetapi_setup' )
877 return $this->sidebar_setup_page();
878
879 ?>
880
881 <div class="box">
882 <h4><?php esc_html_e( 'Endpoint Instructions', 'wpgetapi' ); ?></h4>
883 <ol>
884 <li><?php _e( 'Give your endpoint a <b>Unique ID</b>', 'wpgetapi' ); ?></li>
885 <li><?php _e( 'Add the <b>Endpoint</b> which can be found in your API docs', 'wpgetapi' ); ?></li>
886 <li><?php _e( 'Set the <b>Method</b> - GET for getting data & POST for sending data to the API', 'wpgetapi' ); ?></li>
887 <li><?php _e( 'Set the desired <b>Results Format</b>', 'wpgetapi' ); ?></li>
888 <li><?php _e( 'Other fields are optional & will depend on your API', 'wpgetapi' ); ?></li>
889 <li><?php _e( 'Hit the Save button', 'wpgetapi' ); ?></li>
890 <li><?php _e( 'Copy the Template Tag or Shortcode & paste into page, post or theme file', 'wpgetapi' ); ?></li>
891 </ol>
892 </div>
893
894 <?php echo $this->help_box(); ?>
895
896 <?php
897 $content = ob_get_contents();
898 ob_end_clean();
899 return $content;
900
901 }
902
903
904 /**
905 * Sidebar for our setup page.
906 * @since 1.4.4
907 */
908 public function sidebar_setup_page() {
909
910 ob_start();
911 ?>
912
913 <div class="box">
914 <h4><?php esc_html_e( 'Setup Instructions', 'wpgetapi' ); ?></h4>
915 <ol>
916 <li><?php _e( 'Name your API in the <b>API Name</b> field', 'wpgetapi' ); ?></li>
917 <li><?php _e( 'Give your API a <b>Unique ID</b>', 'wpgetapi' ); ?></li>
918 <li><?php _e( 'Add the <b>Base URL</b> of your API. This can be found in the docs of your API', 'wpgetapi' ); ?></li>
919 <li><?php _e( 'Hit the Save button', 'wpgetapi' ); ?></li>
920 <li><?php _e( 'Visit the new tab that will be created', 'wpgetapi' ); ?></li>
921 </ol>
922 </div>
923
924 <?php echo $this->help_box(); ?>
925
926 <?php
927 $content = ob_get_contents();
928 ob_end_clean();
929 return $content;
930
931 }
932
933
934 /**
935 *
936 * @since 1.4.4
937 */
938 public function help_box() {
939
940 ob_start();
941 ?>
942
943 <div class="box help-box">
944 <h4><?php esc_html_e( 'Getting Help', 'wpgetapi' ); ?></h4>
945 <ul>
946 <li><?php
947 printf(
948 esc_html__( 'View the %1$s', 'cmb2' ),
949 '<a target="_blank" href="https://wpgetapi.com/docs/quick-start-guide/?utm_campaign=Docs&utm_medium=Admin&utm_source=User">Quick Start Guide</a>'
950 );
951 ?></li>
952 <li><?php
953 printf(
954 esc_html__( 'View the %1$s', 'cmb2' ),
955 '<a target="_blank" href="https://wpgetapi.com/docs/frequently-asked-questions/?utm_campaign=Docs&utm_medium=Admin&utm_source=User">FAQs</a>'
956 );
957 ?></li>
958
959 <?php if( ! $this->pro_plugin ) { ?>
960 <a class="button" target="_blank" href="https://wpgetapi.com/downloads/pro-plugin/?utm_campaign=Pro&utm_medium=Admin&utm_source=User"><?php esc_html_e( 'Do more with the PRO Plugin', 'cmb2' ); ?></a>
961 <?php } ?>
962 </ul>
963 </div>
964
965 <?php
966 $content = ob_get_contents();
967 ob_end_clean();
968 return $content;
969
970 }
971
972
973 /**
974 * Tabs don't immmediately appear on save, so this hack!
975 * @since 0.1.0
976 */
977 public function redirect( $object_id, $updated ) {
978
979 if( strpos( $object_id, 'wpgetapi_' ) !== false && strpos( $object_id, 'wpgetapi_api_importer' ) == false ) {
980
981 add_settings_error( 'wpgetapi-notices', '', 'Saved, reloading page...', 'updated' );
982 settings_errors( 'wpgetapi-notices' );
983 ?>
984
985 <script>
986 setTimeout(function() {
987 location.reload();
988 }, 200);
989 </script>
990 <?php
991
992 }
993
994 }
995
996
997 /**
998 * Public getter method for retrieving protected/private variables
999 * @since 0.1.0
1000 * @param string $field Field to retrieve
1001 * @return mixed Field value or exception is thrown
1002 */
1003 public function __get( $field ) {
1004 // Allowed fields to retrieve
1005 if ( in_array( $field, array( 'key', 'fields', 'title', 'options_pages' ), true ) ) {
1006 return $this->{$field};
1007 }
1008 if ( 'option_metabox' === $field ) {
1009 return $this->option_fields();
1010 }
1011 throw new Exception( 'Invalid property: ' . $field );
1012 }
1013
1014 }
1015
1016 /**
1017 * Helper function to get/return the WpGetApi_Admin_Options object
1018 * @since 0.1.0
1019 * @return WpGetApi_Admin_Options object
1020 */
1021 function wpgetapi_admin_options() {
1022 return WpGetApi_Admin_Options::get_instance();
1023 }
1024
1025 // Get it started
1026 wpgetapi_admin_options();
1027
1028 endif;