PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.29
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.29
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.29, at includes/class-wp-data-access.php

483 lines 21.1 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 // Export action.
180 $this->loader->add_action( 'admin_action_wpda_export', WPDA_Export::class, 'export' );
181 // Dashboard and widgets.
182 $this->loader->add_action( 'wp_ajax_wpda_save_dashboard', WPDA_Dashboard::class, 'save' );
183 $this->loader->add_action( 'wp_ajax_wpda_dashboard_list', WPDA_Dashboard::class, 'get_list' );
184 $this->loader->add_action( 'wp_ajax_wpda_widget_load_panel', WPDA_Dashboard::class, 'load_widget' );
185 $this->loader->add_action( 'wp_ajax_wpda_widget_delete', WPDA_Dashboard::class, 'delete_widget' );
186 $this->loader->add_action( 'wp_ajax_wpda_widget_code_add', WPDA_Widget_Code::class, 'ajax_widget' );
187 $this->loader->add_action( 'wp_ajax_wpda_widget_dbms_add', WPDA_Widget_Dbms::class, 'ajax_widget' );
188 $this->loader->add_action( 'wp_ajax_wpda_widget_dbms_refresh', WPDA_Widget_Dbms::class, 'ajax_refresh' );
189 $this->loader->add_action( 'wp_ajax_wpda_remove_new_dashboard_message', WPDA_Dashboard::class, 'remove_new_dashboard_message' );
190 $this->loader->add_action( 'wp_ajax_wpda_widget_pub_add', WPDA_Widget_Publication::class, 'ajax_widget' );
191 $this->loader->add_action( 'wp_ajax_wpda_widget_chart_add', WPDA_Widget_Google_Chart::class, 'ajax_widget' );
192 $this->loader->add_action( 'wp_ajax_wpda_widget_chart_refresh', WPDA_Widget_Google_Chart::class, 'ajax_refresh' );
193 // Add/remove favourites.
194 $plugin_favourites = new WPDA_Favourites();
195 $this->loader->add_action( 'admin_action_wpda_add_favourite', $plugin_favourites, 'add' );
196 $this->loader->add_action( 'admin_action_wpda_rem_favourite', $plugin_favourites, 'rem' );
197 // Show tables actions.
198 $plugin_table_actions = new WPDA_Table_Actions();
199 $this->loader->add_action( 'admin_action_wpda_show_table_actions', $plugin_table_actions, 'show' );
200 $plugin_dictionary_list = new WPDA_Dictionary_Lists();
201 // Get tables for a specific database.
202 $this->loader->add_action( 'admin_action_wpda_get_tables', $plugin_dictionary_list, 'get_tables_ajax' );
203 // Get columns for a specific table.
204 $this->loader->add_action( 'admin_action_wpda_get_columns', $plugin_dictionary_list, 'get_columns' );
205 // Get row count for a specific table.
206 $this->loader->add_action( 'admin_action_wpda_get_table_row_count', $plugin_dictionary_list, 'get_table_row_count_ajax' );
207 // Get table widget info.
208 $this->loader->add_action( 'admin_action_wpda_get_table_widget_info', $plugin_dictionary_list, 'get_table_widget_info' );
209 // Global database search and replace.
210 $this->loader->add_action( 'wp_ajax_wpda_global_search', \WPDataAccess\Global_Search\WPDA_Global_Search::class, 'search' );
211 $this->loader->add_action( 'wp_ajax_wpda_global_replace', \WPDataAccess\Global_Search\WPDA_Global_Search::class, 'replace' );
212 // Export project.
213 $plugin_export_project = new WPDP_Export_Project();
214 $this->loader->add_action( 'admin_action_wpda_export_project', $plugin_export_project, 'export' );
215 // Data backup.
216 $wpda_data_backup = new WPDA_Data_Export();
217 $this->loader->add_action( 'wpda_data_backup', $wpda_data_backup, 'wpda_data_backup' );
218 // Allow to add multiple user roles.
219 $wpda_roles = new WPDA_Roles();
220 $this->loader->add_action( 'user_new_form', $wpda_roles, 'multiple_roles_selection' );
221 $this->loader->add_action( 'edit_user_profile', $wpda_roles, 'multiple_roles_selection' );
222 $this->loader->add_action( 'profile_update', $wpda_roles, 'multiple_roles_update' );
223 $this->loader->add_filter( 'manage_users_columns', $wpda_roles, 'multiple_roles_label' );
224 // Check if a remote db connection can be established via ajax.
225 $wpdadb = new WPDADB();
226 $this->loader->add_action( 'admin_action_wpda_check_remote_database_connection', $wpdadb, 'check_remote_database_connection' );
227 // Make WordPress user ID available to database connections.
228 add_action(
229 'wpda_dbinit',
230 function ( $wpdadb ) {
231 if ( null !== $wpdadb ) {
232 $suppress_errors = $wpdadb->suppress_errors( true );
233 $wpdadb->query( 'set @wpda_wp_user_id = ' . get_current_user_id() );
234 $wpdadb->suppress_errors( $suppress_errors );
235 }
236 },
237 10,
238 1
239 );
240 add_action(
241 'wp_ajax_wpda_dbinit_admin',
242 function () {
243 if ( !isset( $_POST['wpnonce'], $_POST['wpdaschema_name'] ) ) {
244 WPDA::sent_header( 'application/json' );
245 echo WPDA::sent_msg( 'ERROR', 'Invalid arguments' );
246 // phpcs:ignore WordPress.Security.EscapeOutput
247 wp_die();
248 }
249 $wpnonce = sanitize_text_field( wp_unslash( $_REQUEST['wpnonce'] ) );
250 // input var okay.
251 if ( !current_user_can( 'manage_options' ) || !wp_verify_nonce( $wpnonce, 'wpda_dbinit_admin_' . WPDA::get_current_user_login() ) ) {
252 WPDA::sent_header( 'application/json' );
253 echo WPDA::sent_msg( 'ERROR', 'Not authorized' );
254 // phpcs:ignore WordPress.Security.EscapeOutput
255 wp_die();
256 }
257 $wpdaschema_name = sanitize_text_field( wp_unslash( $_REQUEST['wpdaschema_name'] ) );
258 // input var okay.
259 $wpdadb = WPDADB::get_db_connection( $wpdaschema_name );
260 if ( null === $wpdadb ) {
261 WPDA::sent_header( 'application/json' );
262 echo WPDA::sent_msg( 'ERROR', 'Cannot connect to database' );
263 // phpcs:ignore WordPress.Security.EscapeOutput
264 wp_die();
265 }
266 $suppress_errors = $wpdadb->suppress_errors( true );
267 $wpdadb->query( 'create function wpda_get_wp_user_id() returns integer deterministic no sql return @wpda_wp_user_id' );
268 $error = $wpdadb->last_error;
269 $fnc = $wpdadb->dbh->query( "show function status like 'wpda_get_wp_user_id'" );
270 $wpdadb->suppress_errors( $suppress_errors );
271 if ( 1 === count( (array) $fnc ) ) {
272 //phpcs:ignore - 8.1 proof
273 echo WPDA::sent_msg( 'OK', '' );
274 // phpcs:ignore WordPress.Security.EscapeOutput
275 } else {
276 echo WPDA::sent_msg( 'ERROR', "Function not created [{$error}]" );
277 // phpcs:ignore WordPress.Security.EscapeOutput
278 }
279 wp_die();
280 },
281 10,
282 1
283 );
284 // Add id to wpda_datatables.js (for IE).
285 $this->loader->add_filter(
286 'script_loader_tag',
287 $this,
288 'add_id_to_script',
289 10,
290 3
291 );
292 // Add CSV mapping calls.
293 $wpda_csv_uploads_model = new WPDA_CSV_Uploads_Model();
294 $this->loader->add_action( 'admin_action_wpda_save_csv_mapping', $wpda_csv_uploads_model, 'save_mapping' );
295 $this->loader->add_action( 'admin_action_wpda_csv_preview_mapping', $wpda_csv_uploads_model, 'preview_mapping' );
296 // Data Tables services.
297 $this->loader->add_action( 'wp_ajax_wpda_test_publication', \WPDataAccess\Data_Publisher\WPDA_Publisher_Form::class, 'test_publication' );
298 // Add custom CSS to freemius pages.
299 add_action(
300 'admin_footer',
301 function () {
302 if ( WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-account' === $this->page || WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-pricing' === $this->page ) {
303 ?>
304 <script type="application/javascript">
305 jQuery(function() {
306 jQuery.each(document.styleSheets, function (index, cssFile) {
307 if (cssFile.href!==null && cssFile.href.toString().includes("load-styles.php")) {
308 var classes = cssFile.rules || cssFile.cssRules;
309 for (var x=0; x<classes.length; x++) {
310 if (
311 classes[x].selectorText!==undefined &&
312 classes[x].selectorText!==null &&
313 classes[x].selectorText.includes("#adminmenu li.current a.menu-top")
314 ) {
315 jQuery("#adminmenu #toplevel_page_wpda a.menu-top").attr("style", classes[x].style.cssText);
316 }
317 }
318 }
319 });
320 });
321 </script>
322 <?php
323 }
324 },
325 10,
326 1
327 );
328 }
329
330 /**
331 * Needed for JDT to support IE
332 *
333 * @param string $tag Tag.
334 * @param string $handle Handle.
335 * @param string $src Source.
336 * @return mixed|string
337 */
338 public function add_id_to_script( $tag, $handle, $src ) {
339 if ( 'wpda_datatables' === $handle ) {
340 $tag = '<script id="wpda_datatables" src="' . $src . '"></script>';
341 // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
342 }
343 return $tag;
344 }
345
346 /**
347 * Add public hooks
348 *
349 * Initiates {@see WP_Data_Access_Public} (public functionality), {@see WPDA_Data_Tables} (ajax call to support
350 * server side jQuery DataTables functionality). Adds the appropriate actions to
351 * the loader.
352 *
353 * @since 1.0.0
354 *
355 * @see WP_Data_Access_Public
356 * @see WPDA_Data_Tables
357 * @see WPDA_Dictionary_Lists
358 */
359 private function define_public_hooks() {
360 $plugin_public = new WP_Data_Access_Public();
361 // Shortcodes.
362 $this->loader->add_action( 'init', $plugin_public, 'register_shortcodes' );
363 // Public scripts.
364 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
365 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
366 $this->loader->add_action(
367 'admin_bar_menu',
368 $plugin_public,
369 'add_apps_to_admin_toolbar',
370 9999
371 );
372 $this->loader->add_action(
373 'admin_bar_menu',
374 $plugin_public,
375 'add_data_projects_to_admin_toolbar',
376 9999
377 );
378 // Ajax calls.
379 $plugin_datatables = new WPDA_Data_Tables();
380 $this->loader->add_action( 'wp_ajax_wpda_datatables', $plugin_datatables, 'get_data' );
381 $this->loader->add_action( 'wp_ajax_nopriv_wpda_datatables', $plugin_datatables, 'get_data' );
382 // Export action.
383 $this->loader->add_action( 'wp_ajax_wpda_export', WPDA_Export::class, 'export_ajax' );
384 $this->loader->add_action( 'wp_ajax_nopriv_wpda_export', WPDA_Export::class, 'export_ajax' );
385 // Add id to wpda_datatables.js (for IE).
386 $this->loader->add_filter(
387 'script_loader_tag',
388 $this,
389 'add_id_to_script',
390 10,
391 3
392 );
393 // Autocomplete.
394 $autocomplete_service = new WPDA_Autocomplete();
395 $this->loader->add_action( 'wp_ajax_wpda_autocomplete', $autocomplete_service, 'autocomplete' );
396 $this->loader->add_action( 'wp_ajax_nopriv_wpda_autocomplete', $autocomplete_service, 'autocomplete_anonymous' );
397 }
398
399 /**
400 * Start plugin loader
401 *
402 * @since 1.0.0
403 */
404 public function run() {
405 $this->loader->run();
406 }
407
408 /**
409 * Add plugin settings page
410 */
411 public function wpdataaccess_register_settings_page() {
412 add_options_page(
413 'WP Data Access',
414 'WP Data Access',
415 'manage_options',
416 WP_Data_Access_Admin::PAGE_SETTINGS,
417 array($this, 'wpdataaccess_settings_page')
418 );
419 }
420
421 /**
422 * Show settings page
423 */
424 public function wpdataaccess_settings_page() {
425 WPDA_Dashboard::add_dashboard();
426 $current_tab = ( isset( $_REQUEST['tab'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['tab'] ) ) : 'plugin' );
427 // phpcs:ignore WordPress.Security.NonceVerification
428 switch ( $current_tab ) {
429 case 'backend':
430 $wpda_settings_class_name = 'WPDA_Settings_BackEnd';
431 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/back-end/';
432 break;
433 case 'frontend':
434 $wpda_settings_class_name = 'WPDA_Settings_FrontEnd';
435 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/front-end/';
436 break;
437 case 'pds':
438 $wpda_settings_class_name = 'WPDA_Settings_PDS';
439 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/premium-data-services/';
440 break;
441 case 'dashboard':
442 $wpda_settings_class_name = 'WPDA_Settings_Dashboard';
443 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/dashboard/';
444 break;
445 case 'datatables':
446 $wpda_settings_class_name = 'WPDA_Settings_DataTables';
447 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/data-tables/';
448 break;
449 case 'dataforms':
450 $wpda_settings_class_name = 'WPDA_Settings_DataForms';
451 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/data-forms/';
452 break;
453 case 'databackup':
454 $wpda_settings_class_name = 'WPDA_Settings_DataBackup';
455 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/data-backup/';
456 break;
457 case 'uninstall':
458 $wpda_settings_class_name = 'WPDA_Settings_Uninstall';
459 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/uninstall/';
460 break;
461 case 'repository':
462 $wpda_settings_class_name = 'WPDA_Settings_ManageRepository';
463 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/manage-repository/';
464 break;
465 case 'roles':
466 $wpda_settings_class_name = 'WPDA_Settings_ManageRoles';
467 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/manage-roles/';
468 break;
469 case 'system':
470 $wpda_settings_class_name = 'WPDA_Settings_SystemInfo';
471 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/system-info/';
472 break;
473 default:
474 $wpda_settings_class_name = 'WPDA_Settings_Plugin';
475 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/plugin/';
476 }
477 $wpda_settings_class_name = '\\WPDataAccess\\Settings\\' . $wpda_settings_class_name;
478 $wpda_settings = new $wpda_settings_class_name($current_tab, $help_url);
479 $wpda_settings->show();
480 }
481
482 }
483