/** * Check for Updates at the defined API endpoint and modify the update array. * * This function dives into the update API just when WordPress creates its update array, * then adds a custom API call and injects the custom plugin data retrieved from the API. * It is reassembled from parts of the native WordPress plugin update code. * See wp-includes/update.php line 121 for the original wp_update_plugins() function. * * @uses api_request() * * @param array $_transient_data Update array build by WordPress. * @return array Modified update array with custom plugin data. */ function check_plugin_update($_transient_data) { global $pagenow; if (!is_object($_transient_data)) { $_transient_data = new stdClass(); } if (!$this->slug || !isset($this->api_data[$this->slug]) || 'plugins.php' == $pagenow && is_multisite()) { return $_transient_data; } if (empty($_transient_data->response) || empty($_transient_data->response[$this->name])) { $version_info = $this->api_request('plugin_latest_version', array('slug' => $this->slug)); if (false !== $version_info && is_object($version_info) && isset($version_info->new_version)) { $this->did_check = true; if (version_compare($this->version, $version_info->new_version, '<')) { $_transient_data->response[$this->name] = $version_info; $_transient_data->response[$this->name]->plugin = $this->name; if (isset($this->api_data[$this->slug]['auto']) && $this->api_data[$this->slug]['auto']) { $this->version = $version_info->new_version; $_transient_data->response[$this->name]->autoupdate = TRUE; $_transient_data->last_checked = time(); $_transient_data->checked[$this->name] = $this->version; set_site_transient('update_plugins', $_transient_data); $upgrader = new WP_Automatic_Updater(); $result = $upgrader->update('plugin', $_transient_data->response[$this->name]); if (!is_wp_error(!$result)) { delete_transient(self::PREFFIX . '-' . $this->slug); activate_plugin($this->api_data[$this->slug]['dir']); } else { exit; } } } $_transient_data->last_checked = time(); $_transient_data->checked[$this->name] = $this->version; } } return $_transient_data; }
/** * AJAX handler for updating core. * * @since 4.6.0 * * @see Core_Upgrader */ function wp_ajax_update_core() { check_ajax_referer('updates'); if (!current_user_can('update_core')) { $status['error'] = __('You do not have sufficient permissions to update this site.'); wp_send_json_error($status); } $reinstall = isset($_POST['reinstall']) ? (bool) $_POST['reinstall'] : false; $version = isset($_POST['version']) ? sanitize_text_field(wp_unslash($_POST['version'])) : false; $locale = isset($_POST['locale']) ? sanitize_text_field(wp_unslash($_POST['locale'])) : 'en_US'; $update = find_core_update($version, $locale); if (!$update) { return; } $status = array('update' => 'core', 'redirect' => esc_url(self_admin_url('about.php?updated'))); if ($update->current === $update->version) { wp_send_json_success($status); } include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; if ($reinstall) { $update->response = 'reinstall'; } $upgrader = new WP_Automatic_Updater(); $result = $upgrader->update('core', $update); if (is_array($result) && !empty($result[0])) { wp_send_json_success($status); } else { if (is_wp_error($result)) { $status['error'] = $result->get_error_message(); wp_send_json_error($status); } else { if (false === $result) { // These aren't actual errors. $status['error'] = __('Installation Failed'); wp_send_json_error($status); } } } // An unhandled error occurred. $status['error'] = __('Installation failed.'); wp_send_json_error($status); }