WordPress Version: 6.3
/**
* Handles deleting a plugin via AJAX.
*
* @since 4.6.0
*
* @see delete_plugins()
*
* @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
*/
function wp_ajax_delete_plugin()
{
check_ajax_referer('updates');
if (empty($_POST['slug']) || empty($_POST['plugin'])) {
wp_send_json_error(array('slug' => '', 'errorCode' => 'no_plugin_specified', 'errorMessage' => __('No plugin specified.')));
}
$plugin = plugin_basename(sanitize_text_field(wp_unslash($_POST['plugin'])));
$status = array('delete' => 'plugin', 'slug' => sanitize_key(wp_unslash($_POST['slug'])));
if (!current_user_can('delete_plugins') || 0 !== validate_file($plugin)) {
$status['errorMessage'] = __('Sorry, you are not allowed to delete plugins for this site.');
wp_send_json_error($status);
}
$plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin);
$status['plugin'] = $plugin;
$status['pluginName'] = $plugin_data['Name'];
if (is_plugin_active($plugin)) {
$status['errorMessage'] = __('You cannot delete a plugin while it is active on the main site.');
wp_send_json_error($status);
}
// Check filesystem credentials. `delete_plugins()` will bail otherwise.
$url = wp_nonce_url('plugins.php?action=delete-selected&verify-delete=1&checked[]=' . $plugin, 'bulk-plugins');
ob_start();
$credentials = request_filesystem_credentials($url);
ob_end_clean();
if (false === $credentials || !WP_Filesystem($credentials)) {
global $wp_filesystem;
$status['errorCode'] = 'unable_to_connect_to_filesystem';
$status['errorMessage'] = __('Unable to connect to the filesystem. Please confirm your credentials.');
// Pass through the error from WP_Filesystem if one was raised.
if ($wp_filesystem instanceof WP_Filesystem_Base && is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->has_errors()) {
$status['errorMessage'] = esc_html($wp_filesystem->errors->get_error_message());
}
wp_send_json_error($status);
}
$result = delete_plugins(array($plugin));
if (is_wp_error($result)) {
$status['errorMessage'] = $result->get_error_message();
wp_send_json_error($status);
} elseif (false === $result) {
$status['errorMessage'] = __('Plugin could not be deleted.');
wp_send_json_error($status);
}
wp_send_json_success($status);
}