PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.41
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.41
5.5.84 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 All 160 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.41, at includes/class-wp-data-access.php

511 lines 21.8 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\Utilities\WPDA_Table_Actions;
13 use WPDataAccess\Utilities\WPDA_Export;
14 use WPDataAccess\Utilities\WPDA_Favourites;
15 use WPDataAccess\WPDA;
16 use WPDataProjects\Utilities\WPDP_Export_Project;
17 use WPDataAccess\Backup\WPDA_Data_Export;
18 use WPDataAccess\Plugin_Table_Models\WPDA_CSV_Uploads_Model;
19 use WPDataRoles\WPDA_Roles;
20 use WPDataAccess\Utilities\WPDA_Autocomplete;
21 use WPDataAccess\Premium\WPDAPRO_Geo_Location\WPDAPRO_Geo_Location_WS;
22 use WPDataAccess\Premium\WPDAPRO_Geo_Location\WPDAPRO_Geo_Location;
23 use WPDataAccess\Query_Builder\WPDA_Query_Builder;
24 use WPDataAccess\Dashboard\WPDA_Dashboard;
25 use WPDataAccess\Dashboard\WPDA_Widget_Code;
26 use WPDataAccess\Dashboard\WPDA_Widget_Publication;
27 use WPDataAccess\Dashboard\WPDA_Widget_Dbms;
28 use WPDataAccess\Dashboard\WPDA_Widget_Google_Chart;
29 use WPDataAccess\Premium\WPDAPRO_Dashboard\WPDAPRO_Widget_Project;
30 /**
31 * Class WP_Data_Access
32 *
33 * Core plugin class used to define:
34 * + admin specific functionality {@see WP_Data_Access_Admin}
35 * + public specific functionality {@see WP_Data_Access_Public}
36 * + internationalization {@see WP_Data_Access_I18n}
37 * + plugin activation and deactivation {@see WP_Data_Access_Loader}
38 *
39 * @author Peter Schulz
40 * @since 1.0.0
41 *
42 * @see WP_Data_Access_Admin
43 * @see WP_Data_Access_Public
44 * @see WP_Data_Access_I18n
45 * @see WP_Data_Access_Loader
46 */
47 class WP_Data_Access {
48 /**
49 * Reference to plugin loader
50 *
51 * @var WP_Data_Access_Loader
52 *
53 * @since 1.0.0
54 *
55 * @see WP_Data_Access_Loader
56 */
57 protected $loader;
58
59 /**
60 * Menu slug or null
61 *
62 * @var null
63 */
64 protected $page = null;
65
66 /**
67 * WP_Data_Access constructor
68 *
69 * Calls method the following methods to setup plugin:
70 * + {@see WP_Data_Access::load_dependencies()}
71 * + {@see WP_Data_Access::set_locale()}
72 * + {@see WP_Data_Access::define_admin_hooks()}
73 * + {@see WP_Data_Access::define_public_hooks()}
74 *
75 * @since 1.0.0
76 *
77 * @see WP_Data_Access::load_dependencies()
78 * @see WP_Data_Access::set_locale()
79 * @see WP_Data_Access::define_admin_hooks()
80 * @see WP_Data_Access::define_public_hooks()
81 */
82 public function __construct() {
83 if ( isset( $_REQUEST['page'] ) ) {
84 // phpcs:ignore WordPress.Security.NonceVerification
85 $this->page = sanitize_text_field( wp_unslash( $_REQUEST['page'] ) );
86 // phpcs:ignore WordPress.Security.NonceVerification
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_action(
157 'admin_menu',
158 $plugin_admin,
159 'add_menu_my_tables',
160 11
161 );
162 $this->loader->add_filter( 'submenu_file', $plugin_admin, 'wpda_submenu_filter' );
163 // Admin scripts.
164 $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
165 $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
166 $this->loader->add_action( 'in_admin_header', $plugin_admin, 'user_admin_notices' );
167 $this->loader->add_action( 'admin_head', $plugin_admin, 'remove_icons' );
168 // Add settings page.
169 $this->loader->add_action( 'admin_menu', $this, 'wpdataaccess_register_settings_page' );
170 // Query Builder.
171 $query_builder = new WPDA_Query_Builder();
172 $this->loader->add_action( 'admin_action_wpda_query_builder_execute_sql', $query_builder, 'execute' );
173 $this->loader->add_action( 'admin_action_wpda_query_builder_save_sql', $query_builder, 'save' );
174 $this->loader->add_action( 'admin_action_wpda_query_builder_open_sql', $query_builder, 'open' );
175 $this->loader->add_action( 'admin_action_wpda_query_builder_delete_sql', $query_builder, 'delete' );
176 $this->loader->add_action( 'admin_action_wpda_query_builder_get_db_hints', $query_builder, 'get_db_hints' );
177 $this->loader->add_action( 'admin_action_wpda_query_builder_set_db_hints', $query_builder, 'set_db_hints' );
178 $this->loader->add_action( 'admin_action_wpda_query_builder_get_vqb', $query_builder, 'get_visual_query' );
179 // Mail service.
180 $wpda_mail_server = \WPDataAccess\Utilities\WPDA_Mail::get_option();
181 if ( isset(
182 $wpda_mail_server['host'],
183 $wpda_mail_server['port'],
184 $wpda_mail_server['authenticate'],
185 $wpda_mail_server['encryption'],
186 $wpda_mail_server['skip_verify'],
187 $wpda_mail_server['username'],
188 $wpda_mail_server['password']
189 ) ) {
190 add_action(
191 'phpmailer_init',
192 function ( $phpmailer ) use($wpda_mail_server) {
193 $phpmailer->isSMTP();
194 $phpmailer->isHTML( false );
195 $phpmailer->SMTPDebug = $wpda_mail_server['debug'] ?? 0;
196 $phpmailer->Host = $wpda_mail_server['host'];
197 $phpmailer->Port = $wpda_mail_server['port'];
198 $phpmailer->SMTPAuth = 'on' === $wpda_mail_server['authenticate'];
199 $phpmailer->SMTPSecure = $wpda_mail_server['encryption'];
200 if ( 'on' === $wpda_mail_server['skip_verify'] ) {
201 $phpmailer->SMTPOptions = array(
202 'ssl' => array(
203 'verify_peer' => false,
204 'verify_peer_name' => false,
205 'allow_self_signed' => true,
206 ),
207 );
208 }
209 $phpmailer->Username = $wpda_mail_server['username'];
210 $phpmailer->Password = $wpda_mail_server['password'];
211 $phpmailer->From = $wpda_mail_server['username'];
212 },
213 10,
214 1
215 );
216 }
217 // Export action.
218 $this->loader->add_action( 'admin_action_wpda_export', WPDA_Export::class, 'export' );
219 // Dashboard and widgets.
220 $this->loader->add_action( 'wp_ajax_wpda_save_dashboard', WPDA_Dashboard::class, 'save' );
221 $this->loader->add_action( 'wp_ajax_wpda_dashboard_list', WPDA_Dashboard::class, 'get_list' );
222 $this->loader->add_action( 'wp_ajax_wpda_widget_load_panel', WPDA_Dashboard::class, 'load_widget' );
223 $this->loader->add_action( 'wp_ajax_wpda_widget_delete', WPDA_Dashboard::class, 'delete_widget' );
224 $this->loader->add_action( 'wp_ajax_wpda_widget_code_add', WPDA_Widget_Code::class, 'ajax_widget' );
225 $this->loader->add_action( 'wp_ajax_wpda_widget_dbms_add', WPDA_Widget_Dbms::class, 'ajax_widget' );
226 $this->loader->add_action( 'wp_ajax_wpda_widget_dbms_refresh', WPDA_Widget_Dbms::class, 'ajax_refresh' );
227 $this->loader->add_action( 'wp_ajax_wpda_remove_new_dashboard_message', WPDA_Dashboard::class, 'remove_new_dashboard_message' );
228 $this->loader->add_action( 'wp_ajax_wpda_widget_pub_add', WPDA_Widget_Publication::class, 'ajax_widget' );
229 $this->loader->add_action( 'wp_ajax_wpda_widget_chart_add', WPDA_Widget_Google_Chart::class, 'ajax_widget' );
230 $this->loader->add_action( 'wp_ajax_wpda_widget_chart_refresh', WPDA_Widget_Google_Chart::class, 'ajax_refresh' );
231 // Add/remove favourites.
232 $plugin_favourites = new WPDA_Favourites();
233 $this->loader->add_action( 'admin_action_wpda_add_favourite', $plugin_favourites, 'add' );
234 $this->loader->add_action( 'admin_action_wpda_rem_favourite', $plugin_favourites, 'rem' );
235 // Show tables actions.
236 $plugin_table_actions = new WPDA_Table_Actions();
237 $this->loader->add_action( 'admin_action_wpda_show_table_actions', $plugin_table_actions, 'show' );
238 $plugin_dictionary_list = new WPDA_Dictionary_Lists();
239 // Get tables for a specific database.
240 $this->loader->add_action( 'admin_action_wpda_get_tables', $plugin_dictionary_list, 'get_tables_ajax' );
241 // Get columns for a specific table.
242 $this->loader->add_action( 'admin_action_wpda_get_columns', $plugin_dictionary_list, 'get_columns' );
243 // Get row count for a specific table.
244 $this->loader->add_action( 'admin_action_wpda_get_table_row_count', $plugin_dictionary_list, 'get_table_row_count_ajax' );
245 // Get table widget info.
246 $this->loader->add_action( 'admin_action_wpda_get_table_widget_info', $plugin_dictionary_list, 'get_table_widget_info' );
247 // Global database search and replace.
248 $this->loader->add_action( 'wp_ajax_wpda_global_search', \WPDataAccess\Global_Search\WPDA_Global_Search::class, 'search' );
249 $this->loader->add_action( 'wp_ajax_wpda_global_replace', \WPDataAccess\Global_Search\WPDA_Global_Search::class, 'replace' );
250 // Export project.
251 $plugin_export_project = new WPDP_Export_Project();
252 $this->loader->add_action( 'admin_action_wpda_export_project', $plugin_export_project, 'export' );
253 // Data backup.
254 $wpda_data_backup = new WPDA_Data_Export();
255 $this->loader->add_action( 'wpda_data_backup', $wpda_data_backup, 'wpda_data_backup' );
256 // Allow to add multiple user roles.
257 $wpda_roles = new WPDA_Roles();
258 $this->loader->add_action( 'user_new_form', $wpda_roles, 'multiple_roles_selection' );
259 $this->loader->add_action( 'edit_user_profile', $wpda_roles, 'multiple_roles_selection' );
260 $this->loader->add_action( 'profile_update', $wpda_roles, 'multiple_roles_update' );
261 $this->loader->add_filter( 'manage_users_columns', $wpda_roles, 'multiple_roles_label' );
262 // Check if a remote db connection can be established via ajax.
263 $wpdadb = new WPDADB();
264 $this->loader->add_action( 'admin_action_wpda_check_remote_database_connection', $wpdadb, 'check_remote_database_connection' );
265 // Make WordPress user ID available to database connections.
266 add_action(
267 'wpda_dbinit',
268 function ( $wpdadb ) {
269 if ( null !== $wpdadb ) {
270 $suppress_errors = $wpdadb->suppress_errors( true );
271 $wpdadb->query( 'set @wpda_wp_user_id = ' . get_current_user_id() );
272 $wpdadb->suppress_errors( $suppress_errors );
273 }
274 },
275 10,
276 1
277 );
278 add_action(
279 'wp_ajax_wpda_dbinit_admin',
280 function () {
281 if ( !isset( $_POST['wpnonce'], $_POST['wpdaschema_name'] ) ) {
282 WPDA::sent_header( 'application/json' );
283 echo WPDA::sent_msg( 'ERROR', 'Invalid arguments' );
284 // phpcs:ignore WordPress.Security.EscapeOutput
285 wp_die();
286 }
287 $wpnonce = sanitize_text_field( wp_unslash( $_REQUEST['wpnonce'] ) );
288 // input var okay.
289 if ( !WPDA::current_user_is_admin() || !wp_verify_nonce( $wpnonce, 'wpda_dbinit_admin_' . WPDA::get_current_user_login() ) ) {
290 WPDA::sent_header( 'application/json' );
291 echo WPDA::sent_msg( 'ERROR', 'Not authorized' );
292 // phpcs:ignore WordPress.Security.EscapeOutput
293 wp_die();
294 }
295 $wpdaschema_name = sanitize_text_field( wp_unslash( $_REQUEST['wpdaschema_name'] ) );
296 // input var okay.
297 $wpdadb = WPDADB::get_db_connection( $wpdaschema_name );
298 if ( null === $wpdadb ) {
299 WPDA::sent_header( 'application/json' );
300 echo WPDA::sent_msg( 'ERROR', 'Cannot connect to database' );
301 // phpcs:ignore WordPress.Security.EscapeOutput
302 wp_die();
303 }
304 $suppress_errors = $wpdadb->suppress_errors( true );
305 $wpdadb->query( 'create function wpda_get_wp_user_id() returns integer deterministic no sql return @wpda_wp_user_id' );
306 $error = $wpdadb->last_error;
307 $wpdadb->suppress_errors( $suppress_errors );
308 if ( '' === $error ) {
309 //phpcs:ignore - 8.1 proof
310 echo WPDA::sent_msg( 'OK', '' );
311 // phpcs:ignore WordPress.Security.EscapeOutput
312 } else {
313 echo WPDA::sent_msg( 'ERROR', "Function not created [{$error}]" );
314 // phpcs:ignore WordPress.Security.EscapeOutput
315 }
316 wp_die();
317 },
318 10,
319 1
320 );
321 // Add id to wpda_datatables.js (for IE).
322 $this->loader->add_filter(
323 'script_loader_tag',
324 $this,
325 'add_id_to_script',
326 10,
327 3
328 );
329 // Add CSV mapping calls.
330 $wpda_csv_uploads_model = new WPDA_CSV_Uploads_Model();
331 $this->loader->add_action( 'admin_action_wpda_save_csv_mapping', $wpda_csv_uploads_model, 'save_mapping' );
332 $this->loader->add_action( 'admin_action_wpda_csv_preview_mapping', $wpda_csv_uploads_model, 'preview_mapping' );
333 // Data Tables services.
334 $this->loader->add_action( 'wp_ajax_wpda_test_publication', \WPDataAccess\Data_Publisher\WPDA_Publisher_Form::class, 'test_publication' );
335 // Add custom CSS to freemius pages.
336 add_action(
337 'admin_footer',
338 function () {
339 if ( WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-account' === $this->page || WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-pricing' === $this->page ) {
340 ?>
341 <script type="application/javascript">
342 jQuery(function() {
343 jQuery.each(document.styleSheets, function (index, cssFile) {
344 if (cssFile.href!==null && cssFile.href.toString().includes("load-styles.php")) {
345 var classes = cssFile.rules || cssFile.cssRules;
346 for (var x=0; x<classes.length; x++) {
347 if (
348 classes[x].selectorText!==undefined &&
349 classes[x].selectorText!==null &&
350 classes[x].selectorText.includes("#adminmenu li.current a.menu-top")
351 ) {
352 jQuery("#adminmenu #toplevel_page_wpda a.menu-top").attr("style", classes[x].style.cssText);
353 }
354 }
355 }
356 });
357 });
358 </script>
359 <?php
360 }
361 },
362 10,
363 1
364 );
365 }
366
367 /**
368 * Needed for JDT to support IE
369 *
370 * @param string $tag Tag.
371 * @param string $handle Handle.
372 * @param string $src Source.
373 * @return mixed|string
374 */
375 public function add_id_to_script( $tag, $handle, $src ) {
376 if ( 'wpda_datatables' === $handle ) {
377 $tag = '<script id="wpda_datatables" src="' . $src . '"></script>';
378 // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
379 }
380 return $tag;
381 }
382
383 /**
384 * Add public hooks
385 *
386 * Initiates {@see WP_Data_Access_Public} (public functionality), {@see WPDA_Data_Tables} (ajax call to support
387 * server side jQuery DataTables functionality). Adds the appropriate actions to
388 * the loader.
389 *
390 * @since 1.0.0
391 *
392 * @see WP_Data_Access_Public
393 * @see WPDA_Data_Tables
394 * @see WPDA_Dictionary_Lists
395 */
396 private function define_public_hooks() {
397 $plugin_public = new WP_Data_Access_Public();
398 // Shortcodes.
399 $this->loader->add_action( 'init', $plugin_public, 'register_shortcodes' );
400 // Public scripts.
401 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
402 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
403 $this->loader->add_action(
404 'admin_bar_menu',
405 $plugin_public,
406 'add_apps_to_admin_toolbar',
407 9999
408 );
409 $this->loader->add_action(
410 'admin_bar_menu',
411 $plugin_public,
412 'add_data_projects_to_admin_toolbar',
413 9999
414 );
415 // Ajax calls.
416 $plugin_datatables = new WPDA_Data_Tables();
417 $this->loader->add_action( 'wp_ajax_wpda_datatables', $plugin_datatables, 'get_data' );
418 $this->loader->add_action( 'wp_ajax_nopriv_wpda_datatables', $plugin_datatables, 'get_data' );
419 // Export action.
420 $this->loader->add_action( 'wp_ajax_wpda_export', WPDA_Export::class, 'export_ajax' );
421 $this->loader->add_action( 'wp_ajax_nopriv_wpda_export', WPDA_Export::class, 'export_ajax' );
422 // Add id to wpda_datatables.js (for IE).
423 $this->loader->add_filter(
424 'script_loader_tag',
425 $this,
426 'add_id_to_script',
427 10,
428 3
429 );
430 // Autocomplete.
431 $autocomplete_service = new WPDA_Autocomplete();
432 $this->loader->add_action( 'wp_ajax_wpda_autocomplete', $autocomplete_service, 'autocomplete' );
433 $this->loader->add_action( 'wp_ajax_nopriv_wpda_autocomplete', $autocomplete_service, 'autocomplete_anonymous' );
434 }
435
436 /**
437 * Start plugin loader
438 *
439 * @since 1.0.0
440 */
441 public function run() {
442 $this->loader->run();
443 }
444
445 /**
446 * Add plugin settings page
447 */
448 public function wpdataaccess_register_settings_page() {
449 add_options_page(
450 'WP Data Access',
451 'WP Data Access',
452 'manage_options',
453 WP_Data_Access_Admin::PAGE_SETTINGS,
454 array($this, 'wpdataaccess_settings_page')
455 );
456 }
457
458 /**
459 * Show settings page
460 */
461 public function wpdataaccess_settings_page() {
462 WPDA_Dashboard::add_dashboard();
463 $current_tab = ( isset( $_REQUEST['tab'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['tab'] ) ) : 'plugin' );
464 // phpcs:ignore WordPress.Security.NonceVerification
465 switch ( $current_tab ) {
466 case 'backend':
467 $wpda_settings_class_name = 'WPDA_Settings_BackEnd';
468 break;
469 case 'frontend':
470 $wpda_settings_class_name = 'WPDA_Settings_FrontEnd';
471 break;
472 case 'pds':
473 $wpda_settings_class_name = 'WPDA_Settings_PDS';
474 break;
475 case 'dashboard':
476 $wpda_settings_class_name = 'WPDA_Settings_Dashboard';
477 break;
478 case 'datatables':
479 $wpda_settings_class_name = 'WPDA_Settings_DataTables';
480 break;
481 case 'dataforms':
482 $wpda_settings_class_name = 'WPDA_Settings_DataForms';
483 break;
484 case 'databackup':
485 $wpda_settings_class_name = 'WPDA_Settings_DataBackup';
486 break;
487 case 'uninstall':
488 $wpda_settings_class_name = 'WPDA_Settings_Uninstall';
489 break;
490 case 'repository':
491 $wpda_settings_class_name = 'WPDA_Settings_ManageRepository';
492 break;
493 case 'roles':
494 $wpda_settings_class_name = 'WPDA_Settings_ManageRoles';
495 break;
496 case 'system':
497 $wpda_settings_class_name = 'WPDA_Settings_SystemInfo';
498 break;
499 case 'mail':
500 $wpda_settings_class_name = 'WPDA_Settings_Mail';
501 break;
502 default:
503 $wpda_settings_class_name = 'WPDA_Settings_Plugin';
504 }
505 $wpda_settings_class_name = '\\WPDataAccess\\Settings\\' . $wpda_settings_class_name;
506 $wpda_settings = new $wpda_settings_class_name($current_tab);
507 $wpda_settings->show();
508 }
509
510 }
511