__('Security check failed.', 'ultimate-post-kit')], 403); } // This data is only ever used on the plugin-install screen; gate it to // users who could act on it rather than exposing it to any visitor. if (!current_user_can('install_plugins')) { wp_send_json_error(['message' => __('You do not have permission to do this.', 'ultimate-post-kit')], 403); } // Get cached data $plugins_data = \UltimatePostKit\SetupWizard\Remote_Data_Handler::get_remote_plugins(); // If cache is empty, try to fetch immediately (but don't block) if (empty($plugins_data)) { // Schedule background fetch if not already done \UltimatePostKit\SetupWizard\Remote_Data_Handler::schedule_remote_fetch(); // Return empty response with flag indicating data is loading wp_send_json_success([ 'plugins' => [], 'loading' => true, 'message' => __('Loading plugin data...', 'ultimate-post-kit') ]); } // Send response wp_send_json_success([ 'plugins' => $plugins_data, 'loading' => false, 'message' => __('Plugin data loaded successfully.', 'ultimate-post-kit') ]); } /** * AJAX handler for plugin installation */ public function install_plugin_ajax() { // Check nonce $nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : ''; if (!wp_verify_nonce( $nonce, 'upk_install_plugin_nonce')) { wp_send_json_error(['message' => __('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 ]); } } // Initialize the manager new UltimatePostKit_Others_Plugin_Manager(); /** * Helper function for easy rendering */ function ultimate_post_kit_others_plugin() { $manager = new UltimatePostKit_Others_Plugin_Manager(); $manager->render_others_plugin(); }