run:R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
17.74 KB
2026-03-11 16:18:51
R W Run
5.03 KB
2026-03-11 16:18:51
R W Run
2.77 KB
2026-03-11 16:18:51
R W Run
479 By
2026-03-11 16:18:51
R W Run
9.12 KB
2026-03-11 16:18:51
R W Run
1.97 KB
2026-03-11 16:18:51
R W Run
12.35 KB
2026-03-11 16:18:51
R W Run
5.47 KB
2026-03-11 16:18:51
R W Run
10.09 KB
2026-03-11 16:18:51
R W Run
11.35 KB
2026-03-11 16:18:51
R W Run
5.86 KB
2026-03-11 16:18:51
R W Run
4.38 KB
2026-03-11 16:18:51
R W Run
489 By
2026-03-11 16:18:51
R W Run
499 By
2026-03-11 16:18:51
R W Run
11.01 KB
2026-03-11 16:18:51
R W Run
14.38 KB
2026-03-11 16:18:51
R W Run
28.83 KB
2026-03-11 16:18:51
R W Run
14.6 KB
2026-03-11 16:18:51
R W Run
8.34 KB
2026-03-11 16:18:51
R W Run
6.21 KB
2026-03-11 16:18:51
R W Run
10.44 KB
2026-03-11 16:18:51
R W Run
22 KB
2026-03-11 16:18:51
R W Run
19.48 KB
2026-03-11 16:18:51
R W Run
7.33 KB
2026-03-11 16:18:51
R W Run
7.75 KB
2026-03-11 16:18:51
R W Run
11.02 KB
2026-03-11 16:18:51
R W Run
4.8 KB
2026-03-11 16:18:51
R W Run
7.58 KB
2026-03-11 16:18:51
R W Run
7.68 KB
2026-03-11 16:18:51
R W Run
6.8 KB
2026-03-11 16:18:51
R W Run
17.77 KB
2026-03-11 16:18:51
R W Run
934 By
2026-03-11 16:18:51
R W Run
4.26 KB
2026-03-11 16:18:51
R W Run
2.72 KB
2026-03-11 16:18:51
R W Run
2.89 KB
2026-03-11 16:18:51
R W Run
2.02 KB
2026-03-11 16:18:51
R W Run
2.92 KB
2026-03-11 16:18:51
R W Run
3.2 KB
2026-03-11 16:18:51
R W Run
3.58 KB
2026-03-11 16:18:51
R W Run
819 By
2026-03-11 16:18:51
R W Run
9.82 KB
2026-03-11 16:18:51
R W Run
17.46 KB
2026-03-11 16:18:51
R W Run
307 By
2026-03-11 16:18:51
R W Run
196 By
2026-03-11 16:18:51
R W Run
4.5 KB
2026-03-11 16:18:51
R W Run
216 By
2026-03-11 16:18:51
R W Run
229 By
2026-03-11 16:18:51
R W Run
215 By
2026-03-11 16:18:51
R W Run
217 By
2026-03-11 16:18:51
R W Run
219 By
2026-03-11 16:18:51
R W Run
215 By
2026-03-11 16:18:51
R W Run
4.74 KB
2026-03-11 16:18:51
R W Run
48.19 KB
2026-03-11 16:18:51
R W Run
5.39 KB
2026-03-11 16:18:51
R W Run
15.92 KB
2026-03-11 16:18:51
R W Run
21.65 KB
2026-03-11 16:18:51
R W Run
621 By
2026-03-11 16:18:51
R W Run
6.38 KB
2026-03-11 16:18:51
R W Run
21.22 KB
2026-03-11 16:18:51
R W Run
9.95 KB
2026-03-11 16:18:51
R W Run
9.94 KB
2026-03-11 16:18:51
R W Run
9.1 KB
2026-03-11 16:18:51
R W Run
13.6 KB
2026-03-11 16:18:51
R W Run
13.75 KB
2026-03-11 16:18:51
R W Run
6.96 KB
2026-03-11 16:18:51
R W Run
30 KB
2026-03-11 16:18:51
R W Run
2.7 KB
2026-03-11 16:18:51
R W Run
10.03 KB
2026-03-11 16:18:51
R W Run
2.34 KB
2026-03-11 16:18:51
R W Run
3.67 KB
2026-03-11 16:18:51
R W Run
2.79 KB
2026-03-11 16:18:51
R W Run
283 By
2026-03-11 16:18:51
R W Run
5.7 KB
2026-03-11 16:18:51
R W Run
17.48 KB
2026-03-11 16:18:51
R W Run
11.98 KB
2026-03-11 16:18:51
R W Run
3.99 KB
2026-03-11 16:18:51
R W Run
10.2 KB
2026-03-11 16:18:51
R W Run
2.2 KB
2026-03-11 16:18:51
R W Run
16.87 KB
2026-03-11 16:18:51
R W Run
23.38 KB
2026-03-11 16:18:51
R W Run
47.92 KB
2026-03-11 16:18:51
R W Run
3.43 KB
2026-03-11 16:18:51
R W Run
45.45 KB
2026-03-11 16:18:51
R W Run
12.79 KB
2026-03-11 16:18:51
R W Run
341 By
2026-03-11 16:18:51
R W Run
6.27 KB
2026-03-11 16:18:51
R W Run
14.9 KB
2026-03-11 16:18:51
R W Run
40.36 KB
2026-03-11 16:18:51
R W Run
24.05 KB
2026-03-11 16:18:51
R W Run
23.29 KB
2026-03-11 16:18:51
R W Run
5.12 KB
2026-03-11 16:18:51
R W Run
19.29 KB
2026-03-11 16:18:51
R W Run
1.09 KB
2026-03-11 16:18:51
R W Run
error_log
📄update-core.php
1<?php
2/**
3 * Update Core administration panel.
4 *
5 * @package WordPress
6 * @subpackage Administration
7 */
8
9/** WordPress Administration Bootstrap */
10require_once __DIR__ . '/admin.php';
11
12wp_enqueue_style( 'plugin-install' );
13wp_enqueue_script( 'plugin-install' );
14wp_enqueue_script( 'updates' );
15add_thickbox();
16
17if ( is_multisite() && ! is_network_admin() ) {
18 wp_redirect( network_admin_url( 'update-core.php' ) );
19 exit;
20}
21
22if ( ! current_user_can( 'update_core' ) && ! current_user_can( 'update_themes' ) && ! current_user_can( 'update_plugins' ) && ! current_user_can( 'update_languages' ) ) {
23 wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
24}
25
26/**
27 * Lists available core updates.
28 *
29 * @since 2.7.0
30 *
31 * @global string $wp_local_package Locale code of the package.
32 * @global wpdb $wpdb WordPress database abstraction object.
33 *
34 * @param object $update
35 */
36function list_core_update( $update ) {
37 global $wp_local_package, $wpdb;
38 static $first_pass = true;
39
40 $wp_version = wp_get_wp_version();
41 $version_string = sprintf( '%s&ndash;%s', $update->current, get_locale() );
42
43 if ( 'en_US' === $update->locale && 'en_US' === get_locale() ) {
44 $version_string = $update->current;
45 } elseif ( 'en_US' === $update->locale && $update->packages->partial && $wp_version === $update->partial_version ) {
46 $updates = get_core_updates();
47 if ( $updates && 1 === count( $updates ) ) {
48 // If the only available update is a partial builds, it doesn't need a language-specific version string.
49 $version_string = $update->current;
50 }
51 } elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() ) {
52 $version_string = sprintf( '%s&ndash;%s', $update->current, $update->locale );
53 }
54
55 $current = false;
56 if ( ! isset( $update->response ) || 'latest' === $update->response ) {
57 $current = true;
58 }
59
60 $message = '';
61 $form_action = 'update-core.php?action=do-core-upgrade';
62 $php_version = PHP_VERSION;
63 $mysql_version = $wpdb->db_version();
64 $show_buttons = true;
65
66 // Nightly build versions have two hyphens and a commit number.
67 if ( preg_match( '/-\w+-\d+/', $update->current ) ) {
68 // Retrieve the major version number.
69 preg_match( '/^\d+.\d+/', $update->current, $update_major );
70 /* translators: %s: WordPress version. */
71 $submit = sprintf( __( 'Update to latest %s nightly' ), $update_major[0] );
72 } else {
73 /* translators: %s: WordPress version. */
74 $submit = sprintf( __( 'Update to version %s' ), $version_string );
75 }
76
77 if ( 'development' === $update->response ) {
78 $message = __( 'You can update to the latest nightly build manually:' );
79 } else {
80 if ( $current ) {
81 /* translators: %s: WordPress version. */
82 $submit = sprintf( __( 'Re-install version %s' ), $version_string );
83 $form_action = 'update-core.php?action=do-core-reinstall';
84 } else {
85 $php_compat = version_compare( $php_version, $update->php_version, '>=' );
86 if ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) ) {
87 $mysql_compat = true;
88 } else {
89 $mysql_compat = version_compare( $mysql_version, $update->mysql_version, '>=' );
90 }
91
92 $version_url = sprintf(
93 /* translators: %s: WordPress version. */
94 esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ),
95 sanitize_title( $update->current )
96 );
97
98 $php_update_message = '</p><p>' . sprintf(
99 /* translators: %s: URL to Update PHP page. */
100 __( '<a href="%s">Learn more about updating PHP</a>.' ),
101 esc_url( wp_get_update_php_url() )
102 );
103
104 $annotation = wp_get_update_php_annotation();
105
106 if ( $annotation ) {
107 $php_update_message .= '</p><p><em>' . $annotation . '</em>';
108 }
109
110 if ( ! $mysql_compat && ! $php_compat ) {
111 $message = sprintf(
112 /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Minimum required MySQL version number, 5: Current PHP version number, 6: Current MySQL version number. */
113 __( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s.' ),
114 $version_url,
115 $update->current,
116 $update->php_version,
117 $update->mysql_version,
118 $php_version,
119 $mysql_version
120 ) . $php_update_message;
121 } elseif ( ! $php_compat ) {
122 $message = sprintf(
123 /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Current PHP version number. */
124 __( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher. You are running version %4$s.' ),
125 $version_url,
126 $update->current,
127 $update->php_version,
128 $php_version
129 ) . $php_update_message;
130 } elseif ( ! $mysql_compat ) {
131 $message = sprintf(
132 /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required MySQL version number, 4: Current MySQL version number. */
133 __( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires MySQL version %3$s or higher. You are running version %4$s.' ),
134 $version_url,
135 $update->current,
136 $update->mysql_version,
137 $mysql_version
138 );
139 } else {
140 $message = sprintf(
141 /* translators: 1: Installed WordPress version number, 2: URL to WordPress release notes, 3: New WordPress version number, including locale if necessary. */
142 __( 'You can update from WordPress %1$s to <a href="%2$s">WordPress %3$s</a> manually:' ),
143 $wp_version,
144 $version_url,
145 $version_string
146 );
147 }
148
149 if ( ! $mysql_compat || ! $php_compat ) {
150 $show_buttons = false;
151 }
152 }
153 }
154
155 echo '<p>';
156 echo $message;
157 echo '</p>';
158
159 echo '<form method="post" action="' . esc_url( $form_action ) . '" name="upgrade" class="upgrade">';
160 wp_nonce_field( 'upgrade-core' );
161
162 echo '<p>';
163 echo '<input name="version" value="' . esc_attr( $update->current ) . '" type="hidden" />';
164 echo '<input name="locale" value="' . esc_attr( $update->locale ) . '" type="hidden" />';
165 if ( $show_buttons ) {
166 if ( $first_pass ) {
167 submit_button( $submit, $current ? '' : 'primary regular', 'upgrade', false );
168 $first_pass = false;
169 } else {
170 submit_button( $submit, '', 'upgrade', false );
171 }
172 }
173 if ( 'en_US' !== $update->locale ) {
174 if ( ! isset( $update->dismissed ) || ! $update->dismissed ) {
175 submit_button( __( 'Hide this update' ), '', 'dismiss', false );
176 } else {
177 submit_button( __( 'Bring back this update' ), '', 'undismiss', false );
178 }
179 }
180 echo '</p>';
181
182 if ( 'en_US' !== $update->locale && ( ! isset( $wp_local_package ) || $wp_local_package !== $update->locale ) ) {
183 echo '<p class="hint">' . __( 'This localized version contains both the translation and various other localization fixes.' ) . '</p>';
184 } elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() && ( ! $update->packages->partial && $wp_version === $update->partial_version ) ) {
185 // Partial builds don't need language-specific warnings.
186 echo '<p class="hint">' . sprintf(
187 /* translators: %s: WordPress version. */
188 __( 'You are about to install WordPress %s <strong>in English (US)</strong>. There is a chance this update will break your translation. You may prefer to wait for the localized version to be released.' ),
189 'development' !== $update->response ? $update->current : ''
190 ) . '</p>';
191 }
192
193 echo '</form>';
194}
195
196/**
197 * Display dismissed updates.
198 *
199 * @since 2.7.0
200 */
201function dismissed_updates() {
202 $dismissed = get_core_updates(
203 array(
204 'dismissed' => true,
205 'available' => false,
206 )
207 );
208
209 if ( $dismissed ) {
210 $show_text = esc_js( __( 'Show hidden updates' ) );
211 $hide_text = esc_js( __( 'Hide hidden updates' ) );
212 ?>
213 <script type="text/javascript">
214 jQuery( function( $ ) {
215 $( '#show-dismissed' ).on( 'click', function() {
216 var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) );
217
218 if ( isExpanded ) {
219 $( this ).text( '<?php echo $show_text; ?>' ).attr( 'aria-expanded', 'false' );
220 } else {
221 $( this ).text( '<?php echo $hide_text; ?>' ).attr( 'aria-expanded', 'true' );
222 }
223
224 $( '#dismissed-updates' ).toggle( 'fast' );
225 });
226 });
227 </script>
228 <?php
229 echo '<p class="hide-if-no-js"><button type="button" class="button" id="show-dismissed" aria-expanded="false">' . __( 'Show hidden updates' ) . '</button></p>';
230 echo '<ul id="dismissed-updates" class="core-updates dismissed">';
231 foreach ( (array) $dismissed as $update ) {
232 echo '<li>';
233 list_core_update( $update );
234 echo '</li>';
235 }
236 echo '</ul>';
237 }
238}
239
240/**
241 * Display upgrade WordPress for downloading latest or upgrading automatically form.
242 *
243 * @since 2.7.0
244 */
245function core_upgrade_preamble() {
246 $updates = get_core_updates();
247
248 // Include an unmodified $wp_version.
249 require ABSPATH . WPINC . '/version.php';
250
251 $is_development_version = preg_match( '/alpha|beta|RC/', $wp_version );
252
253 if ( isset( $updates[0]->version ) && version_compare( $updates[0]->version, $wp_version, '>' ) ) {
254 echo '<h2 class="response">';
255 _e( 'An updated version of WordPress is available.' );
256 echo '</h2>';
257
258 $message = sprintf(
259 /* translators: 1: Documentation on WordPress backups, 2: Documentation on updating WordPress. */
260 __( '<strong>Important:</strong> Before updating, please <a href="%1$s">back up your database and files</a>. For help with updates, visit the <a href="%2$s">Updating WordPress</a> documentation page.' ),
261 __( 'https://developer.wordpress.org/advanced-administration/security/backup/' ),
262 __( 'https://wordpress.org/documentation/article/updating-wordpress/' )
263 );
264 wp_admin_notice(
265 $message,
266 array(
267 'type' => 'warning',
268 'additional_classes' => array( 'inline' ),
269 )
270 );
271 } elseif ( $is_development_version ) {
272 echo '<h2 class="response">' . __( 'You are using a development version of WordPress.' ) . '</h2>';
273 } else {
274 echo '<h2 class="response">' . __( 'You have the latest version of WordPress.' ) . '</h2>';
275 }
276
277 echo '<ul class="core-updates">';
278 foreach ( (array) $updates as $update ) {
279 echo '<li>';
280 list_core_update( $update );
281 echo '</li>';
282 }
283 echo '</ul>';
284
285 // Don't show the maintenance mode notice when we are only showing a single re-install option.
286 if ( $updates && ( count( $updates ) > 1 || 'latest' !== $updates[0]->response ) ) {
287 echo '<p>' . __( 'While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, this mode will be deactivated.' ) . '</p>';
288 } elseif ( ! $updates ) {
289 list( $normalized_version ) = explode( '-', $wp_version );
290 echo '<p>' . sprintf(
291 /* translators: 1: URL to About screen, 2: WordPress version. */
292 __( '<a href="%1$s">Learn more about WordPress %2$s</a>.' ),
293 esc_url( self_admin_url( 'about.php' ) ),
294 $normalized_version
295 ) . '</p>';
296 }
297
298 dismissed_updates();
299}
300
301/**
302 * Display WordPress auto-updates settings.
303 *
304 * @since 5.6.0
305 */
306function core_auto_updates_settings() {
307 if ( isset( $_GET['core-major-auto-updates-saved'] ) ) {
308 if ( 'enabled' === $_GET['core-major-auto-updates-saved'] ) {
309 $notice_text = __( 'Automatic updates for all WordPress versions have been enabled. Thank you!' );
310 wp_admin_notice(
311 $notice_text,
312 array(
313 'type' => 'success',
314 'dismissible' => true,
315 )
316 );
317 } elseif ( 'disabled' === $_GET['core-major-auto-updates-saved'] ) {
318 $notice_text = __( 'WordPress will only receive automatic security and maintenance releases from now on.' );
319 wp_admin_notice(
320 $notice_text,
321 array(
322 'type' => 'success',
323 'dismissible' => true,
324 )
325 );
326 }
327 }
328
329 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
330 $updater = new WP_Automatic_Updater();
331
332 // Defaults:
333 $upgrade_dev = get_site_option( 'auto_update_core_dev', 'enabled' ) === 'enabled';
334 $upgrade_minor = get_site_option( 'auto_update_core_minor', 'enabled' ) === 'enabled';
335 $upgrade_major = get_site_option( 'auto_update_core_major', 'unset' ) === 'enabled';
336
337 $can_set_update_option = true;
338 // WP_AUTO_UPDATE_CORE = true (all), 'beta', 'rc', 'development', 'branch-development', 'minor', false.
339 if ( defined( 'WP_AUTO_UPDATE_CORE' ) ) {
340 if ( false === WP_AUTO_UPDATE_CORE ) {
341 // Defaults to turned off, unless a filter allows it.
342 $upgrade_dev = false;
343 $upgrade_minor = false;
344 $upgrade_major = false;
345 } elseif ( true === WP_AUTO_UPDATE_CORE
346 || in_array( WP_AUTO_UPDATE_CORE, array( 'beta', 'rc', 'development', 'branch-development' ), true )
347 ) {
348 // ALL updates for core.
349 $upgrade_dev = true;
350 $upgrade_minor = true;
351 $upgrade_major = true;
352 } elseif ( 'minor' === WP_AUTO_UPDATE_CORE ) {
353 // Only minor updates for core.
354 $upgrade_dev = false;
355 $upgrade_minor = true;
356 $upgrade_major = false;
357 }
358
359 // The UI is overridden by the `WP_AUTO_UPDATE_CORE` constant.
360 $can_set_update_option = false;
361 }
362
363 if ( $updater->is_disabled() ) {
364 $upgrade_dev = false;
365 $upgrade_minor = false;
366 $upgrade_major = false;
367
368 /*
369 * The UI is overridden by the `AUTOMATIC_UPDATER_DISABLED` constant
370 * or the `automatic_updater_disabled` filter,
371 * or by `wp_is_file_mod_allowed( 'automatic_updater' )`.
372 * See `WP_Automatic_Updater::is_disabled()`.
373 */
374 $can_set_update_option = false;
375 }
376
377 // Is the UI overridden by a plugin using the `allow_major_auto_core_updates` filter?
378 if ( has_filter( 'allow_major_auto_core_updates' ) ) {
379 $can_set_update_option = false;
380 }
381
382 /** This filter is documented in wp-admin/includes/class-core-upgrader.php */
383 $upgrade_dev = apply_filters( 'allow_dev_auto_core_updates', $upgrade_dev );
384 /** This filter is documented in wp-admin/includes/class-core-upgrader.php */
385 $upgrade_minor = apply_filters( 'allow_minor_auto_core_updates', $upgrade_minor );
386 /** This filter is documented in wp-admin/includes/class-core-upgrader.php */
387 $upgrade_major = apply_filters( 'allow_major_auto_core_updates', $upgrade_major );
388
389 $auto_update_settings = array(
390 'dev' => $upgrade_dev,
391 'minor' => $upgrade_minor,
392 'major' => $upgrade_major,
393 );
394
395 if ( $upgrade_major ) {
396 $wp_version = wp_get_wp_version();
397 $updates = get_core_updates();
398
399 if ( isset( $updates[0]->version ) && version_compare( $updates[0]->version, $wp_version, '>' ) ) {
400 echo '<p>' . wp_get_auto_update_message() . '</p>';
401 }
402 }
403
404 $action_url = self_admin_url( 'update-core.php?action=core-major-auto-updates-settings' );
405 ?>
406
407 <p class="auto-update-status">
408 <?php
409
410 if ( $updater->is_vcs_checkout( ABSPATH ) ) {
411 _e( 'This site appears to be under version control. Automatic updates are disabled.' );
412 } elseif ( $upgrade_major ) {
413 _e( 'This site is automatically kept up to date with each new version of WordPress.' );
414
415 if ( $can_set_update_option ) {
416 echo '<br />';
417 printf(
418 '<a href="%s" class="core-auto-update-settings-link core-auto-update-settings-link-disable">%s</a>',
419 wp_nonce_url( add_query_arg( 'value', 'disable', $action_url ), 'core-major-auto-updates-nonce' ),
420 __( 'Switch to automatic updates for maintenance and security releases only.' )
421 );
422 }
423 } elseif ( $upgrade_minor ) {
424 _e( 'This site is automatically kept up to date with maintenance and security releases of WordPress only.' );
425
426 if ( $can_set_update_option ) {
427 echo '<br />';
428 printf(
429 '<a href="%s" class="core-auto-update-settings-link core-auto-update-settings-link-enable">%s</a>',
430 wp_nonce_url( add_query_arg( 'value', 'enable', $action_url ), 'core-major-auto-updates-nonce' ),
431 __( 'Enable automatic updates for all new versions of WordPress.' )
432 );
433 }
434 } else {
435 _e( 'This site will not receive automatic updates for new versions of WordPress.' );
436 }
437 ?>
438 </p>
439
440 <?php
441 /**
442 * Fires after the major core auto-update settings.
443 *
444 * @since 5.6.0
445 *
446 * @param array $auto_update_settings {
447 * Array of core auto-update settings.
448 *
449 * @type bool $dev Whether to enable automatic updates for development versions.
450 * @type bool $minor Whether to enable minor automatic core updates.
451 * @type bool $major Whether to enable major automatic core updates.
452 * }
453 */
454 do_action( 'after_core_auto_updates_settings', $auto_update_settings );
455}
456
457/**
458 * Display the upgrade plugins form.
459 *
460 * @since 2.9.0
461 */
462function list_plugin_updates() {
463 $wp_version = wp_get_wp_version();
464 $cur_wp_version = preg_replace( '/-.*$/', '', $wp_version );
465
466 require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
467 $plugins = get_plugin_updates();
468 if ( empty( $plugins ) ) {
469 echo '<h2>' . __( 'Plugins' ) . '</h2>';
470 echo '<p>' . __( 'Your plugins are all up to date.' ) . '</p>';
471 return;
472 }
473 $form_action = 'update-core.php?action=do-plugin-upgrade';
474
475 $core_updates = get_core_updates();
476 if ( ! isset( $core_updates[0]->response ) || 'latest' === $core_updates[0]->response || 'development' === $core_updates[0]->response || version_compare( $core_updates[0]->current, $cur_wp_version, '=' ) ) {
477 $core_update_version = false;
478 } else {
479 $core_update_version = $core_updates[0]->current;
480 }
481
482 $plugins_count = count( $plugins );
483 ?>
484<h2>
485 <?php
486 printf(
487 '%s <span class="count">(%d)</span>',
488 __( 'Plugins' ),
489 number_format_i18n( $plugins_count )
490 );
491 ?>
492</h2>
493<p><?php _e( 'The following plugins have new versions available. Check the ones you want to update and then click &#8220;Update Plugins&#8221;.' ); ?></p>
494<form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-plugins" class="upgrade">
495 <?php wp_nonce_field( 'upgrade-core' ); ?>
496<p><input id="upgrade-plugins" class="button" type="submit" value="<?php esc_attr_e( 'Update Plugins' ); ?>" name="upgrade" /></p>
497<table class="widefat updates-table" id="update-plugins-table">
498 <thead>
499 <tr>
500 <td class="manage-column check-column"><input type="checkbox" id="plugins-select-all" /></td>
501 <td class="manage-column"><label for="plugins-select-all"><?php _e( 'Select All' ); ?></label></td>
502 </tr>
503 </thead>
504
505 <tbody class="plugins">
506 <?php
507
508 $auto_updates = array();
509 if ( wp_is_auto_update_enabled_for_type( 'plugin' ) ) {
510 $auto_updates = (array) get_site_option( 'auto_update_plugins', array() );
511 $auto_update_notice = ' | ' . wp_get_auto_update_message();
512 }
513
514 foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
515 $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
516
517 $icon = '<span class="dashicons dashicons-admin-plugins"></span>';
518 $preferred_icons = array( 'svg', '2x', '1x', 'default' );
519 foreach ( $preferred_icons as $preferred_icon ) {
520 if ( ! empty( $plugin_data->update->icons[ $preferred_icon ] ) ) {
521 $icon = '<img src="' . esc_url( $plugin_data->update->icons[ $preferred_icon ] ) . '" alt="" class="plugin-icon" />';
522 break;
523 }
524 }
525
526 // Get plugin compat for running version of WordPress.
527 if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $cur_wp_version, '>=' ) ) {
528 /* translators: %s: WordPress version. */
529 $compat = '<br />' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $cur_wp_version );
530 } else {
531 /* translators: %s: WordPress version. */
532 $compat = '<br />' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $cur_wp_version );
533 }
534 // Get plugin compat for updated version of WordPress.
535 if ( $core_update_version ) {
536 if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $core_update_version, '>=' ) ) {
537 /* translators: %s: WordPress version. */
538 $compat .= '<br />' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $core_update_version );
539 } else {
540 /* translators: %s: WordPress version. */
541 $compat .= '<br />' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $core_update_version );
542 }
543 }
544
545 $requires_php = isset( $plugin_data->update->requires_php ) ? $plugin_data->update->requires_php : null;
546 $compatible_php = is_php_version_compatible( $requires_php );
547
548 if ( ! $compatible_php && current_user_can( 'update_php' ) ) {
549 $compat .= '<br />' . __( 'This update does not work with your version of PHP.' ) . '&nbsp;';
550 $compat .= sprintf(
551 /* translators: %s: URL to Update PHP page. */
552 __( '<a href="%s">Learn more about updating PHP</a>.' ),
553 esc_url( wp_get_update_php_url() )
554 );
555
556 $annotation = wp_get_update_php_annotation();
557
558 if ( $annotation ) {
559 $compat .= '</p><p><em>' . $annotation . '</em>';
560 }
561 }
562
563 // Get the upgrade notice for the new plugin version.
564 if ( isset( $plugin_data->update->upgrade_notice ) ) {
565 $upgrade_notice = '<br />' . strip_tags( $plugin_data->update->upgrade_notice );
566 } else {
567 $upgrade_notice = '';
568 }
569
570 $details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data->update->slug . '&section=changelog&TB_iframe=true&width=640&height=662' );
571 $details = sprintf(
572 '<a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">%3$s</a>',
573 esc_url( $details_url ),
574 /* translators: 1: Plugin name, 2: Version number. */
575 esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_data->Name, $plugin_data->update->new_version ) ),
576 /* translators: %s: Plugin version. */
577 sprintf( __( 'View version %s details.' ), $plugin_data->update->new_version )
578 );
579
580 $checkbox_id = 'checkbox_' . md5( $plugin_file );
581 ?>
582 <tr>
583 <td class="check-column">
584 <?php if ( $compatible_php ) : ?>
585 <input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $plugin_file ); ?>" />
586 <label for="<?php echo $checkbox_id; ?>">
587 <span class="screen-reader-text">
588 <?php
589 /* translators: Hidden accessibility text. %s: Plugin name. */
590 printf( __( 'Select %s' ), $plugin_data->Name );
591 ?>
592 </span>
593 </label>
594 <?php endif; ?>
595 </td>
596 <td class="plugin-title"><p>
597 <?php echo $icon; ?>
598 <strong><?php echo $plugin_data->Name; ?></strong>
599 <?php
600 printf(
601 /* translators: 1: Plugin version, 2: New version. */
602 __( 'You have version %1$s installed. Update to %2$s.' ),
603 $plugin_data->Version,
604 $plugin_data->update->new_version
605 );
606
607 echo ' ' . $details . $compat;
608
609 if ( in_array( $plugin_file, $auto_updates, true ) ) {
610 echo $auto_update_notice;
611 }
612
613 echo $upgrade_notice;
614 ?>
615 </p></td>
616 </tr>
617 <?php
618 }
619 ?>
620 </tbody>
621
622 <tfoot>
623 <tr>
624 <td class="manage-column check-column"><input type="checkbox" id="plugins-select-all-2" /></td>
625 <td class="manage-column"><label for="plugins-select-all-2"><?php _e( 'Select All' ); ?></label></td>
626 </tr>
627 </tfoot>
628</table>
629<p><input id="upgrade-plugins-2" class="button" type="submit" value="<?php esc_attr_e( 'Update Plugins' ); ?>" name="upgrade" /></p>
630</form>
631 <?php
632}
633
634/**
635 * Display the upgrade themes form.
636 *
637 * @since 2.9.0
638 */
639function list_theme_updates() {
640 $themes = get_theme_updates();
641 if ( empty( $themes ) ) {
642 echo '<h2>' . __( 'Themes' ) . '</h2>';
643 echo '<p>' . __( 'Your themes are all up to date.' ) . '</p>';
644 return;
645 }
646
647 $form_action = 'update-core.php?action=do-theme-upgrade';
648
649 $themes_count = count( $themes );
650 ?>
651<h2>
652 <?php
653 printf(
654 '%s <span class="count">(%d)</span>',
655 __( 'Themes' ),
656 number_format_i18n( $themes_count )
657 );
658 ?>
659</h2>
660<p><?php _e( 'The following themes have new versions available. Check the ones you want to update and then click &#8220;Update Themes&#8221;.' ); ?></p>
661<p>
662 <?php
663 printf(
664 /* translators: %s: Link to documentation on child themes. */
665 __( '<strong>Please Note:</strong> Any customizations you have made to theme files will be lost. Please consider using <a href="%s">child themes</a> for modifications.' ),
666 __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' )
667 );
668 ?>
669</p>
670<form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-themes" class="upgrade">
671 <?php wp_nonce_field( 'upgrade-core' ); ?>
672<p><input id="upgrade-themes" class="button" type="submit" value="<?php esc_attr_e( 'Update Themes' ); ?>" name="upgrade" /></p>
673<table class="widefat updates-table" id="update-themes-table">
674 <thead>
675 <tr>
676 <td class="manage-column check-column"><input type="checkbox" id="themes-select-all" /></td>
677 <td class="manage-column"><label for="themes-select-all"><?php _e( 'Select All' ); ?></label></td>
678 </tr>
679 </thead>
680
681 <tbody class="plugins">
682 <?php
683 $auto_updates = array();
684 if ( wp_is_auto_update_enabled_for_type( 'theme' ) ) {
685 $auto_updates = (array) get_site_option( 'auto_update_themes', array() );
686 $auto_update_notice = ' | ' . wp_get_auto_update_message();
687 }
688
689 foreach ( $themes as $stylesheet => $theme ) {
690 $requires_wp = isset( $theme->update['requires'] ) ? $theme->update['requires'] : null;
691 $requires_php = isset( $theme->update['requires_php'] ) ? $theme->update['requires_php'] : null;
692
693 $compatible_wp = is_wp_version_compatible( $requires_wp );
694 $compatible_php = is_php_version_compatible( $requires_php );
695
696 $compat = '';
697
698 if ( ! $compatible_wp && ! $compatible_php ) {
699 $compat .= '<br />' . __( 'This update does not work with your versions of WordPress and PHP.' ) . '&nbsp;';
700 if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
701 $compat .= sprintf(
702 /* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
703 __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
704 esc_url( self_admin_url( 'update-core.php' ) ),
705 esc_url( wp_get_update_php_url() )
706 );
707
708 $annotation = wp_get_update_php_annotation();
709
710 if ( $annotation ) {
711 $compat .= '</p><p><em>' . $annotation . '</em>';
712 }
713 } elseif ( current_user_can( 'update_core' ) ) {
714 $compat .= sprintf(
715 /* translators: %s: URL to WordPress Updates screen. */
716 __( '<a href="%s">Please update WordPress</a>.' ),
717 esc_url( self_admin_url( 'update-core.php' ) )
718 );
719 } elseif ( current_user_can( 'update_php' ) ) {
720 $compat .= sprintf(
721 /* translators: %s: URL to Update PHP page. */
722 __( '<a href="%s">Learn more about updating PHP</a>.' ),
723 esc_url( wp_get_update_php_url() )
724 );
725
726 $annotation = wp_get_update_php_annotation();
727
728 if ( $annotation ) {
729 $compat .= '</p><p><em>' . $annotation . '</em>';
730 }
731 }
732 } elseif ( ! $compatible_wp ) {
733 $compat .= '<br />' . __( 'This update does not work with your version of WordPress.' ) . '&nbsp;';
734 if ( current_user_can( 'update_core' ) ) {
735 $compat .= sprintf(
736 /* translators: %s: URL to WordPress Updates screen. */
737 __( '<a href="%s">Please update WordPress</a>.' ),
738 esc_url( self_admin_url( 'update-core.php' ) )
739 );
740 }
741 } elseif ( ! $compatible_php ) {
742 $compat .= '<br />' . __( 'This update does not work with your version of PHP.' ) . '&nbsp;';
743 if ( current_user_can( 'update_php' ) ) {
744 $compat .= sprintf(
745 /* translators: %s: URL to Update PHP page. */
746 __( '<a href="%s">Learn more about updating PHP</a>.' ),
747 esc_url( wp_get_update_php_url() )
748 );
749
750 $annotation = wp_get_update_php_annotation();
751
752 if ( $annotation ) {
753 $compat .= '</p><p><em>' . $annotation . '</em>';
754 }
755 }
756 }
757
758 $checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) );
759 ?>
760 <tr>
761 <td class="check-column">
762 <?php if ( $compatible_wp && $compatible_php ) : ?>
763 <input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $stylesheet ); ?>" />
764 <label for="<?php echo $checkbox_id; ?>">
765 <span class="screen-reader-text">
766 <?php
767 /* translators: Hidden accessibility text. %s: Theme name. */
768 printf( __( 'Select %s' ), $theme->display( 'Name' ) );
769 ?>
770 </span>
771 </label>
772 <?php endif; ?>
773 </td>
774 <td class="plugin-title"><p>
775 <img src="<?php echo esc_url( $theme->get_screenshot() . '?ver=' . $theme->version ); ?>" width="85" height="64" class="updates-table-screenshot" alt="" />
776 <strong><?php echo $theme->display( 'Name' ); ?></strong>
777 <?php
778 printf(
779 /* translators: 1: Theme version, 2: New version. */
780 __( 'You have version %1$s installed. Update to %2$s.' ),
781 $theme->display( 'Version' ),
782 $theme->update['new_version']
783 );
784
785 echo ' ' . $compat;
786
787 if ( in_array( $stylesheet, $auto_updates, true ) ) {
788 echo $auto_update_notice;
789 }
790 ?>
791 </p></td>
792 </tr>
793 <?php
794 }
795 ?>
796 </tbody>
797
798 <tfoot>
799 <tr>
800 <td class="manage-column check-column"><input type="checkbox" id="themes-select-all-2" /></td>
801 <td class="manage-column"><label for="themes-select-all-2"><?php _e( 'Select All' ); ?></label></td>
802 </tr>
803 </tfoot>
804</table>
805<p><input id="upgrade-themes-2" class="button" type="submit" value="<?php esc_attr_e( 'Update Themes' ); ?>" name="upgrade" /></p>
806</form>
807 <?php
808}
809
810/**
811 * Display the update translations form.
812 *
813 * @since 3.7.0
814 */
815function list_translation_updates() {
816 $updates = wp_get_translation_updates();
817 if ( ! $updates ) {
818 if ( 'en_US' !== get_locale() ) {
819 echo '<h2>' . __( 'Translations' ) . '</h2>';
820 echo '<p>' . __( 'Your translations are all up to date.' ) . '</p>';
821 }
822 return;
823 }
824
825 $form_action = 'update-core.php?action=do-translation-upgrade';
826 ?>
827 <h2><?php _e( 'Translations' ); ?></h2>
828 <form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-translations" class="upgrade">
829 <p><?php _e( 'New translations are available.' ); ?></p>
830 <?php wp_nonce_field( 'upgrade-translations' ); ?>
831 <p><input class="button" type="submit" value="<?php esc_attr_e( 'Update Translations' ); ?>" name="upgrade" /></p>
832 </form>
833 <?php
834}
835
836/**
837 * Upgrades WordPress core display.
838 *
839 * @since 2.7.0
840 *
841 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
842 *
843 * @param bool $reinstall
844 */
845function do_core_upgrade( $reinstall = false ) {
846 global $wp_filesystem;
847
848 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
849
850 if ( $reinstall ) {
851 $url = 'update-core.php?action=do-core-reinstall';
852 } else {
853 $url = 'update-core.php?action=do-core-upgrade';
854 }
855 $url = wp_nonce_url( $url, 'upgrade-core' );
856
857 $version = isset( $_POST['version'] ) ? $_POST['version'] : false;
858 $locale = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US';
859 $update = find_core_update( $version, $locale );
860 if ( ! $update ) {
861 return;
862 }
863
864 /*
865 * Allow relaxed file ownership writes for User-initiated upgrades when the API specifies
866 * that it's safe to do so. This only happens when there are no new files to create.
867 */
868 $allow_relaxed_file_ownership = ! $reinstall && isset( $update->new_files ) && ! $update->new_files;
869
870 ?>
871 <div class="wrap">
872 <h1><?php _e( 'Update WordPress' ); ?></h1>
873 <?php
874
875 $credentials = request_filesystem_credentials( $url, '', false, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership );
876 if ( false === $credentials ) {
877 echo '</div>';
878 return;
879 }
880
881 if ( ! WP_Filesystem( $credentials, ABSPATH, $allow_relaxed_file_ownership ) ) {
882 // Failed to connect. Error and request again.
883 request_filesystem_credentials( $url, '', true, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership );
884 echo '</div>';
885 return;
886 }
887
888 if ( $wp_filesystem->errors->has_errors() ) {
889 foreach ( $wp_filesystem->errors->get_error_messages() as $message ) {
890 show_message( $message );
891 }
892 echo '</div>';
893 return;
894 }
895
896 if ( $reinstall ) {
897 $update->response = 'reinstall';
898 }
899
900 add_filter( 'update_feedback', 'show_message' );
901
902 $upgrader = new Core_Upgrader();
903 $result = $upgrader->upgrade(
904 $update,
905 array(
906 'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership,
907 )
908 );
909
910 if ( is_wp_error( $result ) ) {
911 show_message( $result );
912 if ( 'up_to_date' !== $result->get_error_code() && 'locked' !== $result->get_error_code() ) {
913 show_message( __( 'Installation failed.' ) );
914 }
915 echo '</div>';
916 return;
917 }
918
919 show_message( __( 'WordPress updated successfully.' ) );
920 show_message(
921 '<span class="hide-if-no-js">' . sprintf(
922 /* translators: 1: WordPress version, 2: URL to About screen. */
923 __( 'Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click <a href="%2$s">here</a>.' ),
924 $result,
925 esc_url( self_admin_url( 'about.php?updated' ) )
926 ) . '</span>'
927 );
928 show_message(
929 '<span class="hide-if-js">' . sprintf(
930 /* translators: 1: WordPress version, 2: URL to About screen. */
931 __( 'Welcome to WordPress %1$s. <a href="%2$s">Learn more</a>.' ),
932 $result,
933 esc_url( self_admin_url( 'about.php?updated' ) )
934 ) . '</span>'
935 );
936 ?>
937 </div>
938 <script type="text/javascript">
939 window.location = '<?php echo esc_url( self_admin_url( 'about.php?updated' ) ); ?>';
940 </script>
941 <?php
942}
943
944/**
945 * Dismiss a core update.
946 *
947 * @since 2.7.0
948 */
949function do_dismiss_core_update() {
950 $version = isset( $_POST['version'] ) ? $_POST['version'] : false;
951 $locale = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US';
952 $update = find_core_update( $version, $locale );
953 if ( ! $update ) {
954 return;
955 }
956 dismiss_core_update( $update );
957 wp_redirect( wp_nonce_url( 'update-core.php?action=upgrade-core', 'upgrade-core' ) );
958 exit;
959}
960
961/**
962 * Undismiss a core update.
963 *
964 * @since 2.7.0
965 */
966function do_undismiss_core_update() {
967 $version = isset( $_POST['version'] ) ? $_POST['version'] : false;
968 $locale = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US';
969 $update = find_core_update( $version, $locale );
970 if ( ! $update ) {
971 return;
972 }
973 undismiss_core_update( $version, $locale );
974 wp_redirect( wp_nonce_url( 'update-core.php?action=upgrade-core', 'upgrade-core' ) );
975 exit;
976}
977
978$action = isset( $_GET['action'] ) ? $_GET['action'] : 'upgrade-core';
979
980$upgrade_error = false;
981if ( ( 'do-theme-upgrade' === $action || ( 'do-plugin-upgrade' === $action && ! isset( $_GET['plugins'] ) ) )
982 && ! isset( $_POST['checked'] ) ) {
983 $upgrade_error = ( 'do-theme-upgrade' === $action ) ? 'themes' : 'plugins';
984 $action = 'upgrade-core';
985}
986
987$title = __( 'WordPress Updates' );
988$parent_file = 'index.php';
989
990$updates_overview = '<p>' . __( 'On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories.' ) . '</p>';
991$updates_overview .= '<p>' . __( 'If an update is available, you&#8127;ll see a notification appear in the Toolbar and navigation menu.' ) . ' ' . __( 'Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers.' ) . '</p>';
992
993get_current_screen()->add_help_tab(
994 array(
995 'id' => 'overview',
996 'title' => __( 'Overview' ),
997 'content' => $updates_overview,
998 )
999);
1000
1001$updates_howto = '<p>' . __( '<strong>WordPress</strong> &mdash; Updating your WordPress installation is a simple one-click procedure: just <strong>click on the &#8220;Update now&#8221; button</strong> when you are notified that a new version is available.' ) . ' ' . __( 'In most cases, WordPress will automatically apply maintenance and security updates in the background for you.' ) . '</p>';
1002$updates_howto .= '<p>' . __( '<strong>Themes and Plugins</strong> &mdash; To update individual themes or plugins from this screen, use the checkboxes to make your selection, then <strong>click on the appropriate &#8220;Update&#8221; button</strong>. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button.' ) . '</p>';
1003
1004if ( 'en_US' !== get_locale() ) {
1005 $updates_howto .= '<p>' . __( '<strong>Translations</strong> &mdash; The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can <strong>click the &#8220;Update Translations&#8221;</strong> button.' ) . '</p>';
1006}
1007
1008get_current_screen()->add_help_tab(
1009 array(
1010 'id' => 'how-to-update',
1011 'title' => __( 'How to Update' ),
1012 'content' => $updates_howto,
1013 )
1014);
1015
1016$help_sidebar_autoupdates = '';
1017
1018if ( ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) || ( current_user_can( 'update_plugins' ) && wp_is_auto_update_enabled_for_type( 'plugin' ) ) ) {
1019 $help_tab_autoupdates = '<p>' . __( 'Auto-updates can be enabled or disabled for WordPress major versions and for each individual theme or plugin. Themes or plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system.' ) . '</p>';
1020 $help_tab_autoupdates .= '<p>' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '</p>';
1021
1022 get_current_screen()->add_help_tab(
1023 array(
1024 'id' => 'plugins-themes-auto-updates',
1025 'title' => __( 'Auto-updates' ),
1026 'content' => $help_tab_autoupdates,
1027 )
1028 );
1029
1030 $help_sidebar_autoupdates = '<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-themes-auto-updates/">Documentation on Auto-updates</a>' ) . '</p>';
1031}
1032
1033$help_sidebar_rollback = '';
1034
1035if ( current_user_can( 'update_themes' ) || current_user_can( 'update_plugins' ) ) {
1036 $rollback_help = '<p>' . __( 'This feature will create a temporary backup of a plugin or theme before it is upgraded. This backup is used to restore the plugin or theme back to its previous state if there is an error during the update process.' ) . '</p>';
1037
1038 $rollback_help .= '<p>' . __( 'On systems with fewer resources, this may lead to server timeouts or resource limits being reached. If you encounter an issue during the update process, please create a support forum topic and reference <strong>Rollback</strong> in the issue title.' ) . '</p>';
1039
1040 get_current_screen()->add_help_tab(
1041 array(
1042 'id' => 'rollback-plugins-themes',
1043 'title' => __( 'Restore Plugin or Theme' ),
1044 'content' => $rollback_help,
1045 )
1046 );
1047
1048 $help_sidebar_rollback = '<p>' . __( '<a href="https://developer.wordpress.org/advanced-administration/wordpress/common-errors/">Common Errors</a>' ) . '</p>';
1049}
1050
1051get_current_screen()->set_help_sidebar(
1052 '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
1053 '<p>' . __( '<a href="https://wordpress.org/documentation/article/dashboard-updates-screen/">Documentation on Updating WordPress</a>' ) . '</p>' .
1054 $help_sidebar_autoupdates .
1055 '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' .
1056 $help_sidebar_rollback
1057);
1058
1059if ( 'upgrade-core' === $action ) {
1060 // Force an update check when requested.
1061 $force_check = ! empty( $_GET['force-check'] );
1062 wp_version_check( array(), $force_check );
1063
1064 require_once ABSPATH . 'wp-admin/admin-header.php';
1065 ?>
1066 <div class="wrap">
1067 <h1><?php _e( 'WordPress Updates' ); ?></h1>
1068 <p><?php _e( 'Updates may take several minutes to complete. If there is no feedback after 5 minutes, or if there are errors please refer to the Help section above.' ); ?></p>
1069
1070 <?php
1071 if ( $upgrade_error ) {
1072 if ( 'themes' === $upgrade_error ) {
1073 $theme_updates = get_theme_updates();
1074 if ( ! empty( $theme_updates ) ) {
1075 wp_admin_notice(
1076 __( 'Please select one or more themes to update.' ),
1077 array(
1078 'additional_classes' => array( 'error' ),
1079 )
1080 );
1081 }
1082 } else {
1083 $plugin_updates = get_plugin_updates();
1084 if ( ! empty( $plugin_updates ) ) {
1085 wp_admin_notice(
1086 __( 'Please select one or more plugins to update.' ),
1087 array(
1088 'additional_classes' => array( 'error' ),
1089 )
1090 );
1091 }
1092 }
1093 }
1094
1095 $last_update_check = false;
1096 $current = get_site_transient( 'update_core' );
1097
1098 if ( $current && isset( $current->last_checked ) ) {
1099 $last_update_check = $current->last_checked + (int) ( (float) get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
1100 }
1101
1102 echo '<h2 class="wp-current-version">';
1103 /* translators: Current version of WordPress. */
1104 printf( __( 'Current version: %s' ), esc_html( wp_get_wp_version() ) );
1105 echo '</h2>';
1106
1107 echo '<p class="update-last-checked">';
1108
1109 printf(
1110 /* translators: 1: Date, 2: Time. */
1111 __( 'Last checked on %1$s at %2$s.' ),
1112 /* translators: Last update date format. See https://www.php.net/manual/datetime.format.php */
1113 date_i18n( __( 'F j, Y' ), $last_update_check ),
1114 /* translators: Last update time format. See https://www.php.net/manual/datetime.format.php */
1115 date_i18n( __( 'g:i a T' ), $last_update_check )
1116 );
1117 echo ' <a href="' . esc_url( self_admin_url( 'update-core.php?force-check=1' ) ) . '">' . __( 'Check again.' ) . '</a>';
1118 echo '</p>';
1119
1120 if ( current_user_can( 'update_core' ) ) {
1121 core_auto_updates_settings();
1122 core_upgrade_preamble();
1123 }
1124 if ( current_user_can( 'update_plugins' ) ) {
1125 list_plugin_updates();
1126 }
1127 if ( current_user_can( 'update_themes' ) ) {
1128 list_theme_updates();
1129 }
1130 if ( current_user_can( 'update_languages' ) ) {
1131 list_translation_updates();
1132 }
1133
1134 /**
1135 * Fires after the core, plugin, and theme update tables.
1136 *
1137 * @since 2.9.0
1138 */
1139 do_action( 'core_upgrade_preamble' );
1140 echo '</div>';
1141
1142 wp_localize_script(
1143 'updates',
1144 '_wpUpdatesItemCounts',
1145 array(
1146 'totals' => wp_get_update_data(),
1147 )
1148 );
1149
1150 require_once ABSPATH . 'wp-admin/admin-footer.php';
1151
1152} elseif ( 'do-core-upgrade' === $action || 'do-core-reinstall' === $action ) {
1153
1154 if ( ! current_user_can( 'update_core' ) ) {
1155 wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1156 }
1157
1158 check_admin_referer( 'upgrade-core' );
1159
1160 // Do the (un)dismiss actions before headers, so that they can redirect.
1161 if ( isset( $_POST['dismiss'] ) ) {
1162 do_dismiss_core_update();
1163 } elseif ( isset( $_POST['undismiss'] ) ) {
1164 do_undismiss_core_update();
1165 }
1166
1167 require_once ABSPATH . 'wp-admin/admin-header.php';
1168 if ( 'do-core-reinstall' === $action ) {
1169 $reinstall = true;
1170 } else {
1171 $reinstall = false;
1172 }
1173
1174 if ( isset( $_POST['upgrade'] ) ) {
1175 do_core_upgrade( $reinstall );
1176 }
1177
1178 wp_localize_script(
1179 'updates',
1180 '_wpUpdatesItemCounts',
1181 array(
1182 'totals' => wp_get_update_data(),
1183 )
1184 );
1185
1186 require_once ABSPATH . 'wp-admin/admin-footer.php';
1187
1188} elseif ( 'do-plugin-upgrade' === $action ) {
1189
1190 if ( ! current_user_can( 'update_plugins' ) ) {
1191 wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1192 }
1193
1194 check_admin_referer( 'upgrade-core' );
1195
1196 if ( isset( $_GET['plugins'] ) ) {
1197 $plugins = explode( ',', $_GET['plugins'] );
1198 } elseif ( isset( $_POST['checked'] ) ) {
1199 $plugins = (array) $_POST['checked'];
1200 } else {
1201 wp_redirect( admin_url( 'update-core.php' ) );
1202 exit;
1203 }
1204
1205 $url = 'update.php?action=update-selected&plugins=' . urlencode( implode( ',', $plugins ) );
1206 $url = wp_nonce_url( $url, 'bulk-update-plugins' );
1207
1208 // Used in the HTML title tag.
1209 $title = __( 'Update Plugins' );
1210
1211 require_once ABSPATH . 'wp-admin/admin-header.php';
1212 ?>
1213 <div class="wrap">
1214 <h1><?php _e( 'Update Plugins' ); ?></h1>
1215 <iframe src="<?php echo $url; ?>" style="width: 100%; height: 100%; min-height: 750px;" frameborder="0" title="<?php esc_attr_e( 'Update progress' ); ?>"></iframe>
1216 </div>
1217 <?php
1218
1219 wp_localize_script(
1220 'updates',
1221 '_wpUpdatesItemCounts',
1222 array(
1223 'totals' => wp_get_update_data(),
1224 )
1225 );
1226
1227 require_once ABSPATH . 'wp-admin/admin-footer.php';
1228
1229} elseif ( 'do-theme-upgrade' === $action ) {
1230
1231 if ( ! current_user_can( 'update_themes' ) ) {
1232 wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1233 }
1234
1235 check_admin_referer( 'upgrade-core' );
1236
1237 if ( isset( $_GET['themes'] ) ) {
1238 $themes = explode( ',', $_GET['themes'] );
1239 } elseif ( isset( $_POST['checked'] ) ) {
1240 $themes = (array) $_POST['checked'];
1241 } else {
1242 wp_redirect( admin_url( 'update-core.php' ) );
1243 exit;
1244 }
1245
1246 $url = 'update.php?action=update-selected-themes&themes=' . urlencode( implode( ',', $themes ) );
1247 $url = wp_nonce_url( $url, 'bulk-update-themes' );
1248
1249 // Used in the HTML title tag.
1250 $title = __( 'Update Themes' );
1251
1252 require_once ABSPATH . 'wp-admin/admin-header.php';
1253 ?>
1254 <div class="wrap">
1255 <h1><?php _e( 'Update Themes' ); ?></h1>
1256 <iframe src="<?php echo $url; ?>" style="width: 100%; height: 100%; min-height: 750px;" frameborder="0" title="<?php esc_attr_e( 'Update progress' ); ?>"></iframe>
1257 </div>
1258 <?php
1259
1260 wp_localize_script(
1261 'updates',
1262 '_wpUpdatesItemCounts',
1263 array(
1264 'totals' => wp_get_update_data(),
1265 )
1266 );
1267
1268 require_once ABSPATH . 'wp-admin/admin-footer.php';
1269
1270} elseif ( 'do-translation-upgrade' === $action ) {
1271
1272 if ( ! current_user_can( 'update_languages' ) ) {
1273 wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1274 }
1275
1276 check_admin_referer( 'upgrade-translations' );
1277
1278 require_once ABSPATH . 'wp-admin/admin-header.php';
1279 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1280
1281 $url = 'update-core.php?action=do-translation-upgrade';
1282 $nonce = 'upgrade-translations';
1283 $title = __( 'Update Translations' );
1284 $context = WP_LANG_DIR;
1285
1286 $upgrader = new Language_Pack_Upgrader( new Language_Pack_Upgrader_Skin( compact( 'url', 'nonce', 'title', 'context' ) ) );
1287 $result = $upgrader->bulk_upgrade();
1288
1289 wp_localize_script(
1290 'updates',
1291 '_wpUpdatesItemCounts',
1292 array(
1293 'totals' => wp_get_update_data(),
1294 )
1295 );
1296
1297 require_once ABSPATH . 'wp-admin/admin-footer.php';
1298
1299} elseif ( 'core-major-auto-updates-settings' === $action ) {
1300
1301 if ( ! current_user_can( 'update_core' ) ) {
1302 wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1303 }
1304
1305 $redirect_url = self_admin_url( 'update-core.php' );
1306
1307 if ( isset( $_GET['value'] ) ) {
1308 check_admin_referer( 'core-major-auto-updates-nonce' );
1309
1310 if ( 'enable' === $_GET['value'] ) {
1311 update_site_option( 'auto_update_core_major', 'enabled' );
1312 $redirect_url = add_query_arg( 'core-major-auto-updates-saved', 'enabled', $redirect_url );
1313 } elseif ( 'disable' === $_GET['value'] ) {
1314 update_site_option( 'auto_update_core_major', 'disabled' );
1315 $redirect_url = add_query_arg( 'core-major-auto-updates-saved', 'disabled', $redirect_url );
1316 }
1317 }
1318
1319 wp_redirect( $redirect_url );
1320 exit;
1321} else {
1322 /**
1323 * Fires for each custom update action on the WordPress Updates screen.
1324 *
1325 * The dynamic portion of the hook name, `$action`, refers to the
1326 * passed update action. The hook fires in lieu of all available
1327 * default update actions.
1328 *
1329 * @since 3.2.0
1330 */
1331 do_action( "update-core-custom_{$action}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
1332}
1333