<?php /** * Suppress "error - 0 - No summary was found for this file" on phpdoc generation * * @package plugin\public */ use WPDataAccess\API\WPDA_API; use WPDataAccess\Data_Apps\WPDA_Apps; use WPDataAccess\Data_Dictionary\WPDA_Dictionary_Exist; use WPDataAccess\Data_Tables\WPDA_Data_Tables; use WPDataAccess\List_Table\WPDA_List_View; use WPDataAccess\WPDA; use WPDataAccess\Premium\WPDAPRO_Data_Publisher\WPDAPRO_Data_Publisher_Init; /** * Class WP_Data_Access_Public * * Defines public specific functionality for plugin WP Data Access. * * @author Peter Schulz * @since 1.0.0 */ class WP_Data_Access_Public { /** * Add stylesheets to front-end * * The following stylesheets are registered: * + jQuery DataTables stylesheet (version is set in class WPDA) * + jQuery DataTables responsive stylesheet (version is set in class WPDA) * * Stylesheets are used to style the front-end tables. Whether stylesheets should be loaded or not can be set in * the front-end settings (menu: Manage Plugin). Sites that already have some of these stylesheets loaded, can turn * off loading in the front-end settings to prevent double loading. * * @since 1.0.0 * * @see WPDA */ public function enqueue_styles() { if ( is_admin() ) { // Public styles are only added to public pages. return; } // WPDataAccess apps CSS. wp_register_style( 'wpda_apps', plugins_url( '../assets/css/wpda_apps.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); // Toolbar icon. wp_enqueue_style( 'wpda_wpdp_public', plugins_url( '../assets/css/wpda_public.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); // Register JQuery DataTables. wp_register_style( 'jquery_datatables', plugins_url( '../assets/css/jquery.dataTables.min.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); // Register JQuery DataTables Responsive. wp_register_style( 'jquery_datatables_responsive', plugins_url( '../assets/css/responsive.dataTables.min.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); // Register styles for WPDADIEHARD shortcode. global $wp_version; wp_register_style( 'wpdadiehard', '/wp-admin/load-styles.php?load%5B%5D=list-tables,forms,common,buttons', array(), $wp_version ); wp_register_style( 'wpdataaccess', plugins_url( '../assets/css/wpda_style.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); wp_register_style( 'wpdataprojects', plugins_url( '../WPDataProjects/assets/css/wpdp_style.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); // Register datetimepicker external library. wp_register_style( 'datetimepicker', plugins_url( '../assets/css/jquery.datetimepicker.min.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); wp_register_style( 'wpda_datatables_default', plugins_url( '../assets/css/wpda_datatables_default.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); wp_register_style( 'wpda_datatables_hide_sort_icons', plugins_url( '../assets/css/wpda_datatables_hide_sort_icons.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); // SAVING SPACE - According to the plugin guidelines it is allowed to include external fonts: // https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/#8-plugins-may-not-send-executable-code-via-third-party-systems . // Load fontawesome icons. wp_register_style( // phpcs:ignore WordPress.WP.EnqueuedResourceParameters 'wpda_fontawesome_icons', WPDA::CDN_FONTAWESOME . 'all.min.css', array(), null, false ); } /** * Add scripts to back-end * * The following script files are registered : * + jQuery DataTables (version is set in class WPDA) * + jQuery DataTables responsive (version is set in class WPDA) * + WP Data Access DataTables server implementation (ajax) * * Scripts are used to build front-end tables and support searching and pagination. Whether the scripts for * jQuery DataTables and/or jQuery DataTables responsive should be loaded or not can be set in the * front-end settings (menu: Manage Plugin). Sites that already have some of these script files loaded, can * turn off loading in the front-end settings to prevent double loading. * * @since 1.0.0 * * @see WPDA */ public function enqueue_scripts() { if ( is_admin() ) { // Public scripts are only added to public pages. return; } wp_enqueue_script( 'jquery' ); // Register wpda rest api. wp_enqueue_script( 'wpda_rest_api', plugins_url( '../assets/js/wpda_rest_api.js', __FILE__ ), array('wp-api'), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ), false ); wp_localize_script( 'wpda_rest_api', 'wpdaApiSettings', array( 'path' => WPDA_API::WPDA_NAMESPACE, ) ); // Register JQuery DataTables. wp_register_script( 'jquery_datatables', plugins_url( '../assets/js/jquery.dataTables.min.js', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ), false ); // Register JQuery DataTables Responsive. wp_register_script( 'jquery_datatables_responsive', plugins_url( '../assets/js/dataTables.responsive.min.js', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ), false ); // Add url Ajax call to WPDA datatables. wp_register_script( 'wpda_datatables', plugins_url( '../assets/js/wpda_datatables.js', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ), false ); wp_localize_script( 'wpda_datatables', 'wpda_publication_vars', array( 'wpda_ajaxurl' => admin_url( 'admin-ajax.php' ), ) ); // Register functions for WPDADIEHARD shortcode. global $wp_version; wp_register_script( 'wpdadiehard', '/wp-admin/load-scripts.php?load%5B%5D=hoverIntent,hoverintent-js,list-tables,forms,buttons,common', array('wp-i18n'), $wp_version, false ); wp_register_script( 'wpda_admin_scripts', plugins_url( '../assets/js/wpda_admin.js', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ), false ); // Add WP Data Projects JS functions. wp_register_script( 'wpdataprojects', plugins_url( '../WPDataProjects/assets/js/wpdp_admin.js', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ), false ); // Register datetimepicker external library. wp_register_script( 'datetimepicker', plugins_url( '../assets/js/jquery.datetimepicker.full.min.js', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ), false ); // Register notify external library. wp_register_script( 'wpda_notify', plugins_url( '../assets/js/notify.min.js', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ), false ); } public function add_apps_to_admin_toolbar() { if ( is_admin() ) { // Toolbar only available on public pages. return; } // Add Apps. $apps = new WPDA_Apps(); $apps->add_apps_to_menu(); } /** * Show projects in admin toolbar * * @return void */ public function add_data_projects_to_admin_toolbar() { if ( is_admin() ) { // Toolbar only available on public pages. return; } // Add Data Projects. $wpdp = new \WPDataProjects\WPDP(); $wpdp->add_projects(); } /** * Register shortcode 'wpdataaccess' * * @since 1.0.0 */ public function register_shortcodes() { add_shortcode( 'wpda_apps', array($this, 'wpda_apps') ); add_shortcode( 'wpda_app', array($this, 'wpda_app') ); add_shortcode( 'wpda_data_explorer', array($this, 'wpda_data_explorer') ); add_shortcode( 'wpdataaccess', array($this, 'wpdataaccess') ); add_shortcode( 'wpdadiehard', array($this, 'wpdadiehard') ); } public function wpda_apps( $atts ) { $editing = WPDA::is_editing_post(); if ( false !== $editing ) { // Prevent errors when user is editing a post. return $editing; } $atts = array_change_key_case( (array) $atts, CASE_LOWER ); //phpcs:ignore - 8.1 proof $wp_atts = shortcode_atts( array( 'feedback' => false, ), $atts ); ob_start(); $apps = new WPDataAccess\Data_Apps\WPDA_Apps_List($wp_atts); $apps->show(); return ob_get_clean(); } public function wpda_app( $atts ) { $editing = WPDA::is_editing_post(); if ( false !== $editing ) { // Prevent errors when user is editing a post. return $editing; } if ( isset( $_POST['is_fb_preview'], $_GET['et_pb_preview'] ) && 'true' === $_POST['is_fb_preview'] && 'true' === $_GET['et_pb_preview'] ) { // Divi Visual Builder preview not working! // Styles are not properly loaded into the Divi Visual Builder. ob_start(); ?> <div style="width: 100%; border: 1px solid #ccc; padding: 50px; display: grid; gap: 20px; background-color: rgb(249,249,249); border-radius: 5px;"> <div> No preview in Visual Builder. App will appear once Visual Builder is closed. </div> </div> <?php return ob_get_clean(); } $atts = array_change_key_case( (array) $atts, CASE_LOWER ); //phpcs:ignore - 8.1 proof $wp_atts = shortcode_atts( array( 'app_id' => null, 'feedback' => false, 'builders' => true, 'filter_field_name' => null, 'filter_field_value' => null, ), $atts ); $shortcode_args = array_diff( $atts, $wp_atts ); ob_start(); $app = new WPDataAccess\Data_Apps\WPDA_App_Container($wp_atts, $shortcode_args); $app->show(); return ob_get_clean(); } public function wpda_data_explorer( $atts ) { $editing = WPDA::is_editing_post(); if ( false !== $editing ) { // Prevent errors when user is editing a post. return $editing; } $atts = array_change_key_case( (array) $atts, CASE_LOWER ); //phpcs:ignore - 8.1 proof $wp_atts = shortcode_atts( array( 'feedback' => false, ), $atts ); ob_start(); $explorer = new WPDataAccess\Data_Apps\WPDA_Explorer_Container($wp_atts); $explorer->show(); return ob_get_clean(); } /** * Implementation of shortcode 'wpdataaccess' * * Checks the values entered on validity (as far as possible) and builds the table based on the given table name, * column names and other arguments. Tables is build with class {@see WPDA_Data_Tables}. * * @param array $atts Arguments applied with the shortcode. * * @return string response * * @see WPDA_Data_Tables * * @since 1.0.0 */ public function wpdataaccess( $atts ) { $editing = WPDA::is_editing_post(); if ( false !== $editing ) { // Prevent errors when user is editing a post. return $editing; } if ( 'on' !== WPDA::get_option( WPDA::OPTION_PLUGIN_WPDATAACCESS_POST ) ) { if ( WPDA::is_post() ) { return '<p>' . __( 'Sorry, you cannot use shortcode wpdataaccess in a post!', 'wp-data-access' ) . '</p>'; } } if ( 'on' !== WPDA::get_option( WPDA::OPTION_PLUGIN_WPDATAACCESS_PAGE ) ) { if ( WPDA::is_page() ) { return '<p>' . __( 'Sorry, you cannot use shortcode wpdataaccess in a page!', 'wp-data-access' ) . '</p>'; } } $atts = array_change_key_case( (array) $atts, CASE_LOWER ); //phpcs:ignore - 8.1 proof $wp_atts = shortcode_atts( array( 'pub_id' => '', 'pub_name' => '', 'database' => '', 'table' => '', 'columns' => '*', 'responsive' => 'no', 'responsive_cols' => '0', 'responsive_type' => 'collapsed', 'responsive_icon' => 'yes', 'sql_orderby' => '', 'filter_field_name' => '', 'filter_field_value' => '', 'nl2br' => '', ), $atts ); $wpda_data_tables = new WPDA_Data_Tables(); return $wpda_data_tables->show( $wp_atts['pub_id'], $wp_atts['pub_name'], $wp_atts['database'], $wp_atts['table'], str_replace( ' ', '', $wp_atts['columns'] ), $wp_atts['responsive'], $wp_atts['responsive_cols'], $wp_atts['responsive_type'], $wp_atts['responsive_icon'], $wp_atts['sql_orderby'], $wp_atts['filter_field_name'], $wp_atts['filter_field_value'], $wp_atts['nl2br'] ); } /** * Show data administration page on web page * * Allows to show Data Projects pages on web p0ages as well. * * @param array $atts Shortcode arguments. * * @return false|string */ public function wpdadiehard( $atts ) { $editing = WPDA::is_editing_post(); if ( false !== $editing ) { // Prevent errors when user is editing a post. return $editing; } if ( 'on' !== WPDA::get_option( WPDA::OPTION_PLUGIN_WPDADIEHARD_POST ) ) { if ( WPDA::is_post() ) { return '<p>' . __( 'Sorry, you cannot use shortcode wpdadiehard in a post!', 'wp-data-access' ) . '</p>'; } } if ( 'on' !== WPDA::get_option( WPDA::OPTION_PLUGIN_WPDADIEHARD_PAGE ) ) { if ( WPDA::is_page() ) { return '<p>' . __( 'Sorry, you cannot use shortcode wpdadiehard in a page!', 'wp-data-access' ) . '</p>'; } } global $wpdb; $atts = array_change_key_case( (array) $atts, CASE_LOWER ); //phpcs:ignore - 8.1 proof $wp_atts = shortcode_atts( array( 'project_id' => '', 'page_id' => '', 'schema_name' => $wpdb->dbname, 'table_name' => '', 'title' => '', 'subtitle' => '', 'bulk_actions_enabled' => false, 'search_box_enabled' => false, 'bulk_export_enabled' => false, 'show_view_link' => 'on', 'allow_insert' => 'off', 'allow_update' => 'off', 'allow_delete' => 'off', 'allow_import' => 'off', ), $atts ); if ( '' === $wp_atts['project_id'] && '' === $wp_atts['page_id'] && '' === $wp_atts['table_name'] ) { // Either a Data Project page (project_id and page_id) or a table name must be provided. return __( 'ERROR: Missing argument(s) [(project_id and page_id) or table_name]', 'wp-data-access' ); } // Sanitize database values. $wp_atts['project_id'] = sanitize_text_field( wp_unslash( $wp_atts['project_id'] ) ); // input var okay. $wp_atts['page_id'] = sanitize_text_field( wp_unslash( $wp_atts['page_id'] ) ); // input var okay. $wp_atts['schema_name'] = sanitize_text_field( wp_unslash( $wp_atts['schema_name'] ) ); // input var okay. $wp_atts['table_name'] = sanitize_text_field( wp_unslash( $wp_atts['table_name'] ) ); // input var okay. // Set default parameter values. $bulk_actions_enabled = false; $search_box_enabled = false; $bulk_export_enabled = false; $show_view_link = 'on'; $allow_insert = 'off'; $allow_update = 'off'; $allow_delete = 'off'; $allow_import = 'off'; // Check arguments. if ( 'true' === $wp_atts['bulk_actions_enabled'] ) { $bulk_actions_enabled = true; } if ( 'true' === $wp_atts['search_box_enabled'] ) { $search_box_enabled = true; } if ( 'true' === $wp_atts['bulk_export_enabled'] ) { $bulk_export_enabled = true; } if ( 'false' === $wp_atts['show_view_link'] ) { $show_view_link = 'off'; } if ( 'true' === $wp_atts['allow_insert'] ) { $allow_insert = 'on'; } if ( 'true' === $wp_atts['allow_update'] ) { $allow_update = 'on'; } if ( 'true' === $wp_atts['allow_delete'] ) { $allow_delete = 'on'; } if ( 'true' === $wp_atts['allow_import'] ) { $allow_import = 'on'; } $default_where = ''; if ( isset( $atts['filter_field_name'] ) && isset( $atts['filter_field_value'] ) ) { $filter_field_name = str_replace( '`', '', sanitize_text_field( wp_unslash( $atts['filter_field_name'] ) ) ); // input var okay. $filter_field_value = sanitize_text_field( wp_unslash( $atts['filter_field_value'] ) ); // input var okay. $filter_field_name_array = array_map( 'trim', explode( ',', $filter_field_name ) ); //phpcs:ignore - 8.1 proof $filter_field_value_array = array_map( 'trim', explode( ',', $filter_field_value ) ); //phpcs:ignore - 8.1 proof if ( count( $filter_field_name_array ) === count( $filter_field_value_array ) ) { //phpcs:ignore - 8.1 proof // Add filter to where clause. for ($i = 0; $i < count( $filter_field_name_array ); $i++) { // phpcs:ignore Generic.CodeAnalysis.ForLoopWithTestFunctionCall, Squiz.PHP.DisallowSizeFunctionsInLoops $default_where .= (( '' === $default_where ? '' : ' and ' )) . $wpdb->prepare( ' `%1s` like %s ', // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders array(WPDA::remove_backticks( $filter_field_name_array[$i] ), $filter_field_value_array[$i]) ); } } } // Is this a Data Projects page or a table administration page? if ( '' !== $wp_atts['project_id'] && '' !== $wp_atts['page_id'] ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement // Request for Data Projects page (check is performed in WPDP_List_Page). } else { // Request for table administration page. // Check schema name. if ( 'sys' === $wp_atts['schema_name'] || 'mysql' === $wp_atts['schema_name'] || 'information_schema' === $wp_atts['schema_name'] ) { // No access to MySQL databases (meta data)! return __( 'ERROR: No access to MySQL meta data', 'wp-data-access' ); } // Check database table name. if ( '' === $wp_atts['table_name'] ) { // Table name must be provided! No database administration in the public area! return __( 'ERROR: Missing argument [table_name]', 'wp-data-access' ); } // Check if table exists (to prevent sql injection) and access is granted. $wpda_dictionary_checks = new WPDA_Dictionary_Exist($wp_atts['schema_name'], $wp_atts['table_name']); if ( !$wpda_dictionary_checks->table_exists( true, false ) ) { // Table not found. return '<p>' . __( 'ERROR: Invalid table name or not authorized', 'wp-data-access' ) . '</p>'; } } // Make sure user has access to necessary (fake) classes and functions in the frontend. require_once plugin_dir_path( __DIR__ ) . 'wp-data-access-diehard.php'; // Make sure all style and JS is available. wp_enqueue_script( 'wpda_admin_scripts' ); wp_enqueue_script( 'wpdataprojects' ); wp_enqueue_script( 'wpdadiehard' ); wp_enqueue_script( 'jquery-ui-core' ); wp_enqueue_script( 'jquery-ui-dialog' ); wp_enqueue_script( 'jquery-ui-tabs' ); wp_enqueue_script( 'jquery-ui-sortable' ); wp_enqueue_script( 'jquery-ui-tooltip' ); wp_enqueue_script( 'jquery-ui-autocomplete' ); wp_enqueue_style( 'dashicons' ); wp_enqueue_style( 'wpdadiehard' ); wp_enqueue_style( 'wpdataaccess' ); wp_enqueue_style( 'wpdataprojects' ); wp_enqueue_style( 'wpda_notify' ); wp_enqueue_style( 'wpda_ui_darkness', plugins_url( '../assets/css/jquery-ui.min.css', __FILE__ ), array(), WPDA::get_option( WPDA::OPTION_WPDA_VERSION ) ); wp_enqueue_media(); do_action( 'wpda_wpdadiehard_prepare' ); ob_start(); // Set page argument to allow public access. $_REQUEST['page'] = 'diehard'; if ( '' !== $wp_atts['project_id'] && '' !== $wp_atts['page_id'] ) { // Show Data Projects page (check is performed in WPDP_List_Page). // Get page values. $project_page = $wpdb->get_results( $wpdb->prepare( "\n select * from {$wpdb->prefix}wpda_project_page\n where project_id = %d\n and page_id = %d\n \t", array($wp_atts['project_id'], $wp_atts['page_id']) ), 'ARRAY_A' ); // db call ok; no-cache ok. if ( 0 === $wpdb->num_rows ) { // This should never happen as it was already tested before. return __( 'ERROR: Data Project page not found [need a valid project_id and page_id]', 'wp-data-access' ); } if ( 'off' !== WPDA::get_option( WPDA::OPTION_WPDA_USE_ROLES_IN_SHORTCODE ) ) { // Check if user has role. $user_roles = WPDA::get_current_user_roles(); if ( false === $user_roles ) { // Cannot determine the user role(s). Not able to show project menus. return __( 'ERROR: No access [could not determine user role]', 'wp-data-access' ); } $user_has_role = false; if ( '' === $project_page[0]['page_role'] || null === $project_page[0]['page_role'] ) { $user_has_role = in_array( 'administrator', $user_roles, true ); //phpcs:ignore - 8.1 proof } else { $user_role_array = explode( ',', $project_page[0]['page_role'] ); //phpcs:ignore - 8.1 proof foreach ( $user_role_array as $user_role_array_item ) { $user_has_role = in_array( $user_role_array_item, $user_roles, true ); //phpcs:ignore - 8.1 proof if ( $user_has_role ) { break; } } } if ( !$user_has_role ) { return __( 'ERROR: No access [missing role]', 'wp-data-access' ); } } // Determine plugin classes to be used. if ( 'static' === $project_page[0]['page_type'] ) { return ''; } elseif ( 'table' === $project_page[0]['page_type'] ) { $list_view_class = 'WPDataProjects\\List_Table\\WPDP_List_View'; $list_table_class = 'WPDataProjects\\List_Table\\WPDP_List_Table'; $edit_form_class = 'WPDataProjects\\Simple_Form\\WPDP_Simple_Form'; } else { $list_view_class = 'WPDataProjects\\Parent_Child\\WPDP_Parent_List_View'; $list_table_class = 'WPDataProjects\\Parent_Child\\WPDP_Parent_List_Table'; $edit_form_class = 'WPDataProjects\\Parent_Child\\WPDP_Parent_Form'; } if ( null !== $project_page[0]['page_where'] && '' !== $project_page[0]['page_where'] ) { if ( 'where' === substr( str_replace( ' ', '', $project_page[0]['page_where'] ), 0, 5 ) ) { $where_clause = " {$project_page[0]['page_where']}"; } else { $where_clause = " where {$project_page[0]['page_where']} "; } $where_clause = WPDA::substitute_environment_vars( $where_clause ); } else { $where_clause = ''; } if ( '' === $default_where ) { $default_where = $where_clause; } else { if ( '' === $where_clause ) { $default_where = " where {$default_where} "; } else { $default_where = " {$where_clause} and {$default_where} "; } } $default_orderby = $project_page[0]['page_orderby']; // Prepare arguments. $args = array( 'page_hook_suffix' => 'WPDA_WPDP', 'wpdaschema_name' => $project_page[0]['page_schema_name'], 'table_name' => $project_page[0]['page_table_name'], 'list_table_class' => $list_table_class, 'edit_form_class' => $edit_form_class, 'project_id' => $wp_atts['project_id'], 'page_id' => $wp_atts['page_id'], 'default_where' => $default_where, 'where_clause' => $default_where, 'orderby_clause' => $default_orderby, ); if ( 'view' === $project_page[0]['page_mode'] ) { $args['allow_update'] = 'off'; $args['allow_import'] = 'off'; } if ( 'no' === $project_page[0]['page_allow_insert'] ) { $args['allow_insert'] = 'off'; $args['allow_import'] = 'off'; } if ( 'no' === $project_page[0]['page_allow_delete'] ) { $args['allow_delete'] = 'off'; } if ( 'only' === $project_page[0]['page_allow_insert'] ) { $args['action'] = 'new'; $args['allow_insert'] = 'only'; $args['allow_update'] = 'off'; $args['allow_import'] = 'off'; $args['allow_delete'] = 'off'; } if ( 'no' === $project_page[0]['page_allow_import'] ) { $args['allow_import'] = 'off'; } if ( 'no' === $project_page[0]['page_allow_bulk'] ) { $args['bulk_actions_enabled'] = false; } // Show page. $project_page_view = new $list_view_class($args); $project_page_view->show(); } else { // Show table administration page. $media_manager = new WPDA_List_View(array( 'wpdaschema_name' => $wp_atts['schema_name'], 'table_name' => $wp_atts['table_name'], 'title' => $wp_atts['title'], 'subtitle' => $wp_atts['subtitle'], 'bulk_actions_enabled' => $bulk_actions_enabled, 'search_box_enabled' => $search_box_enabled, 'bulk_export_enabled' => $bulk_export_enabled, 'show_view_link' => $show_view_link, 'allow_insert' => $allow_insert, 'allow_update' => $allow_update, 'allow_delete' => $allow_delete, 'allow_import' => $allow_import, 'default_where' => $default_where, )); $media_manager->show(); } ?> <script type='text/javascript'> // JS variable commonL10n is used in loaded scripts, copied from wp_default_scripts for responsive support /* <![CDATA[ */ var commonL10n = { "warnDelete": "You are about to permanently delete these items from your site.\nThis action cannot be undone.\n 'Cancel' to stop, 'OK' to delete.", "dismiss": "Dismiss this notice.", "collapseMenu": "Collapse Main menu", "expandMenu": "Expand Main menu" }; // Select all rows if checkbox cb-select-all-1 or cb-select-all-2 is clicked jQuery(function () { jQuery('#cb-select-all-1').on('click', function (event) { if (jQuery('#cb-select-all-1').is(':checked')) { jQuery('[name="bulk-selected[]"]').prop('checked', true); jQuery('#cb-select-all-2').prop('checked', true); } else { jQuery('[name="bulk-selected[]"]').prop('checked', false); jQuery('#cb-select-all-2').prop('checked', false); } }); jQuery('#cb-select-all-2').on('click', function (event) { if (jQuery('#cb-select-all-2').is(':checked')) { jQuery('[name="bulk-selected[]"]').prop('checked', true); jQuery('#cb-select-all-1').prop('checked', true); } else { jQuery('[name="bulk-selected[]"]').prop('checked', false); jQuery('#cb-select-all-1').prop('checked', false); } }); }); </script> <style type="text/css"> /*@media screen and (max-width: 782px) { .row-actions { position: initial !important; } }*/ @media (hover:none) { .row-actions { position: initial !important; } } </style> <?php return ob_get_clean(); } }