PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.81
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.81
5.5.83 5.5.82 5.5.81 5.5.80 5.5.79 5.5.77 5.5.76 5.5.75 5.5.73 5.5.72 5.5.22 5.5.23 5.5.29 5.5.3 5.5.31 5.5.32 5.5.34 5.5.35 5.5.36 5.5.37 5.5.4 5.5.40 5.5.41 5.5.42 5.5.43 All 159 releases
wp-data-access / includes / class-wp-data-access.php

class-wp-data-access.php in WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards 5.5.81, at includes/class-wp-data-access.php

562 lines 24.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Suppress "error - 0 - No summary was found for this file" on phpdoc generation
5 *
6 * @package plugin\includes
7 */
8 use WPDataAccess\Connection\WPDADB;
9 use WPDataAccess\Cookies\WPDA_Cookies;
10 use WPDataAccess\Data_Dictionary\WPDA_Dictionary_Lists;
11 use WPDataAccess\Data_Tables\WPDA_Data_Tables;
12 use WPDataAccess\Plugin_Table_Models\WPDA_Table_Settings_Model;
13 use WPDataAccess\Utilities\WPDA_Table_Actions;
14 use WPDataAccess\Utilities\WPDA_Export;
15 use WPDataAccess\Utilities\WPDA_Favourites;
16 use WPDataAccess\WPDA;
17 use WPDataProjects\Utilities\WPDP_Export_Project;
18 use WPDataAccess\Backup\WPDA_Data_Export;
19 use WPDataAccess\Plugin_Table_Models\WPDA_CSV_Uploads_Model;
20 use WPDataRoles\WPDA_Roles;
21 use WPDataAccess\Utilities\WPDA_Autocomplete;
22 use WPDataAccess\Premium\WPDAPRO_Geo_Location\WPDAPRO_Geo_Location_WS;
23 use WPDataAccess\Premium\WPDAPRO_Geo_Location\WPDAPRO_Geo_Location;
24 use WPDataAccess\Query_Builder\WPDA_Query_Builder;
25 use WPDataAccess\Dashboard\WPDA_Dashboard;
26 use WPDataAccess\Dashboard\WPDA_Widget_Code;
27 use WPDataAccess\Dashboard\WPDA_Widget_Publication;
28 use WPDataAccess\Dashboard\WPDA_Widget_Dbms;
29 use WPDataAccess\Dashboard\WPDA_Widget_Google_Chart;
30 use WPDataAccess\Premium\WPDAPRO_Dashboard\WPDAPRO_Widget_Project;
31 /**
32 * Class WP_Data_Access
33 *
34 * Core plugin class used to define:
35 * + admin specific functionality {@see WP_Data_Access_Admin}
36 * + public specific functionality {@see WP_Data_Access_Public}
37 * + internationalization {@see WP_Data_Access_I18n}
38 * + plugin activation and deactivation {@see WP_Data_Access_Loader}
39 *
40 * @author Peter Schulz
41 * @since 1.0.0
42 *
43 * @see WP_Data_Access_Admin
44 * @see WP_Data_Access_Public
45 * @see WP_Data_Access_I18n
46 * @see WP_Data_Access_Loader
47 */
48 // phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing -- verified on page
49 class WP_Data_Access {
50 /**
51 * Reference to plugin loader
52 *
53 * @var WP_Data_Access_Loader
54 *
55 * @since 1.0.0
56 *
57 * @see WP_Data_Access_Loader
58 */
59 protected $loader;
60
61 /**
62 * Menu slug or null
63 *
64 * @var null
65 */
66 protected $page = null;
67
68 /**
69 * WP_Data_Access constructor
70 *
71 * Calls method the following methods to setup plugin:
72 * + {@see WP_Data_Access::load_dependencies()}
73 * + {@see WP_Data_Access::set_locale()}
74 * + {@see WP_Data_Access::define_admin_hooks()}
75 * + {@see WP_Data_Access::define_public_hooks()}
76 *
77 * @since 1.0.0
78 *
79 * @see WP_Data_Access::load_dependencies()
80 * @see WP_Data_Access::set_locale()
81 * @see WP_Data_Access::define_admin_hooks()
82 * @see WP_Data_Access::define_public_hooks()
83 */
84 public function __construct() {
85 if ( isset( $_REQUEST['page'] ) ) {
86 $this->page = sanitize_text_field( wp_unslash( $_REQUEST['page'] ) );
87 }
88 $this->load_dependencies();
89 $this->set_locale();
90 $this->define_admin_hooks();
91 $this->define_public_hooks();
92 // WP Data Access REST API.
93 $this->api();
94 }
95
96 /**
97 * Add WP Data Access JSON REST API
98 *
99 * @return void
100 */
101 private function api() {
102 $api = new \WPDataAccess\API\WPDA_API();
103 $this->loader->add_action( 'init', $api, 'hide' );
104 $this->loader->add_action( 'rest_api_init', $api, 'init' );
105 }
106
107 /**
108 * Load required dependencies
109 *
110 * Loads required plugin files and initiates the plugin loader.
111 *
112 * @since 1.0.0
113 *
114 * @see WP_Data_Access_Loader
115 */
116 private function load_dependencies() {
117 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wp-data-access-loader.php';
118 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wp-data-access-i18n.php';
119 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-wp-data-access-admin.php';
120 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/class-wp-data-access-public.php';
121 $this->loader = new WP_Data_Access_Loader();
122 }
123
124 /**
125 * Set locale for internationalization
126 *
127 * @since 1.0.0
128 *
129 * @see WP_Data_Access_I18n
130 */
131 private function set_locale() {
132 $wpda_i18n = new WP_Data_Access_I18n();
133 $this->loader->add_action( 'init', $wpda_i18n, 'load_plugin_textdomain' );
134 }
135
136 /**
137 * Add admin hooks
138 *
139 * Initiates {@see WP_Data_Access_Admin} (admin functionality) and {@see WPDA_Export} (export functionality).
140 * Adds the appropriate actions to the loader.
141 *
142 * @since 1.0.0
143 *
144 * @see WP_Data_Access_Admin
145 * @see WPDA_Export
146 */
147 private function define_admin_hooks() {
148 $plugin_admin = new WP_Data_Access_Admin();
149 if ( WPDA::is_plugin_page( $this->page ) ) {
150 // Handle plugin cookies.
151 $wpda_cookies = new WPDA_Cookies();
152 $this->loader->add_action( 'admin_init', $wpda_cookies, 'handle_plugin_cookies' );
153 }
154 // Admin menu.
155 $this->loader->add_action( 'admin_menu', $plugin_admin, 'add_menu_items' );
156 $this->loader->add_filter( 'submenu_file', $plugin_admin, 'wpda_submenu_filter' );
157 // Admin scripts.
158 $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
159 $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
160 $this->loader->add_action( 'in_admin_header', $plugin_admin, 'user_admin_notices' );
161 $this->loader->add_action( 'admin_head', $plugin_admin, 'remove_icons' );
162 // Add settings page.
163 $this->loader->add_action( 'admin_menu', $this, 'wpdataaccess_register_settings_page' );
164 // Query Builder.
165 $query_builder = new WPDA_Query_Builder();
166 $this->loader->add_action( 'admin_action_wpda_query_builder_execute_sql', $query_builder, 'execute' );
167 $this->loader->add_action( 'admin_action_wpda_query_builder_save_sql', $query_builder, 'save' );
168 $this->loader->add_action( 'admin_action_wpda_query_builder_open_sql', $query_builder, 'open' );
169 $this->loader->add_action( 'admin_action_wpda_query_builder_delete_sql', $query_builder, 'delete' );
170 $this->loader->add_action( 'admin_action_wpda_query_builder_get_db_hints', $query_builder, 'get_db_hints' );
171 $this->loader->add_action( 'admin_action_wpda_query_builder_set_db_hints', $query_builder, 'set_db_hints' );
172 $this->loader->add_action( 'admin_action_wpda_query_builder_get_vqb', $query_builder, 'get_visual_query_ajax' );
173 // Run unattended scheduled export
174 $this->loader->add_action( \WPDataAccess\Utilities\WPDA_Export_Scheduler::SCHEDULER_HOOK_NAME, \WPDataAccess\Utilities\WPDA_Export_Scheduler::class, 'run_scheduled_export' );
175 // Mail service.
176 $wpda_mail_server = \WPDataAccess\Utilities\WPDA_Mail::get_option();
177 if ( isset(
178 $wpda_mail_server['host'],
179 $wpda_mail_server['port'],
180 $wpda_mail_server['authenticate'],
181 $wpda_mail_server['encryption'],
182 $wpda_mail_server['skip_verify'],
183 $wpda_mail_server['username'],
184 $wpda_mail_server['password']
185 ) ) {
186 add_action(
187 'phpmailer_init',
188 function ( $phpmailer ) use($wpda_mail_server) {
189 // Only run if mail WPDA requests.
190 if ( !did_action( 'wpda_sending_mail' ) ) {
191 return;
192 // Allow other plugins/themes to overwrite.
193 }
194 $phpmailer->isSMTP();
195 $phpmailer->isHTML( false );
196 $phpmailer->SMTPDebug = $wpda_mail_server['debug'] ?? 0;
197 $phpmailer->Host = $wpda_mail_server['host'];
198 $phpmailer->Port = $wpda_mail_server['port'];
199 $phpmailer->SMTPAuth = 'on' === $wpda_mail_server['authenticate'];
200 $phpmailer->SMTPSecure = $wpda_mail_server['encryption'];
201 if ( 'on' === $wpda_mail_server['skip_verify'] ) {
202 $phpmailer->SMTPOptions = array(
203 'ssl' => array(
204 'verify_peer' => false,
205 'verify_peer_name' => false,
206 'allow_self_signed' => true,
207 ),
208 );
209 }
210 $phpmailer->Username = $wpda_mail_server['username'];
211 $phpmailer->Password = $wpda_mail_server['password'];
212 $phpmailer->From = $wpda_mail_server['username'];
213 },
214 10,
215 1
216 );
217 }
218 // Export action.
219 $this->loader->add_action( 'admin_action_wpda_export', WPDA_Export::class, 'export' );
220 // Dashboard and widgets.
221 $this->loader->add_action( 'wp_ajax_wpda_save_dashboard', WPDA_Dashboard::class, 'save' );
222 $this->loader->add_action( 'wp_ajax_wpda_dashboard_list', WPDA_Dashboard::class, 'get_list' );
223 $this->loader->add_action( 'wp_ajax_wpda_widget_load_panel', WPDA_Dashboard::class, 'load_widget' );
224 $this->loader->add_action( 'wp_ajax_wpda_widget_delete', WPDA_Dashboard::class, 'delete_widget' );
225 $this->loader->add_action( 'wp_ajax_wpda_widget_code_add', WPDA_Widget_Code::class, 'ajax_widget' );
226 $this->loader->add_action( 'wp_ajax_wpda_widget_dbms_add', WPDA_Widget_Dbms::class, 'ajax_widget' );
227 $this->loader->add_action( 'wp_ajax_wpda_widget_dbms_refresh', WPDA_Widget_Dbms::class, 'ajax_refresh' );
228 $this->loader->add_action( 'wp_ajax_wpda_remove_new_dashboard_message', WPDA_Dashboard::class, 'remove_new_dashboard_message' );
229 $this->loader->add_action( 'wp_ajax_wpda_widget_pub_add', WPDA_Widget_Publication::class, 'ajax_widget' );
230 $this->loader->add_action( 'wp_ajax_wpda_widget_chart_add', WPDA_Widget_Google_Chart::class, 'ajax_widget' );
231 $this->loader->add_action( 'wp_ajax_wpda_widget_chart_refresh', WPDA_Widget_Google_Chart::class, 'ajax_refresh' );
232 // Add/remove favourites.
233 // ???
234 $plugin_favourites = new WPDA_Favourites();
235 $this->loader->add_action( 'admin_action_wpda_add_favourite', $plugin_favourites, 'add' );
236 $this->loader->add_action( 'admin_action_wpda_rem_favourite', $plugin_favourites, 'rem' );
237 $plugin_dictionary_list = new WPDA_Dictionary_Lists();
238 // Get tables for a specific database.
239 $this->loader->add_action( 'admin_action_wpda_get_tables', $plugin_dictionary_list, 'get_tables_ajax' );
240 // Get columns for a specific table.
241 $this->loader->add_action( 'admin_action_wpda_get_columns', $plugin_dictionary_list, 'get_columns' );
242 // Get row count for a specific table.
243 $this->loader->add_action( 'admin_action_wpda_get_table_row_count', $plugin_dictionary_list, 'get_table_row_count_ajax' );
244 // Get table widget info.
245 $this->loader->add_action( 'admin_action_wpda_get_table_widget_info', $plugin_dictionary_list, 'get_table_widget_info_ajax' );
246 // Global database search and replace.
247 $this->loader->add_action( 'wp_ajax_wpda_global_search', \WPDataAccess\Global_Search\WPDA_Global_Search::class, 'search' );
248 $this->loader->add_action( 'wp_ajax_wpda_global_replace', \WPDataAccess\Global_Search\WPDA_Global_Search::class, 'replace' );
249 // Export project.
250 $plugin_export_project = new WPDP_Export_Project();
251 $this->loader->add_action( 'admin_action_wpda_export_project', $plugin_export_project, 'export' );
252 // Data backup.
253 $wpda_data_backup = new WPDA_Data_Export();
254 $this->loader->add_action( 'wpda_data_backup', $wpda_data_backup, 'wpda_data_backup' );
255 // Allow to add multiple user roles.
256 $wpda_roles = new WPDA_Roles();
257 $this->loader->add_action( 'user_new_form', $wpda_roles, 'multiple_roles_selection' );
258 $this->loader->add_action( 'edit_user_profile', $wpda_roles, 'multiple_roles_selection' );
259 $this->loader->add_action( 'profile_update', $wpda_roles, 'multiple_roles_update' );
260 $this->loader->add_filter( 'manage_users_columns', $wpda_roles, 'multiple_roles_label' );
261 // Check if a remote db connection can be established via ajax.
262 $wpdadb = new WPDADB();
263 $this->loader->add_action( 'admin_action_wpda_check_remote_database_connection', $wpdadb, 'check_remote_database_connection' );
264 // Make WordPress user ID available to database connections.
265 add_action(
266 'wpda_dbinit',
267 function ( $wpdadb ) {
268 if ( null !== $wpdadb ) {
269 $suppress_errors = $wpdadb->suppress_errors( true );
270 $wpdadb->query( 'set @wpda_wp_user_id = ' . get_current_user_id() );
271 $wpdadb->suppress_errors( $suppress_errors );
272 }
273 },
274 10,
275 1
276 );
277 add_action(
278 'wp_ajax_wpda_dbinit_admin',
279 function () {
280 if ( !isset( $_POST['wpnonce'], $_POST['wpdaschema_name'] ) ) {
281 WPDA::sent_header( 'application/json' );
282 WPDA::sent_msg( 'ERROR', 'Invalid arguments' );
283 wp_die();
284 }
285 // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotValidated
286 $wpnonce = sanitize_text_field( wp_unslash( $_REQUEST['wpnonce'] ) );
287 if ( !WPDA::current_user_is_admin() || !wp_verify_nonce( $wpnonce, 'wpda_dbinit_admin_' . WPDA::get_current_user_login() ) ) {
288 WPDA::sent_header( 'application/json' );
289 WPDA::sent_msg( 'ERROR', 'Not authorized' );
290 wp_die();
291 }
292 $wpdaschema_name = sanitize_text_field( wp_unslash( $_REQUEST['wpdaschema_name'] ) );
293 // phpcs:enable WordPress.Security.ValidatedSanitizedInput.InputNotValidated
294 $wpdadb = WPDADB::get_db_connection( $wpdaschema_name );
295 if ( null === $wpdadb ) {
296 WPDA::sent_header( 'application/json' );
297 WPDA::sent_msg( 'ERROR', 'Cannot connect to database' );
298 wp_die();
299 }
300 $suppress_errors = $wpdadb->suppress_errors( true );
301 $wpdadb->query( 'create function wpda_get_wp_user_id() returns integer deterministic no sql return @wpda_wp_user_id' );
302 $error = $wpdadb->last_error;
303 $wpdadb->suppress_errors( $suppress_errors );
304 if ( '' === $error ) {
305 // phpcs:ignore -- 8.1 proof
306 WPDA::sent_msg( 'OK', '' );
307 } else {
308 WPDA::sent_msg( 'ERROR', "Function not created [{$error}]" );
309 }
310 wp_die();
311 },
312 10,
313 1
314 );
315 // Add id to wpda_datatables.js (for IE).
316 $this->loader->add_filter(
317 'script_loader_tag',
318 $this,
319 'add_id_to_script',
320 10,
321 3
322 );
323 // Add CSV mapping calls.
324 $wpda_csv_uploads_model = new WPDA_CSV_Uploads_Model();
325 $this->loader->add_action( 'admin_action_wpda_save_csv_mapping', $wpda_csv_uploads_model, 'save_mapping' );
326 $this->loader->add_action( 'admin_action_wpda_csv_preview_mapping', $wpda_csv_uploads_model, 'preview_mapping' );
327 // Data Tables services.
328 $this->loader->add_action( 'wp_ajax_wpda_test_publication', \WPDataAccess\Data_Publisher\WPDA_Publisher_Form::class, 'test_publication' );
329 // Add custom CSS to freemius pages.
330 add_action(
331 'admin_footer',
332 function () {
333 if ( WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-account' === $this->page || WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-pricing' === $this->page ) {
334 ?>
335 <script type="application/javascript">
336 jQuery(function() {
337 jQuery.each(document.styleSheets, function (index, cssFile) {
338 if (cssFile.href!==null && cssFile.href.toString().includes("load-styles.php")) {
339 var classes = cssFile.rules || cssFile.cssRules;
340 for (var x=0; x<classes.length; x++) {
341 if (
342 classes[x].selectorText!==undefined &&
343 classes[x].selectorText!==null &&
344 classes[x].selectorText.includes("#adminmenu li.current a.menu-top")
345 ) {
346 jQuery("#adminmenu #toplevel_page_wpda a.menu-top").attr("style", classes[x].style.cssText);
347 }
348 }
349 }
350 });
351 });
352 </script>
353 <?php
354 }
355 },
356 10,
357 1
358 );
359 add_action(
360 'wpda_set_hard_row_count',
361 function ( $dbs, $tbl ) {
362 // Only admins and super admins.
363 if ( WPDA::current_user_is_admin() ) {
364 // Get actual row count.
365 $count = \WPDataAccess\API\WPDA_Actions::get_row_count( $dbs, $tbl );
366 // Get table settings.
367 $settings_db = WPDA_Table_Settings_Model::query( $tbl, $dbs );
368 if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
369 // Convert string to JSON.
370 $settings = json_decode( $settings_db[0]['wpda_table_settings'], true );
371 if ( isset( $settings['table_settings']['row_count_estimate_value_hard'] ) ) {
372 // Store actual row count as hard estimate.
373 $settings['table_settings']['row_count_estimate_value_hard'] = $count;
374 // Save new hard row count.
375 WPDA_Table_Settings_Model::update( $tbl, json_encode( $settings ), $dbs );
376 }
377 }
378 }
379 },
380 10,
381 2
382 );
383 }
384
385 /**
386 * Needed for JDT to support IE
387 *
388 * @param string $tag Tag.
389 * @param string $handle Handle.
390 * @param string $src Source.
391 * @return mixed|string
392 */
393 public function add_id_to_script( $tag, $handle, $src ) {
394 if ( 'wpda_datatables' === $handle ) {
395 // phpcs:disable WordPress.WP.EnqueuedResources.NonEnqueuedScript
396 $tag = '<script id="wpda_datatables" src="' . $src . '"></script>';
397 // phpcs:enable WordPress.WP.EnqueuedResources.NonEnqueuedScript
398 }
399 return $tag;
400 }
401
402 /**
403 * Add public hooks
404 *
405 * Initiates {@see WP_Data_Access_Public} (public functionality), {@see WPDA_Data_Tables} (ajax call to support
406 * server side jQuery DataTables functionality). Adds the appropriate actions to
407 * the loader.
408 *
409 * @since 1.0.0
410 *
411 * @see WP_Data_Access_Public
412 * @see WPDA_Data_Tables
413 * @see WPDA_Dictionary_Lists
414 */
415 private function define_public_hooks() {
416 $plugin_public = new WP_Data_Access_Public();
417 // Shortcodes.
418 $this->loader->add_action( 'init', $plugin_public, 'register_shortcodes' );
419 // Public scripts.
420 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
421 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
422 $this->loader->add_action(
423 'admin_bar_menu',
424 $plugin_public,
425 'add_apps_to_admin_toolbar',
426 9999
427 );
428 $this->loader->add_action(
429 'admin_bar_menu',
430 $plugin_public,
431 'add_data_projects_to_admin_toolbar',
432 9999
433 );
434 // Ajax calls.
435 $plugin_datatables = new WPDA_Data_Tables();
436 $this->loader->add_action( 'wp_ajax_wpda_datatables', $plugin_datatables, 'get_data' );
437 $this->loader->add_action( 'wp_ajax_nopriv_wpda_datatables', $plugin_datatables, 'get_data' );
438 // Export action.
439 $this->loader->add_action( 'wp_ajax_wpda_export', WPDA_Export::class, 'export_ajax' );
440 $this->loader->add_action( 'wp_ajax_nopriv_wpda_export', WPDA_Export::class, 'export_ajax' );
441 // Add id to wpda_datatables.js (for IE).
442 $this->loader->add_filter(
443 'script_loader_tag',
444 $this,
445 'add_id_to_script',
446 10,
447 3
448 );
449 // Autocomplete.
450 $autocomplete_service = new WPDA_Autocomplete();
451 $this->loader->add_action( 'wp_ajax_wpda_autocomplete', $autocomplete_service, 'autocomplete' );
452 $this->loader->add_action( 'wp_ajax_nopriv_wpda_autocomplete', $autocomplete_service, 'autocomplete_anonymous' );
453 }
454
455 /**
456 * Start plugin loader
457 *
458 * @since 1.0.0
459 */
460 public function run() {
461 $this->loader->add_action( 'init', $this, 'register_blocks' );
462 $this->loader->add_action( 'enqueue_block_assets', $this, 'enqueue_block_assets' );
463 $this->loader->run();
464 }
465
466 public function register_blocks() {
467 register_block_type( plugin_dir_path( dirname( __FILE__ ) ) . 'assets/gtb', array(
468 'render_callback' => array($this, 'render_wp_data_access_app_block'),
469 ) );
470 }
471
472 public function enqueue_block_assets() {
473 wp_enqueue_style( 'dashicons' );
474 }
475
476 public function render_wp_data_access_app_block( $attributes ) {
477 $appid = ( isset( $attributes['appid'] ) ? sanitize_text_field( $attributes['appid'] ) : '' );
478 $feedback = filter_var( $attributes['feedback'] ?? false, FILTER_VALIDATE_BOOLEAN );
479 $builders = filter_var( $attributes['builders'] ?? false, FILTER_VALIDATE_BOOLEAN );
480 $hidetitlebar = filter_var( $attributes['hidetitlebar'] ?? false, FILTER_VALIDATE_BOOLEAN );
481 $fullscreen = filter_var( $attributes['fullscreen'] ?? false, FILTER_VALIDATE_BOOLEAN );
482 if ( empty( $appid ) ) {
483 return null;
484 }
485 if ( !shortcode_exists( 'wpda_app' ) ) {
486 return 'Shortcode wpda_app is not registered.';
487 }
488 $shortcode = sprintf(
489 '[wpda_app app_id="%s" builders="%s" feedback="%s" hidetitlebar="%s" fullscreen="%s"]',
490 esc_attr( $appid ),
491 ( $builders ? 'false' : 'true' ),
492 ( $feedback ? 'true' : 'false' ),
493 ( $hidetitlebar ? 'true' : 'false' ),
494 ( $fullscreen ? 'true' : 'false' )
495 );
496 $wrapper_attributes = get_block_wrapper_attributes( array(
497 'class' => 'wpda-wp-data-access-app',
498 ) );
499 return sprintf( '<div %s>%s</div>', $wrapper_attributes, do_shortcode( $shortcode ) );
500 }
501
502 /**
503 * Add plugin settings page
504 */
505 public function wpdataaccess_register_settings_page() {
506 add_options_page(
507 'WP Data Access',
508 'WP Data Access',
509 'manage_options',
510 WP_Data_Access_Admin::PAGE_SETTINGS,
511 array($this, 'wpdataaccess_settings_page')
512 );
513 }
514
515 /**
516 * Show settings page
517 */
518 public function wpdataaccess_settings_page() {
519 WPDA_Dashboard::add_dashboard();
520 $current_tab = ( isset( $_REQUEST['tab'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['tab'] ) ) : 'plugin' );
521 switch ( $current_tab ) {
522 case 'apps':
523 $wpda_settings_class_name = 'WPDA_Settings_Apps';
524 break;
525 case 'backend':
526 $wpda_settings_class_name = 'WPDA_Settings_BackEnd';
527 break;
528 case 'frontend':
529 $wpda_settings_class_name = 'WPDA_Settings_FrontEnd';
530 break;
531 case 'pds':
532 $wpda_settings_class_name = 'WPDA_Settings_PDS';
533 break;
534 case 'uninstall':
535 $wpda_settings_class_name = 'WPDA_Settings_Uninstall';
536 break;
537 case 'repository':
538 $wpda_settings_class_name = 'WPDA_Settings_ManageRepository';
539 break;
540 case 'system':
541 $wpda_settings_class_name = 'WPDA_Settings_SystemInfo';
542 break;
543 case 'mail':
544 $wpda_settings_class_name = 'WPDA_Settings_Mail';
545 break;
546 case 'drives':
547 $wpda_settings_class_name = 'WPDA_Settings_Drives';
548 break;
549 case 'legacy':
550 $wpda_settings_class_name = 'WPDA_Settings_Legacy';
551 break;
552 default:
553 $wpda_settings_class_name = 'WPDA_Settings_Plugin';
554 }
555 $wpda_settings_class_name = '\\WPDataAccess\\Settings\\' . $wpda_settings_class_name;
556 $wpda_settings = new $wpda_settings_class_name($current_tab);
557 $wpda_settings->show();
558 }
559
560 }
561
562 // phpcs:enable WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing