settings_api = new UltimatePostKit_Settings_API; if (!defined('BDTUPK_HIDE')) { add_action('admin_init', [$this, 'admin_init']); add_action('admin_menu', [$this, 'admin_menu'], 201); } // Plugin installation (admin only) add_action('wp_ajax_upk_install_plugin', [$this, 'install_plugin_ajax']); if (_is_upk_pro_activated()) { // Initialize rollback version functionality add_action('admin_init', [$this, 'rollback_init']); } } public function rollback_init() { if ( class_exists('\UltimatePostKitPro\Rollback_Version') ) { $this->rollback_version = new \UltimatePostKitPro\Rollback_Version(); } } /** * Get used widgets. * * @access public * @return array * @since 6.0.0 * */ public static function get_used_widgets() { $used_widgets = array(); if (class_exists('Elementor\Modules\Usage\Module')) { $module = Module::instance(); $elements = $module->get_formatted_usage('raw'); $upk_widgets = self::get_upk_widgets_names(); if (is_array($elements) || is_object($elements)) { foreach ($elements as $post_type => $data) { foreach ($data['elements'] as $element => $count) { if (in_array($element, $upk_widgets, true)) { if (isset($used_widgets[$element])) { $used_widgets[$element] += $count; } else { $used_widgets[$element] = $count; } } } } } } return $used_widgets; } /** * Get used separate widgets. * * @access public * @return array * @since 6.0.0 * */ public static function get_used_only_widgets() { $used_widgets = array(); if (class_exists('Elementor\Modules\Usage\Module')) { $module = Module::instance(); $elements = $module->get_formatted_usage('raw'); $upk_widgets = self::get_upk_only_widgets(); if (is_array($elements) || is_object($elements)) { foreach ($elements as $post_type => $data) { foreach ($data['elements'] as $element => $count) { if (in_array($element, $upk_widgets, true)) { if (isset($used_widgets[$element])) { $used_widgets[$element] += $count; } else { $used_widgets[$element] = $count; } } } } } } return $used_widgets; } /** * Get unused widgets. * * @access public * @return array * @since 6.0.0 * */ public static function get_unused_widgets() { if (!current_user_can('install_plugins')) { die(); } $upk_widgets = self::get_upk_widgets_names(); $used_widgets = self::get_used_widgets(); $unused_widgets = array_diff($upk_widgets, array_keys($used_widgets)); return $unused_widgets; } /** * Get unused separate widgets. * * @access public * @return array * @since 6.0.0 * */ public static function get_unused_only_widgets() { if (!current_user_can('install_plugins')) { die(); } $upk_widgets = self::get_upk_only_widgets(); $used_widgets = self::get_used_only_widgets(); $unused_widgets = array_diff($upk_widgets, array_keys($used_widgets)); return $unused_widgets; } /** * Get widgets name * * @access public * @return array * @since 6.0.0 * */ public static function get_upk_widgets_names() { $names = self::$modules_names; if (null === $names) { $names = array_map( function ($item) { return isset($item['name']) ? 'upk-' . str_replace('_', '-', $item['name']) : 'none'; }, self::$modules_list ); } return $names; } /** * Get separate widgets name * * @access public * @return array * @since 6.0.0 * */ public static function get_upk_only_widgets() { $names = self::$modules_names_only_widgets; if (null === $names) { $names = array_map( function ($item) { return isset($item['name']) ? 'upk-' . str_replace('_', '-', $item['name']) : 'none'; }, self::$modules_list_only_widgets ); } return $names; } /** * Get separate 3rdParty widgets name * * @access public * @return array * @since 6.0.0 * */ public static function get_upk_only_3rdparty_names() { $names = self::$modules_names_only_3rdparty; if (null === $names) { $names = array_map( function ($item) { return isset($item['name']) ? 'upk-' . str_replace('_', '-', $item['name']) : 'none'; }, self::$modules_list_only_3rdparty ); } return $names; } /** * Get URL with page id * * @access public * */ public static function get_url() { return admin_url('admin.php?page=' . self::PAGE_ID); } /** * Init settings API * * @access public * */ public function admin_init() { //set the settings $this->settings_api->set_sections($this->get_settings_sections()); $this->settings_api->set_fields($this->ultimate_post_kit_admin_settings()); //initialize settings $this->settings_api->admin_init(); $this->upk_redirect_to_get_pro(); if (true === _is_upk_pro_activated()) { $this->bdt_redirect_to_renew_link(); } } /** * Add Plugin Menus * * @access public * */ // Redirect to Ultimate Post Kit Pro pricing page public function upk_redirect_to_get_pro() { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only check of the current admin page slug for display routing, no form data processed. if (isset($_GET['page']) && $_GET['page'] === self::PAGE_ID . '_get_pro') { // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect -- Intentional redirect to a fixed, hardcoded external URL; wp_safe_redirect would block off-site hosts. wp_redirect('https://postkit.pro/pricing/'); exit; } } /** * Redirect to license renewal page * * @access public * */ public function bdt_redirect_to_renew_link() { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only check of the current admin page slug for display routing, no form data processed. if (isset($_GET['page']) && $_GET['page'] === self::PAGE_ID . '_license_renew') { // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect -- Intentional redirect to a fixed, hardcoded external URL; wp_safe_redirect would block off-site hosts. wp_redirect('https://account.bdthemes.com/'); exit; } } /** * Add Plugin Menus * * @access public * */ public function admin_menu() { add_menu_page( BDTUPK_TITLE . ' ' . esc_html__('Dashboard', 'ultimate-post-kit'), BDTUPK_TITLE, 'manage_options', self::PAGE_ID, [$this, 'plugin_page'], $this->ultimate_post_kit_icon(), 58 ); add_submenu_page( self::PAGE_ID, BDTUPK_TITLE, esc_html__('Core Widgets', 'ultimate-post-kit'), 'manage_options', self::PAGE_ID . '#ultimate_post_kit_active_modules', [$this, 'plugin_page'] ); add_submenu_page( self::PAGE_ID, BDTUPK_TITLE, esc_html__('Extensions', 'ultimate-post-kit'), 'manage_options', self::PAGE_ID . '#ultimate_post_kit_elementor_extend', [$this, 'plugin_page'] ); add_submenu_page( self::PAGE_ID, BDTUPK_TITLE, esc_html__('Special Features', 'ultimate-post-kit'), 'manage_options', self::PAGE_ID . '#ultimate_post_kit_other_settings', [$this, 'plugin_page'] ); add_submenu_page( self::PAGE_ID, BDTUPK_TITLE, esc_html__('API Settings', 'ultimate-post-kit'), 'manage_options', self::PAGE_ID . '#ultimate_post_kit_api_settings', [$this, 'plugin_page'] ); add_submenu_page( self::PAGE_ID, BDTUPK_TITLE, esc_html__('System Status', 'ultimate-post-kit'), 'manage_options', self::PAGE_ID . '#ultimate_post_kit_analytics_system_req', [$this, 'plugin_page'] ); add_submenu_page( self::PAGE_ID, BDTUPK_TITLE, esc_html__('Other Plugins', 'ultimate-post-kit'), 'manage_options', self::PAGE_ID . '#ultimate_post_kit_other_plugins', [$this, 'plugin_page'] ); // add_submenu_page( // self::PAGE_ID, // BDTUPK_TITLE, // esc_html__('Get Up to 60%', 'ultimate-post-kit'), // 'manage_options', // self::PAGE_ID . '#ultimate_post_kit_affiliate', // [$this, 'plugin_page'] // ); if (true == _is_upk_pro_activated()) { add_submenu_page( self::PAGE_ID, BDTUPK_TITLE, esc_html__('Rollback Version', 'ultimate-post-kit'), 'manage_options', self::PAGE_ID . '#ultimate_post_kit_rollback_version', [$this, 'plugin_page'] ); add_submenu_page( self::PAGE_ID, BDTUPK_TITLE, esc_html__('Template Builder', 'ultimate-post-kit'), 'edit_pages', 'edit.php?post_type=upk-template-builder', ); } } /** * Get SVG Icons of Ultimate Post Kit * * @access public * @return string */ public function ultimate_post_kit_icon() { return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNC4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCA5MDkuMyA4ODMuOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgOTA5LjMgODgzLjg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiNBN0FBQUQ7fQ0KPC9zdHlsZT4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik04MTEuMiwyNzIuOUg2ODEuNnYxMjkuN2MwLDEzLjYtMTEsMjQuNy0yNC43LDI0LjdoLTEwNWMtMTMuNiwwLTI0LjctMTEtMjQuNy0yNC43YzAsMCwwLDAsMCwwdi0xMDUNCgljMC0xMy42LDExLTI0LjcsMjQuNi0yNC43YzAsMCwwLDAsMCwwaDEyOS43VjE0My4zYzAtMTMuNi0xMS0yNC43LTI0LjctMjQuN0gzOTcuNmMtMTMuNiwwLTI0LjcsMTEtMjQuNywyNC43YzAsMCwwLDAsMCwwdjQ3MS41DQoJYzAsMTMuNi0xMSwyNC42LTI0LjYsMjQuN2MwLDAsMCwwLDAsMGgtMTA1Yy0xMy42LDAtMjQuNy0xMS0yNC43LTI0Ljd2LTM3NWMwLTEzLjYtMTEtMjQuNy0yNC43LTI0LjdIODljLTEzLjYsMC0yNC43LDExLTI0LjcsMjQuNw0KCWMwLDAsMCwwLDAsMHY1MjkuNGMwLDEzLjYsMTEsMjQuNywyNC43LDI0LjdoNDEzLjZjMTMuNiwwLDI0LjctMTEuMSwyNC43LTI0LjdWNjA2LjJjMC0xMy42LDExLTI0LjcsMjQuNy0yNC43aDI1OS4zDQoJYzEzLjYsMCwyNC43LTExLDI0LjctMjQuN1YyOTcuNkM4MzUuOSwyODQsODI0LjksMjczLDgxMS4yLDI3Mi45QzgxMS4yLDI3Mi45LDgxMS4yLDI3Mi45LDgxMS4yLDI3Mi45eiIvPg0KPHJlY3QgeD0iNzMyIiB5PSI4Mi42IiBjbGFzcz0ic3QwIiB3aWR0aD0iMzQuOCIgaGVpZ2h0PSIzNC44Ii8+DQo8cmVjdCB4PSI3OTEiIHk9IjE0OS43IiBjbGFzcz0ic3QwIiB3aWR0aD0iMjMuOSIgaGVpZ2h0PSIyMy45Ii8+DQo8cmVjdCB4PSI4MDMiIHk9IjgyLjYiIGNsYXNzPSJzdDAiIHdpZHRoPSIxNy44IiBoZWlnaHQ9IjE3LjgiLz4NCjxyZWN0IHg9Ijg2Ni43IiB5PSIxNTUuOCIgY2xhc3M9InN0MCIgd2lkdGg9IjE3LjgiIGhlaWdodD0iMTcuOCIvPg0KPHJlY3QgeD0iODI4LjkiIHk9IjQ0LjMiIGNsYXNzPSJzdDAiIHdpZHRoPSI4LjkiIGhlaWdodD0iOC45Ii8+DQo8cmVjdCB4PSI4NzcuNCIgeT0iMzgiIGNsYXNzPSJzdDAiIHdpZHRoPSI3LjIiIGhlaWdodD0iNy4yIi8+DQo8cmVjdCB4PSI4NTIuNiIgeT0iODciIGNsYXNzPSJzdDAiIHdpZHRoPSI4LjkiIGhlaWdodD0iOC45Ii8+DQo8cmVjdCB4PSI3MzUuNCIgeT0iMTgyLjgiIGNsYXNzPSJzdDAiIHdpZHRoPSIxOS43IiBoZWlnaHQ9IjE5LjciLz4NCjxyZWN0IHg9IjgyNi4zIiB5PSIyMDQuNiIgY2xhc3M9InN0MCIgd2lkdGg9IjE0LjEiIGhlaWdodD0iMTQuMSIvPg0KPC9zdmc+DQo='; } /** * Get SVG Icons of Element Pack * * @access public * @return array */ public function get_settings_sections() { $sections = [ [ 'id' => 'ultimate_post_kit_active_modules', 'title' => esc_html__('Core Widgets', 'ultimate-post-kit'), 'icon' => 'dashicons dashicons-screenoptions', ], [ 'id' => 'ultimate_post_kit_elementor_extend', 'title' => esc_html__('Extensions', 'ultimate-post-kit'), 'icon' => 'dashicons dashicons-screenoptions', ], [ 'id' => 'ultimate_post_kit_other_settings', 'title' => esc_html__('Special Features', 'ultimate-post-kit'), 'icon' => 'dashicons dashicons-screenoptions', ], [ 'id' => 'ultimate_post_kit_api_settings', 'title' => esc_html__('API Settings', 'ultimate-post-kit'), 'icon' => 'dashicons dashicons-admin-settings', ], ]; return $sections; } /** * Merge Admin Settings * * @access protected * @return array */ protected function ultimate_post_kit_admin_settings() { return ModuleService::get_widget_settings(function ($settings) { $settings_fields = $settings['settings_fields']; self::$modules_list = $settings_fields['ultimate_post_kit_active_modules']; self::$modules_list_only_widgets = $settings_fields['ultimate_post_kit_active_modules']; return $settings_fields; }); } /** * Get Welcome Panel * * @access public * @return void */ public function ultimate_post_kit_welcome() { ?>

