wp_ajax_install_plugin()

Handles installing a plugin via AJAX.

Description

See also

Source

function wp_ajax_install_plugin() {	check_ajax_referer( 'updates' );	if ( empty( $_POST['slug'] ) ) {	wp_send_json_error(	array(	'slug' => '',	'errorCode' => 'no_plugin_specified',	'errorMessage' => __( 'No plugin specified.' ),	)	);	}	$status = array(	'install' => 'plugin',	'slug' => sanitize_key( wp_unslash( $_POST['slug'] ) ),	);	if ( ! current_user_can( 'install_plugins' ) ) {	$status['errorMessage'] = __( 'Sorry, you are not allowed to install plugins on this site.' );	wp_send_json_error( $status );	}	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';	require_once ABSPATH . 'wp-admin/includes/plugin-install.php';	$api = plugins_api(	'plugin_information',	array(	'slug' => sanitize_key( wp_unslash( $_POST['slug'] ) ),	'fields' => array(	'sections' => false,	),	)	);	if ( is_wp_error( $api ) ) {	$status['errorMessage'] = $api->get_error_message();	wp_send_json_error( $status );	}	$status['pluginName'] = $api->name;	$skin = new WP_Ajax_Upgrader_Skin();	$upgrader = new Plugin_Upgrader( $skin );	$result = $upgrader->install( $api->download_link );	if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {	$status['debug'] = $skin->get_upgrade_messages();	}	if ( is_wp_error( $result ) ) {	$status['errorCode'] = $result->get_error_code();	$status['errorMessage'] = $result->get_error_message();	wp_send_json_error( $status );	} elseif ( is_wp_error( $skin->result ) ) {	$status['errorCode'] = $skin->result->get_error_code();	$status['errorMessage'] = $skin->result->get_error_message();	wp_send_json_error( $status );	} elseif ( $skin->get_errors()->has_errors() ) {	$status['errorMessage'] = $skin->get_error_messages();	wp_send_json_error( $status );	} elseif ( is_null( $result ) ) {	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 );	}	$install_status = install_plugin_install_status( $api );	$pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : '';	// If installation request is coming from import page, do not return network activation link.	$plugins_url = ( 'import' === $pagenow ) ? admin_url( 'plugins.php' ) : network_admin_url( 'plugins.php' );	if ( current_user_can( 'activate_plugin', $install_status['file'] ) && is_plugin_inactive( $install_status['file'] ) ) {	$status['activateUrl'] = add_query_arg(	array(	'_wpnonce' => wp_create_nonce( 'activate-plugin_' . $install_status['file'] ),	'action' => 'activate',	'plugin' => $install_status['file'],	),	$plugins_url	);	}	if ( is_multisite() && current_user_can( 'manage_network_plugins' ) && 'import' !== $pagenow ) {	$status['activateUrl'] = add_query_arg( array( 'networkwide' => 1 ), $status['activateUrl'] );	}	wp_send_json_success( $status ); } 

Changelog

VersionDescription
4.6.0Introduced.

User Contributed Notes

  1. Skip to note 2 content

    Ajax js code needs to be added to the WordPress admin body. We can use add_action('admin_footer', 'my_admin_add_js'); hook or we can use separate js file & enqueue using add_action( 'admin_enqueue_scripts', 'my_admin_scripts' ); hook.

    // jQuery ajax POST request code var data = {	action: 'wp_ajax_install_plugin',	_ajax_nonce: '<?php echo wp_create_nonce( 'updates' ); ?>', // nonce	slug: 'plugin_slug', // e.g. woocommerce }; jQuery.post( ajax_url, data, function(response) {	console.log(response); });
    // code goes to functions.php add_action("wp_ajax_wp_ajax_install_plugin" , "wp_ajax_install_plugin");

You must log in before being able to contribute a note or feedback.