PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.2
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.2
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-plugins-installer / src / class-plugins-installer.php
jetpack / jetpack_vendor / automattic / jetpack-plugins-installer / src Last commit date
class-automatic-install-skin.php 9 months ago class-plugins-installer.php 2 years ago
class-plugins-installer.php
256 lines
1 <?php
2 /**
3 * Plugins Library
4 *
5 * Helper functions for installing and activating plugins.
6 *
7 * Used by the REST API
8 *
9 * @package jetpack-plugins-installer
10 */
11
12 namespace Automattic\Jetpack;
13
14 use Plugin_Upgrader;
15 use WP_Error;
16
17 /**
18 * Plugins management tools.
19 */
20 class Plugins_Installer {
21
22 /**
23 * Ensures that plugins functions are loaded, as they are only loaded in admin context by default.
24 */
25 private static function ensure_plugin_functions_are_loaded() {
26 if ( ! function_exists( 'get_plugins' ) ) {
27 require_once ABSPATH . 'wp-admin/includes/plugin.php';
28 }
29 }
30 /**
31 * Install and activate a plugin.
32 *
33 * @since-jetpack 5.8.0
34 *
35 * @param string $slug Plugin slug.
36 *
37 * @return bool|WP_Error True if installation succeeded, error object otherwise.
38 */
39 public static function install_and_activate_plugin( $slug ) {
40 $plugin_id = self::get_plugin_id_by_slug( $slug );
41
42 if ( ! $plugin_id ) {
43 $installed = self::install_plugin( $slug );
44 if ( is_wp_error( $installed ) ) {
45 return $installed;
46 }
47 $plugin_id = self::get_plugin_id_by_slug( $slug );
48 } elseif ( self::is_plugin_active( $plugin_id ) ) {
49 return true; // Already installed and active.
50 }
51
52 if ( ! current_user_can( 'activate_plugins' ) ) {
53 return new WP_Error( 'not_allowed', __( 'You are not allowed to activate plugins on this site.', 'jetpack-plugins-installer' ) );
54 }
55 $activated = activate_plugin( $plugin_id );
56 if ( is_wp_error( $activated ) ) {
57 return $activated;
58 }
59
60 return true;
61 }
62
63 /**
64 * Install a plugin.
65 *
66 * @since-jetpack 5.8.0
67 *
68 * @param string $slug Plugin slug.
69 *
70 * @return bool|WP_Error True if installation succeeded, error object otherwise.
71 */
72 public static function install_plugin( $slug ) {
73 if ( is_multisite() && ! current_user_can( 'manage_network' ) ) {
74 return new WP_Error( 'not_allowed', __( 'You are not allowed to install plugins on this site.', 'jetpack-plugins-installer' ) );
75 }
76
77 // Initialize admin filters to make sure WordPress post-install hooks run. Handles things like language packs.
78 include_once ABSPATH . '/wp-admin/includes/admin-filters.php';
79
80 $skin = new Automatic_Install_Skin();
81 $upgrader = new Plugin_Upgrader( $skin );
82 $zip_url = self::generate_wordpress_org_plugin_download_link( $slug );
83 $mc_stats = new A8c_Mc_Stats();
84
85 $result = $upgrader->install( $zip_url );
86
87 if ( is_wp_error( $result ) ) {
88 $mc_stats->add( 'install-plugin', "fail-$slug" );
89 return $result;
90 }
91
92 $plugin = self::get_plugin_id_by_slug( $slug );
93 $error_code = 'install_error';
94 if ( ! $plugin ) {
95 $error = __( 'There was an error installing your plugin', 'jetpack-plugins-installer' );
96 }
97
98 if ( ! $result ) {
99 $error_code = $skin->get_main_error_code();
100 $message = $skin->get_main_error_message();
101 $error = $message ? $message : __( 'An unknown error occurred during installation', 'jetpack-plugins-installer' );
102 }
103
104 if ( ! empty( $error ) ) {
105 if ( 'download_failed' === $error_code ) {
106 // For backwards compatibility: versions prior to 3.9 would return no_package instead of download_failed.
107 $error_code = 'no_package';
108 }
109
110 $mc_stats->add( 'install-plugin', "fail-$slug" );
111 return new WP_Error( $error_code, $error, 400 );
112 }
113
114 $mc_stats->add( 'install-plugin', "success-$slug" );
115 return (array) $upgrader->skin->get_upgrade_messages();
116 }
117
118 /**
119 * Get WordPress.org zip download link from a plugin slug
120 *
121 * @param string $plugin_slug Plugin slug.
122 */
123 protected static function generate_wordpress_org_plugin_download_link( $plugin_slug ) {
124 return "https://downloads.wordpress.org/plugin/$plugin_slug.latest-stable.zip";
125 }
126
127 /**
128 * Get the plugin ID (composed of the plugin slug and the name of the main plugin file) from a plugin slug.
129 *
130 * @param string $slug Plugin slug.
131 */
132 public static function get_plugin_id_by_slug( $slug ) {
133 // Check if get_plugins() function exists. This is required on the front end of the
134 // site, since it is in a file that is normally only loaded in the admin.
135 if ( ! function_exists( 'get_plugins' ) ) {
136 require_once ABSPATH . 'wp-admin/includes/plugin.php';
137 }
138
139 /** This filter is documented in wp-admin/includes/class-wp-plugins-list-table.php */
140 $plugins = apply_filters( 'all_plugins', get_plugins() );
141 if ( ! is_array( $plugins ) ) {
142 return false;
143 }
144
145 foreach ( $plugins as $plugin_file => $plugin_data ) {
146 if ( self::get_slug_from_file_path( $plugin_file ) === $slug ) {
147 return $plugin_file;
148 }
149 }
150
151 return false;
152 }
153
154 /**
155 * Get the plugin slug from the plugin ID (composed of the plugin slug and the name of the main plugin file)
156 *
157 * @param string $plugin_file Plugin file (ID -- e.g. hello-dolly/hello.php).
158 */
159 protected static function get_slug_from_file_path( $plugin_file ) {
160 // Similar to get_plugin_slug() method.
161 $slug = dirname( $plugin_file );
162 if ( '.' === $slug ) {
163 $slug = preg_replace( '/(.+)\.php$/', '$1', $plugin_file );
164 }
165
166 return $slug;
167 }
168
169 /**
170 * Get the activation status for a plugin.
171 *
172 * @since-jetpack 8.9.0
173 *
174 * @param string $plugin_file The plugin file to check.
175 * @return string Either 'network-active', 'active' or 'inactive'.
176 */
177 public static function get_plugin_status( $plugin_file ) {
178 if ( self::is_plugin_active_for_network( $plugin_file ) ) {
179 return 'network-active';
180 }
181
182 if ( self::is_plugin_active( $plugin_file ) ) {
183 return 'active';
184 }
185
186 return 'inactive';
187 }
188
189 /**
190 * Safely checks if the plugin is active
191 *
192 * @since 0.1.0
193 *
194 * @param string $plugin_file The plugin file to check.
195 * @return bool
196 */
197 public static function is_plugin_active( $plugin_file ) {
198 self::ensure_plugin_functions_are_loaded();
199 return is_plugin_active( $plugin_file );
200 }
201
202 /**
203 * Safely checks if the plugin is active for network
204 *
205 * @since 0.1.0
206 *
207 * @param string $plugin_file The plugin file to check.
208 * @return bool
209 */
210 public static function is_plugin_active_for_network( $plugin_file ) {
211 self::ensure_plugin_functions_are_loaded();
212 return is_plugin_active_for_network( $plugin_file );
213 }
214
215 /**
216 * Returns a list of all plugins in the site.
217 *
218 * @since-jetpack 8.9.0
219 * @uses get_plugins()
220 *
221 * @return array
222 */
223 public static function get_plugins() {
224 self::ensure_plugin_functions_are_loaded();
225 /** This filter is documented in wp-admin/includes/class-wp-plugins-list-table.php */
226 $plugins = apply_filters( 'all_plugins', get_plugins() );
227
228 if ( is_array( $plugins ) && ! empty( $plugins ) ) {
229 foreach ( $plugins as $plugin_slug => $plugin_data ) {
230 $plugins[ $plugin_slug ]['active'] = in_array(
231 self::get_plugin_status( $plugin_slug ),
232 array( 'active', 'network-active' ),
233 true
234 );
235 }
236 return $plugins;
237 }
238
239 return array();
240 }
241
242 /**
243 * Determine if the current request is activating a plugin from the plugins page.
244 *
245 * @deprecated 0.4.0
246 * @see Paths::is_current_request_activating_plugin_from_plugins_screen()
247 *
248 * @param string $plugin Plugin file path to check.
249 * @return bool
250 */
251 public static function is_current_request_activating_plugin_from_plugins_screen( $plugin ) {
252 _deprecated_function( __METHOD__, '0.4.0', 'Automattic\\Jetpack\\Paths::is_current_request_activating_plugin_from_plugins_screen()' );
253 return ( new Paths() )->is_current_request_activating_plugin_from_plugins_screen( $plugin );
254 }
255 }
256