PluginProbe
WPGet API – Connect to any external REST API / 2.2.3
WPGet API – Connect to any external REST API v2.2.3
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.3, at includes/class-admin-options.php

1,041 lines 32.9 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 if( ! current_user_can( 'manage_options' ) ) {
672 echo 'Admin privelages are required to import endpoints.';
673 wp_die();
674 }
675
676 if ( isset( $_POST['nonce'] ) ) {
677 if ( ! wp_verify_nonce( $_POST['nonce'], 'import_endpoint_nonce' ) ) {
678 echo 'Nope.';
679 wp_die();
680 }
681 }
682
683 $api_id = sanitize_text_field( $_POST['api_id'] );
684 $textarea = sanitize_textarea_field( $_POST['textarea'] );
685 $existing_data = get_option( $api_id );
686
687 if( ! $textarea ) {
688 echo 'No data found.';
689 wp_die();
690 }
691
692 $new_data = json_decode( stripslashes( $textarea ), true );
693 if( ! isset( $new_data['endpoints'] ) ){
694 echo 'No endpoints found.';
695 wp_die();
696 }
697
698 $encryption = new WpGetApi_Encryption();
699
700 foreach ( $new_data['endpoints'] as $i => $endpoint ) {
701 if( isset( $endpoint['query_parameters'] ) ) {
702 foreach ( $endpoint['query_parameters'] as $i2 => $query_parameters ) {
703 if( isset( $query_parameters['value'] ) )
704 $new_data['endpoints'][ $i ]['query_parameters'][ $i2 ]['value'] = $encryption->encrypt( $query_parameters['value'] );
705 }
706 }
707 if( isset( $endpoint['header_parameters'] ) ) {
708 foreach ( $endpoint['header_parameters'] as $i2 => $header_parameters ) {
709 if( isset( $header_parameters['value'] ) )
710 $new_data['endpoints'][ $i ]['header_parameters'][ $i2 ]['value'] = $encryption->encrypt( $header_parameters['value'] );
711 }
712 }
713 if( isset( $endpoint['body_parameters'] ) ) {
714 foreach ( $endpoint['body_parameters'] as $i2 => $body_parameters ) {
715 if( isset( $body_parameters['value'] ) )
716 $new_data['endpoints'][ $i ]['body_parameters'][ $i2 ]['value'] = $encryption->encrypt( $body_parameters['value'] );
717 }
718 }
719 }
720
721 // if no existing endpoints, simply add it
722 if( ! $existing_data ) {
723 update_option( $api_id, $new_data, 'no' );
724 } else {
725
726 $merged['endpoints'] = array_merge( $existing_data['endpoints'], $new_data['endpoints'] );
727 update_option( $api_id, $merged, 'no' );
728 }
729
730 echo 'Successfully imported. Reloading...';
731 wp_die(); // this is required to terminate immediately and return a proper response
732 }
733
734
735 public function load_testing_javascript() { ?>
736
737 <script type="text/javascript" >
738
739 jQuery(document).ready(function($) {
740
741 /**
742 * Collapse the endpoints
743 *
744 */
745 $('body').on( 'click', '.wpgetapi .collapse .button', function(){
746
747 var $this = $(this);
748 var $collapse = $(this).parents('.collapse');
749 var status = 'open';
750
751 $collapse.toggleClass('open');
752
753 if( ! $collapse.hasClass( 'open' ) )
754 status = 'closed';
755
756 var $endpoints = $( '#endpoints_repeat .postbox.cmb-repeatable-grouping' );
757 $endpoints.each( function() {
758
759 if( status == 'closed' ) {
760 $( this ).addClass('closed');
761 } else {
762 $( this ).removeClass('closed');
763 }
764
765 });
766
767 });
768
769 /**
770 * Run the export
771 *
772 */
773 $('body').on( 'click', '.wpgetapi-export .button', function(){
774
775 var $this = $(this);
776 var api_id = $('.wpgetapi.wrap').find( '.cmb-form.group' ).attr( 'id' );
777
778 // disable button
779 $this.attr( 'disabled', true );
780
781 var data = {
782 'action': 'wpgetapi_export_endpoints',
783 'api_id': api_id,
784 };
785
786 // send and get response
787 jQuery.post(ajaxurl, data, function( response ) {
788 $( '.wpgetapi-export .message' ).show().html( response );
789 // enable button
790 $( '.wpgetapi-export .button' ).attr( 'disabled', false );
791
792 });
793
794 });
795
796 /**
797 * Run the import
798 *
799 */
800 $('body').on( 'click', '.wpgetapi-import .button', function(){
801
802 var $this = $(this);
803 var api_id = $('.wpgetapi.wrap').find( '.cmb-form.group' ).attr( 'id' );
804 var textarea = $('.wpgetapi-import textarea').val();
805
806 // disable button
807 $this.attr( 'disabled', true );
808
809 var data = {
810 'action': 'wpgetapi_import_endpoints',
811 'textarea': textarea,
812 'api_id': api_id,
813 'nonce': "<?php echo wp_create_nonce( 'import_endpoint_nonce' ); ?>",
814 };
815
816 // send and get response
817 jQuery.post(ajaxurl, data, function( response ) {
818
819 $( '.wpgetapi-import .message' ).html( response );
820
821 if( response == 'Successfully imported. Reloading...' ) {
822 setTimeout(function(){
823 location.reload();
824 }, 1000);
825 } else {
826 $( '.wpgetapi-import .button' ).attr( 'disabled', false );
827 }
828
829 });
830
831 });
832
833 /**
834 * Run the endpoint test
835 *
836 */
837 $('body').on( 'click', '.wpgetapi .test-endpoint-button', function(){//delegated
838
839 var $this = $(this);
840 var $parent = $this.closest( '.cmb-repeatable-grouping' );
841 var area = $parent.find( '.wpgetapi-test-area' );
842 var api_id = $( area ).data( 'api' );
843 var endpoint_id = $( area ).data( 'endpoint' );
844
845 // disable button
846 $this.attr( 'disabled', true );
847
848 var data = {
849 'action': 'wpgetapi_test_endpoint',
850 'api_id': api_id,
851 'endpoint_id': endpoint_id
852 };
853
854 // send and get response
855 jQuery.post(ajaxurl, data, function( response ) {
856
857 var output = JSON.parse( response );
858
859 $( '.wpgetapi-test-area[data-endpoint="' + output.endpoint_id + '"] .handle' ).show();
860 $( '.wpgetapi-test-area[data-endpoint="' + output.endpoint_id + '"] .wpgetapi-result' ).html( output.data);
861
862 // enable button
863 $( '.wpgetapi .test-endpoint-button' ).attr( 'disabled', false );
864
865 });
866
867 });
868
869 $( '.wpgetapi-test-area .handle' ).on('click', function() {
870 $('.wpgetapi-result').toggle();
871 });
872
873 });
874
875 </script> <?php
876
877 }
878
879
880 /**
881 * Sidebar markup.
882 * @since 1.4.1
883 */
884 public function sidebar_display() {
885
886 ob_start();
887
888 // do our setup page
889 if( isset( $_GET['page'] ) && $_GET['page'] === 'wpgetapi_setup' )
890 return $this->sidebar_setup_page();
891
892 ?>
893
894 <div class="box">
895 <h4><?php esc_html_e( 'Endpoint Instructions', 'wpgetapi' ); ?></h4>
896 <ol>
897 <li><?php _e( 'Give your endpoint a <b>Unique ID</b>', 'wpgetapi' ); ?></li>
898 <li><?php _e( 'Add the <b>Endpoint</b> which can be found in your API docs', 'wpgetapi' ); ?></li>
899 <li><?php _e( 'Set the <b>Method</b> - GET for getting data & POST for sending data to the API', 'wpgetapi' ); ?></li>
900 <li><?php _e( 'Set the desired <b>Results Format</b>', 'wpgetapi' ); ?></li>
901 <li><?php _e( 'Other fields are optional & will depend on your API', 'wpgetapi' ); ?></li>
902 <li><?php _e( 'Hit the Save button', 'wpgetapi' ); ?></li>
903 <li><?php _e( 'Copy the Template Tag or Shortcode & paste into page, post or theme file', 'wpgetapi' ); ?></li>
904 </ol>
905 </div>
906
907 <?php echo $this->help_box(); ?>
908
909 <?php
910 $content = ob_get_contents();
911 ob_end_clean();
912 return $content;
913
914 }
915
916
917 /**
918 * Sidebar for our setup page.
919 * @since 1.4.4
920 */
921 public function sidebar_setup_page() {
922
923 ob_start();
924 ?>
925
926 <div class="box">
927 <h4><?php esc_html_e( 'Setup Instructions', 'wpgetapi' ); ?></h4>
928 <ol>
929 <li><?php _e( 'Name your API in the <b>API Name</b> field', 'wpgetapi' ); ?></li>
930 <li><?php _e( 'Give your API a <b>Unique ID</b>', 'wpgetapi' ); ?></li>
931 <li><?php _e( 'Add the <b>Base URL</b> of your API. This can be found in the docs of your API', 'wpgetapi' ); ?></li>
932 <li><?php _e( 'Hit the Save button', 'wpgetapi' ); ?></li>
933 <li><?php _e( 'Visit the new tab that will be created', 'wpgetapi' ); ?></li>
934 </ol>
935 </div>
936
937 <?php echo $this->help_box(); ?>
938
939 <?php
940 $content = ob_get_contents();
941 ob_end_clean();
942 return $content;
943
944 }
945
946
947 /**
948 *
949 * @since 1.4.4
950 */
951 public function help_box() {
952
953 ob_start();
954 ?>
955
956 <div class="box help-box">
957 <h4><?php esc_html_e( 'Getting Help', 'wpgetapi' ); ?></h4>
958 <ul>
959 <li><?php
960 printf(
961 esc_html__( 'View the %1$s', 'cmb2' ),
962 '<a target="_blank" href="https://wpgetapi.com/docs/quick-start-guide/?utm_campaign=Docs&utm_medium=Admin&utm_source=User">Quick Start Guide</a>'
963 );
964 ?></li>
965 <li><?php
966 printf(
967 esc_html__( 'View the %1$s', 'cmb2' ),
968 '<a target="_blank" href="https://wpgetapi.com/docs/frequently-asked-questions/?utm_campaign=Docs&utm_medium=Admin&utm_source=User">FAQs</a>'
969 );
970 ?></li>
971
972 <?php if( ! $this->pro_plugin ) { ?>
973 <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>
974 <?php } ?>
975 </ul>
976 </div>
977
978 <?php
979 $content = ob_get_contents();
980 ob_end_clean();
981 return $content;
982
983 }
984
985
986 /**
987 * Tabs don't immmediately appear on save, so this hack!
988 * @since 0.1.0
989 */
990 public function redirect( $object_id, $updated ) {
991
992 if( strpos( $object_id, 'wpgetapi_' ) !== false && strpos( $object_id, 'wpgetapi_api_importer' ) == false ) {
993
994 add_settings_error( 'wpgetapi-notices', '', 'Saved, reloading page...', 'updated' );
995 settings_errors( 'wpgetapi-notices' );
996 ?>
997
998 <script>
999 setTimeout(function() {
1000 location.reload();
1001 }, 200);
1002 </script>
1003 <?php
1004
1005 }
1006
1007 }
1008
1009
1010 /**
1011 * Public getter method for retrieving protected/private variables
1012 * @since 0.1.0
1013 * @param string $field Field to retrieve
1014 * @return mixed Field value or exception is thrown
1015 */
1016 public function __get( $field ) {
1017 // Allowed fields to retrieve
1018 if ( in_array( $field, array( 'key', 'fields', 'title', 'options_pages' ), true ) ) {
1019 return $this->{$field};
1020 }
1021 if ( 'option_metabox' === $field ) {
1022 return $this->option_fields();
1023 }
1024 throw new Exception( 'Invalid property: ' . $field );
1025 }
1026
1027 }
1028
1029 /**
1030 * Helper function to get/return the WpGetApi_Admin_Options object
1031 * @since 0.1.0
1032 * @return WpGetApi_Admin_Options object
1033 */
1034 function wpgetapi_admin_options() {
1035 return WpGetApi_Admin_Options::get_instance();
1036 }
1037
1038 // Get it started
1039 wpgetapi_admin_options();
1040
1041 endif;