WP_REST_Plugins_Controller::create_item( WP_REST_Request $request ): WP_REST_Response|WP_Error

In this article

Uploads a plugin and optionally activates it.

Parameters

$requestWP_REST_Requestrequired
Full details about the request.

Return

WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.

Source

public function create_item( $request ) {
	global $wp_filesystem;

	require_once ABSPATH . 'wp-admin/includes/file.php';
	require_once ABSPATH . 'wp-admin/includes/plugin.php';
	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	require_once ABSPATH . 'wp-admin/includes/plugin-install.php';

	$slug = $request['slug'];

	// Verify filesystem is accessible first.
	$filesystem_available = $this->is_filesystem_available();
	if ( is_wp_error( $filesystem_available ) ) {
		return $filesystem_available;
	}

	$api = plugins_api(
		'plugin_information',
		array(
			'slug'   => $slug,
			'fields' => array(
				'sections'       => false,
				'language_packs' => true,
			),
		)
	);

	if ( is_wp_error( $api ) ) {
		if ( str_contains( $api->get_error_message(), 'Plugin not found.' ) ) {
			$api->add_data( array( 'status' => 404 ) );
		} else {
			$api->add_data( array( 'status' => 500 ) );
		}

		return $api;
	}

	$skin     = new WP_Ajax_Upgrader_Skin();
	$upgrader = new Plugin_Upgrader( $skin );

	$result = $upgrader->install( $api->download_link );

	if ( is_wp_error( $result ) ) {
		$result->add_data( array( 'status' => 500 ) );

		return $result;
	}

	// This should be the same as $result above.
	if ( is_wp_error( $skin->result ) ) {
		$skin->result->add_data( array( 'status' => 500 ) );

		return $skin->result;
	}

	if ( $skin->get_errors()->has_errors() ) {
		$error = $skin->get_errors();
		$error->add_data( array( 'status' => 500 ) );

		return $error;
	}

	if ( is_null( $result ) ) {
		// 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()
		) {
			return new WP_Error(
				'unable_to_connect_to_filesystem',
				$wp_filesystem->errors->get_error_message(),
				array( 'status' => 500 )
			);
		}

		return new WP_Error(
			'unable_to_connect_to_filesystem',
			__( 'Unable to connect to the filesystem. Please confirm your credentials.' ),
			array( 'status' => 500 )
		);
	}

	$file = $upgrader->plugin_info();

	if ( ! $file ) {
		return new WP_Error(
			'unable_to_determine_installed_plugin',
			__( 'Unable to determine what plugin was installed.' ),
			array( 'status' => 500 )
		);
	}

	if ( 'inactive' !== $request['status'] ) {
		$can_change_status = $this->plugin_status_permission_check( $file, $request['status'], 'inactive' );

		if ( is_wp_error( $can_change_status ) ) {
			return $can_change_status;
		}

		$changed_status = $this->handle_plugin_status( $file, $request['status'], 'inactive' );

		if ( is_wp_error( $changed_status ) ) {
			return $changed_status;
		}
	}

	// Install translations.
	$installed_locales = array_values( get_available_languages() );
	/** This filter is documented in wp-includes/update.php */
	$installed_locales = apply_filters( 'plugins_update_check_locales', $installed_locales );

	$language_packs = array_map(
		static function ( $item ) {
			return (object) $item;
		},
		$api->language_packs
	);

	$language_packs = array_filter(
		$language_packs,
		static function ( $pack ) use ( $installed_locales ) {
			return in_array( $pack->language, $installed_locales, true );
		}
	);

	if ( $language_packs ) {
		$lp_upgrader = new Language_Pack_Upgrader( $skin );

		// Install all applicable language packs for the plugin.
		$lp_upgrader->bulk_upgrade( $language_packs );
	}

	$path          = WP_PLUGIN_DIR . '/' . $file;
	$data          = get_plugin_data( $path, false, false );
	$data['_file'] = $file;

	$response = $this->prepare_item_for_response( $data, $request );
	$response->set_status( 201 );
	$response->header( 'Location', rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, substr( $file, 0, - 4 ) ) ) );

	return $response;
}

Hooks

apply_filters( ‘plugins_update_check_locales’, string[] $locales )

Filters the locales requested for plugin translations.

Changelog

VersionDescription
5.5.0Introduced.

User Contributed Notes

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