', ''); ?>

<?php echo esc_attr__( 'Ultimate Post Kit Dashboard Template', 'ultimate-post-kit' ); ?>

<?php echo esc_attr__( 'Ultimate Post Kit Dashboard Template', 'ultimate-post-kit' ); ?>

settings_api->show_navigation(); ?>
ultimate_post_kit_welcome(); ?>
settings_api->show_forms(); ?>
ultimate_post_kit_analytics_system_req_content(); ?>
ultimate_post_kit_others_plugin(); ?>
upk_rollback_version_content(); ?>
ultimate_post_kit_get_pro(); ?>
settings_api->get_extra_dashboard_tabs() as $upk_extra_tab) { if (empty($upk_extra_tab['id'])) { continue; } echo '
'; if (isset($upk_extra_tab['callback']) && is_callable($upk_extra_tab['callback'])) { call_user_func($upk_extra_tab['callback']); } echo '
'; } ?>
footer_info(); } ?>
script(); } /** * Tabbable JavaScript codes & Initiate Color Picker * * This code uses localstorage for displaying active tabs */ function script() { ?>

BdThemes' ); ?>
BdThemes.com' ); ?>

ID] = $page->post_title; } } return $pages_options; } public static function license_wl_status() { $status = get_option('ultimate_post_kit_license_title_status'); if ($status) { return true; } return false; } /** * Display Analytics and System Requirements * * @access public * @return void */ public function ultimate_post_kit_analytics_system_req_content() { ?>
ultimate_post_kit_widgets_status(); ?>

ultimate_post_kit_system_requirement(); ?>
>

>

>

0
0
0
', '' ); echo ' ' . esc_html__('from here.', 'ultimate-post-kit') . ''; ?>
'; $no_icon = ''; $environment = Utils::get_environment_info(); ?>
Ultimate Post Kit' ); ?>
__('Security check failed', 'ultimate-post-kit')]); } // Check user capability if (!current_user_can('install_plugins')) { wp_send_json_error(['message' => __('You do not have permission to install plugins', 'ultimate-post-kit')]); } $plugin_slug = isset($_POST['plugin_slug']) ? sanitize_text_field(wp_unslash($_POST['plugin_slug'])) : ''; if (empty($plugin_slug)) { wp_send_json_error(['message' => __('Plugin slug is required', 'ultimate-post-kit')]); } // Include necessary WordPress files require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; require_once ABSPATH . 'wp-admin/includes/class-wp-ajax-upgrader-skin.php'; // Get plugin information $api = plugins_api('plugin_information', [ 'slug' => $plugin_slug, 'fields' => [ 'sections' => false, ], ]); if (is_wp_error($api)) { wp_send_json_error(['message' => __('Plugin not found: ', 'ultimate-post-kit') . $api->get_error_message()]); } // Install the plugin $skin = new \WP_Ajax_Upgrader_Skin(); $upgrader = new \Plugin_Upgrader($skin); $result = $upgrader->install($api->download_link); if (is_wp_error($result)) { wp_send_json_error(['message' => __('Installation failed: ', 'ultimate-post-kit') . $result->get_error_message()]); } elseif ($skin->get_errors()->has_errors()) { wp_send_json_error(['message' => __('Installation failed: ', 'ultimate-post-kit') . $skin->get_error_messages()]); } elseif (is_null($result)) { wp_send_json_error(['message' => __('Installation failed: Unable to connect to filesystem', 'ultimate-post-kit')]); } // Get installation status $install_status = install_plugin_install_status($api); wp_send_json_success([ 'message' => __('Plugin installed successfully!', 'ultimate-post-kit'), 'plugin_file' => $install_status['file'], 'plugin_name' => $api->name ]); } /** * Extract plugin slug from plugin path * * @param string $plugin_path Plugin file path * @return string Plugin slug */ private function extract_plugin_slug_from_path($plugin_path) { $parts = explode('/', $plugin_path); return isset($parts[0]) ? $parts[0] : ''; } /** * Get plugin action button HTML based on plugin status * * @param string $plugin_path Plugin file path * @param string $install_url Plugin installation URL * @param string $plugin_slug Plugin slug for activation * @return string Button HTML */ private function get_plugin_action_button($plugin_path, $install_url, $plugin_slug = '') { $status = $this->get_plugin_status($plugin_path); switch ($status) { case 'active': return ''; case 'installed': $activate_url = wp_nonce_url( add_query_arg([ 'action' => 'activate', 'plugin' => $plugin_path ], admin_url('plugins.php')), 'activate-plugin_' . $plugin_path ); return '' . __('Activate', 'ultimate-post-kit') . ''; case 'not_installed': default: $plugin_slug = $this->extract_plugin_slug_from_path($plugin_path); $nonce = wp_create_nonce('upk_install_plugin_nonce'); return '' . __('Install', 'ultimate-post-kit') . ''; } } /** * Rollback Version Content * * @access public * @return void */ public function upk_rollback_version_content() { // Use the already initialized rollback version instance $this->rollback_version->upk_rollback_version_content(); } } new UltimatePostKit_Admin_Settings();