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

482 lines 21.0 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 ( !WPDA::current_user_is_admin() || !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 $wpdadb->suppress_errors( $suppress_errors );
270 if ( '' === $error ) {
271 //phpcs:ignore - 8.1 proof
272 echo WPDA::sent_msg( 'OK', '' );
273 // phpcs:ignore WordPress.Security.EscapeOutput
274 } else {
275 echo WPDA::sent_msg( 'ERROR', "Function not created [{$error}]" );
276 // phpcs:ignore WordPress.Security.EscapeOutput
277 }
278 wp_die();
279 },
280 10,
281 1
282 );
283 // Add id to wpda_datatables.js (for IE).
284 $this->loader->add_filter(
285 'script_loader_tag',
286 $this,
287 'add_id_to_script',
288 10,
289 3
290 );
291 // Add CSV mapping calls.
292 $wpda_csv_uploads_model = new WPDA_CSV_Uploads_Model();
293 $this->loader->add_action( 'admin_action_wpda_save_csv_mapping', $wpda_csv_uploads_model, 'save_mapping' );
294 $this->loader->add_action( 'admin_action_wpda_csv_preview_mapping', $wpda_csv_uploads_model, 'preview_mapping' );
295 // Data Tables services.
296 $this->loader->add_action( 'wp_ajax_wpda_test_publication', \WPDataAccess\Data_Publisher\WPDA_Publisher_Form::class, 'test_publication' );
297 // Add custom CSS to freemius pages.
298 add_action(
299 'admin_footer',
300 function () {
301 if ( WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-account' === $this->page || WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-pricing' === $this->page ) {
302 ?>
303 <script type="application/javascript">
304 jQuery(function() {
305 jQuery.each(document.styleSheets, function (index, cssFile) {
306 if (cssFile.href!==null && cssFile.href.toString().includes("load-styles.php")) {
307 var classes = cssFile.rules || cssFile.cssRules;
308 for (var x=0; x<classes.length; x++) {
309 if (
310 classes[x].selectorText!==undefined &&
311 classes[x].selectorText!==null &&
312 classes[x].selectorText.includes("#adminmenu li.current a.menu-top")
313 ) {
314 jQuery("#adminmenu #toplevel_page_wpda a.menu-top").attr("style", classes[x].style.cssText);
315 }
316 }
317 }
318 });
319 });
320 </script>
321 <?php
322 }
323 },
324 10,
325 1
326 );
327 }
328
329 /**
330 * Needed for JDT to support IE
331 *
332 * @param string $tag Tag.
333 * @param string $handle Handle.
334 * @param string $src Source.
335 * @return mixed|string
336 */
337 public function add_id_to_script( $tag, $handle, $src ) {
338 if ( 'wpda_datatables' === $handle ) {
339 $tag = '<script id="wpda_datatables" src="' . $src . '"></script>';
340 // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
341 }
342 return $tag;
343 }
344
345 /**
346 * Add public hooks
347 *
348 * Initiates {@see WP_Data_Access_Public} (public functionality), {@see WPDA_Data_Tables} (ajax call to support
349 * server side jQuery DataTables functionality). Adds the appropriate actions to
350 * the loader.
351 *
352 * @since 1.0.0
353 *
354 * @see WP_Data_Access_Public
355 * @see WPDA_Data_Tables
356 * @see WPDA_Dictionary_Lists
357 */
358 private function define_public_hooks() {
359 $plugin_public = new WP_Data_Access_Public();
360 // Shortcodes.
361 $this->loader->add_action( 'init', $plugin_public, 'register_shortcodes' );
362 // Public scripts.
363 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
364 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
365 $this->loader->add_action(
366 'admin_bar_menu',
367 $plugin_public,
368 'add_apps_to_admin_toolbar',
369 9999
370 );
371 $this->loader->add_action(
372 'admin_bar_menu',
373 $plugin_public,
374 'add_data_projects_to_admin_toolbar',
375 9999
376 );
377 // Ajax calls.
378 $plugin_datatables = new WPDA_Data_Tables();
379 $this->loader->add_action( 'wp_ajax_wpda_datatables', $plugin_datatables, 'get_data' );
380 $this->loader->add_action( 'wp_ajax_nopriv_wpda_datatables', $plugin_datatables, 'get_data' );
381 // Export action.
382 $this->loader->add_action( 'wp_ajax_wpda_export', WPDA_Export::class, 'export_ajax' );
383 $this->loader->add_action( 'wp_ajax_nopriv_wpda_export', WPDA_Export::class, 'export_ajax' );
384 // Add id to wpda_datatables.js (for IE).
385 $this->loader->add_filter(
386 'script_loader_tag',
387 $this,
388 'add_id_to_script',
389 10,
390 3
391 );
392 // Autocomplete.
393 $autocomplete_service = new WPDA_Autocomplete();
394 $this->loader->add_action( 'wp_ajax_wpda_autocomplete', $autocomplete_service, 'autocomplete' );
395 $this->loader->add_action( 'wp_ajax_nopriv_wpda_autocomplete', $autocomplete_service, 'autocomplete_anonymous' );
396 }
397
398 /**
399 * Start plugin loader
400 *
401 * @since 1.0.0
402 */
403 public function run() {
404 $this->loader->run();
405 }
406
407 /**
408 * Add plugin settings page
409 */
410 public function wpdataaccess_register_settings_page() {
411 add_options_page(
412 'WP Data Access',
413 'WP Data Access',
414 'manage_options',
415 WP_Data_Access_Admin::PAGE_SETTINGS,
416 array($this, 'wpdataaccess_settings_page')
417 );
418 }
419
420 /**
421 * Show settings page
422 */
423 public function wpdataaccess_settings_page() {
424 WPDA_Dashboard::add_dashboard();
425 $current_tab = ( isset( $_REQUEST['tab'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['tab'] ) ) : 'plugin' );
426 // phpcs:ignore WordPress.Security.NonceVerification
427 switch ( $current_tab ) {
428 case 'backend':
429 $wpda_settings_class_name = 'WPDA_Settings_BackEnd';
430 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/back-end/';
431 break;
432 case 'frontend':
433 $wpda_settings_class_name = 'WPDA_Settings_FrontEnd';
434 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/front-end/';
435 break;
436 case 'pds':
437 $wpda_settings_class_name = 'WPDA_Settings_PDS';
438 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/premium-data-services/';
439 break;
440 case 'dashboard':
441 $wpda_settings_class_name = 'WPDA_Settings_Dashboard';
442 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/dashboard/';
443 break;
444 case 'datatables':
445 $wpda_settings_class_name = 'WPDA_Settings_DataTables';
446 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/data-tables/';
447 break;
448 case 'dataforms':
449 $wpda_settings_class_name = 'WPDA_Settings_DataForms';
450 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/data-forms/';
451 break;
452 case 'databackup':
453 $wpda_settings_class_name = 'WPDA_Settings_DataBackup';
454 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/data-backup/';
455 break;
456 case 'uninstall':
457 $wpda_settings_class_name = 'WPDA_Settings_Uninstall';
458 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/uninstall/';
459 break;
460 case 'repository':
461 $wpda_settings_class_name = 'WPDA_Settings_ManageRepository';
462 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/manage-repository/';
463 break;
464 case 'roles':
465 $wpda_settings_class_name = 'WPDA_Settings_ManageRoles';
466 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/manage-roles/';
467 break;
468 case 'system':
469 $wpda_settings_class_name = 'WPDA_Settings_SystemInfo';
470 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/system-info/';
471 break;
472 default:
473 $wpda_settings_class_name = 'WPDA_Settings_Plugin';
474 $help_url = 'https://wpdataaccess.com/docs/plugin-settings/plugin/';
475 }
476 $wpda_settings_class_name = '\\WPDataAccess\\Settings\\' . $wpda_settings_class_name;
477 $wpda_settings = new $wpda_settings_class_name($current_tab, $help_url);
478 $wpda_settings->show();
479 }
480
481 }
482