230
230
if ( ! isset( $cur->response ) || $cur->response != 'upgrade' )
233
if ( current_user_can('update_core') ) {
234
$msg = sprintf( __( '<a href="https://codex.wordpress.org/Version_%1$s">WordPress %1$s</a> is available! <a href="%2$s" aria-label="Please update WordPress now">Please update now</a>.' ), $cur->current, network_admin_url( 'update-core.php' ) );
233
if ( current_user_can( 'update_core' ) ) {
235
/* translators: 1: Codex URL to release notes, 2: new WordPress version, 3: URL to network admin, 4: accessibility text */
236
__( '<a href="%1$s">WordPress %2$s</a> is available! <a href="%3$s" aria-label="%4$s">Please update now</a>.' ),
238
/* translators: %s: WordPress version */
239
esc_url( __( 'https://codex.wordpress.org/Version_%s' ) ),
243
network_admin_url( 'update-core.php' ),
244
esc_attr__( 'Please update WordPress now' )
236
$msg = sprintf( __('<a href="https://codex.wordpress.org/Version_%1$s">WordPress %1$s</a> is available! Please notify the site administrator.'), $cur->current );
248
/* translators: 1: Codex URL to release notes, 2: new WordPress version */
249
__( '<a href="%1$s">WordPress %2$s</a> is available! Please notify the site administrator.' ),
251
/* translators: %s: WordPress version */
252
esc_url( __( 'https://codex.wordpress.org/Version_%s' ) ),
238
258
echo "<div class='update-nag'>$msg</div>";
332
* Displays update information for a plugin.
313
* @param string $file
314
* @param array $plugin_data
334
* @param string $file Plugin basename.
335
* @param array $plugin_data Plugin information.
315
336
* @return false|void
317
338
function wp_plugin_update_row( $file, $plugin_data ) {
318
339
$current = get_site_transient( 'update_plugins' );
319
if ( !isset( $current->response[ $file ] ) )
340
if ( ! isset( $current->response[ $file ] ) ) {
322
$r = $current->response[ $file ];
324
$plugins_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array());
325
$plugin_name = wp_kses( $plugin_data['Name'], $plugins_allowedtags );
327
$details_url = self_admin_url('plugin-install.php?tab=plugin-information&plugin=' . $r->slug . '§ion=changelog&TB_iframe=true&width=600&height=800');
329
$wp_list_table = _get_list_table('WP_Plugins_List_Table');
331
if ( is_network_admin() || !is_multisite() ) {
344
$response = $current->response[ $file ];
346
$plugins_allowedtags = array(
347
'a' => array( 'href' => array(), 'title' => array() ),
348
'abbr' => array( 'title' => array() ),
349
'acronym' => array( 'title' => array() ),
355
$plugin_name = wp_kses( $plugin_data['Name'], $plugins_allowedtags );
356
$details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $response->slug . '§ion=changelog&TB_iframe=true&width=600&height=800' );
358
/** @var WP_Plugins_List_Table $wp_list_table */
359
$wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
361
if ( is_network_admin() || ! is_multisite() ) {
332
362
if ( is_network_admin() ) {
333
$active_class = is_plugin_active_for_network( $file ) ? ' active': '';
363
$active_class = is_plugin_active_for_network( $file ) ? ' active' : '';
335
365
$active_class = is_plugin_active( $file ) ? ' active' : '';
338
echo '<tr class="plugin-update-tr' . $active_class . '" id="' . esc_attr( $r->slug . '-update' ) . '" data-slug="' . esc_attr( $r->slug ) . '" data-plugin="' . esc_attr( $file ) . '"><td colspan="' . esc_attr( $wp_list_table->get_column_count() ) . '" class="plugin-update colspanchange"><div class="update-message">';
368
echo '<tr class="plugin-update-tr' . $active_class . '" id="' . esc_attr( $response->slug . '-update' ) . '" data-slug="' . esc_attr( $response->slug ) . '" data-plugin="' . esc_attr( $file ) . '"><td colspan="' . esc_attr( $wp_list_table->get_column_count() ) . '" class="plugin-update colspanchange"><div class="update-message notice inline notice-warning notice-alt"><p>';
340
370
if ( ! current_user_can( 'update_plugins' ) ) {
341
/* translators: 1: plugin name, 2: details URL, 3: accessibility text, 4: version number */
342
printf( __( 'There is a new version of %1$s available. <a href="%2$s" class="thickbox open-plugin-details-modal" aria-label="%3$s">View version %4$s details</a>.' ),
371
/* translators: 1: plugin name, 2: details URL, 3: additional link attributes, 4: version number */
372
printf( __( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>.' ),
344
374
esc_url( $details_url ),
345
/* translators: 1: plugin name, 2: version number */
346
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $r->new_version ) ),
375
sprintf( 'class="thickbox open-plugin-details-modal" aria-label="%s"',
376
/* translators: 1: plugin name, 2: version number */
377
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) )
379
$response->new_version
349
} elseif ( empty( $r->package ) ) {
350
/* translators: 1: plugin name, 2: details URL, 3: accessibility text, 4: version number */
351
printf( __( 'There is a new version of %1$s available. <a href="%2$s" class="thickbox open-plugin-details-modal" aria-label="%3$s">View version %4$s details</a>. <em>Automatic update is unavailable for this plugin.</em>' ),
381
} elseif ( empty( $response->package ) ) {
382
/* translators: 1: plugin name, 2: details URL, 3: additional link attributes, 4: version number */
383
printf( __( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>. <em>Automatic update is unavailable for this plugin.</em>' ),
353
385
esc_url( $details_url ),
354
/* translators: 1: plugin name, 2: version number */
355
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $r->new_version ) ),
386
sprintf( 'class="thickbox open-plugin-details-modal" aria-label="%s"',
387
/* translators: 1: plugin name, 2: version number */
388
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) )
390
$response->new_version
359
/* translators: 1: plugin name, 2: details URL, 3: accessibility text, 4: version number, 5: update URL, 6: accessibility text */
360
printf( __( 'There is a new version of %1$s available. <a href="%2$s" class="thickbox open-plugin-details-modal" aria-label="%3$s">View version %4$s details</a> or <a href="%5$s" class="update-link" aria-label="%6$s">update now</a>.' ),
393
/* translators: 1: plugin name, 2: details URL, 3: additional link attributes, 4: version number, 5: update URL, 6: additional link attributes */
394
printf( __( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a> or <a href="%5$s" %6$s>update now</a>.' ),
362
396
esc_url( $details_url ),
363
/* translators: 1: plugin name, 2: version number */
364
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $r->new_version ) ),
397
sprintf( 'class="thickbox open-plugin-details-modal" aria-label="%s"',
398
/* translators: 1: plugin name, 2: version number */
399
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) )
401
$response->new_version,
366
402
wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $file, 'upgrade-plugin_' . $file ),
367
/* translators: %s: plugin name */
368
esc_attr( sprintf( __( 'Update %s now' ), $plugin_name ) )
403
sprintf( 'class="update-link" aria-label="%s"',
404
/* translators: %s: plugin name */
405
esc_attr( sprintf( __( 'Update %s now' ), $plugin_name ) )
372
411
* Fires at the end of the update message container in each
373
412
* row of the plugins list table.
380
419
* @param array $plugin_data {
381
420
* An array of plugin metadata.
383
* @type string $name The human-readable name of the plugin.
384
* @type string $plugin_uri Plugin URI.
385
* @type string $version Plugin version.
386
* @type string $description Plugin description.
387
* @type string $author Plugin author.
388
* @type string $author_uri Plugin author URI.
389
* @type string $text_domain Plugin text domain.
390
* @type string $domain_path Relative path to the plugin's .mo file(s).
391
* @type bool $network Whether the plugin can only be activated network wide.
392
* @type string $title The human-readable title of the plugin.
393
* @type string $author_name Plugin author's name.
394
* @type bool $update Whether there's an available update. Default null.
397
* An array of metadata about the available plugin update.
399
* @type int $id Plugin ID.
400
* @type string $slug Plugin slug.
401
* @type string $new_version New plugin version.
402
* @type string $url Plugin URL.
403
* @type string $package Plugin update package URL.
422
* @type string $name The human-readable name of the plugin.
423
* @type string $plugin_uri Plugin URI.
424
* @type string $version Plugin version.
425
* @type string $description Plugin description.
426
* @type string $author Plugin author.
427
* @type string $author_uri Plugin author URI.
428
* @type string $text_domain Plugin text domain.
429
* @type string $domain_path Relative path to the plugin's .mo file(s).
430
* @type bool $network Whether the plugin can only be activated network wide.
431
* @type string $title The human-readable title of the plugin.
432
* @type string $author_name Plugin author's name.
433
* @type bool $update Whether there's an available update. Default null.
435
* @param array $response {
436
* An array of metadata about the available plugin update.
438
* @type int $id Plugin ID.
439
* @type string $slug Plugin slug.
440
* @type string $new_version New plugin version.
441
* @type string $url Plugin URL.
442
* @type string $package Plugin update package URL.
406
do_action( "in_plugin_update_message-{$file}", $plugin_data, $r );
445
do_action( "in_plugin_update_message-{$file}", $plugin_data, $response );
408
echo '</div></td></tr>';
447
echo '</p></div></td></tr>';
488
* Displays update information for a theme.
450
* @param string $theme_key
451
* @param WP_Theme $theme
490
* @param string $theme_key Theme stylesheet.
491
* @param WP_Theme $theme Theme object.
452
492
* @return false|void
454
494
function wp_theme_update_row( $theme_key, $theme ) {
455
495
$current = get_site_transient( 'update_themes' );
456
if ( !isset( $current->response[ $theme_key ] ) )
497
if ( ! isset( $current->response[ $theme_key ] ) ) {
459
$r = $current->response[ $theme_key ];
461
$theme_name = $theme['Name'];
463
$details_url = add_query_arg( array( 'TB_iframe' => 'true', 'width' => 1024, 'height' => 800 ), $current->response[ $theme_key ]['url'] );
465
$wp_list_table = _get_list_table('WP_MS_Themes_List_Table');
467
$active = $theme->is_allowed( 'network' ) ? ' active': '';
469
echo '<tr class="plugin-update-tr' . $active . '" id="' . esc_attr( $theme->get_stylesheet() . '-update' ) . '" data-slug="' . esc_attr( $theme->get_stylesheet() ) . '"><td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange"><div class="update-message">';
470
if ( ! current_user_can('update_themes') ) {
471
/* translators: 1: theme name, 2: details URL, 3: accessibility text, 4: version number */
472
printf( __( 'There is a new version of %1$s available. <a href="%2$s" class="thickbox open-plugin-details-modal" aria-label="%3$s">View version %4$s details</a>.'),
501
$response = $current->response[ $theme_key ];
503
$details_url = add_query_arg( array(
504
'TB_iframe' => 'true',
507
), $current->response[ $theme_key ]['url'] );
509
/** @var WP_MS_Themes_List_Table $wp_list_table */
510
$wp_list_table = _get_list_table( 'WP_MS_Themes_List_Table' );
512
$active = $theme->is_allowed( 'network' ) ? ' active' : '';
514
echo '<tr class="plugin-update-tr' . $active . '" id="' . esc_attr( $theme->get_stylesheet() . '-update' ) . '" data-slug="' . esc_attr( $theme->get_stylesheet() ) . '"><td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange"><div class="update-message notice inline notice-warning notice-alt"><p>';
515
if ( ! current_user_can( 'update_themes' ) ) {
516
/* translators: 1: theme name, 2: details URL, 3: additional link attributes, 4: version number */
517
printf( __( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>.'),
474
519
esc_url( $details_url ),
475
/* translators: 1: theme name, 2: version number */
476
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme_name, $r['new_version'] ) ),
520
sprintf( 'class="thickbox open-plugin-details-modal" aria-label="%s"',
521
/* translators: 1: theme name, 2: version number */
522
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme['Name'], $response['new_version'] ) )
524
$response['new_version']
479
} elseif ( empty( $r['package'] ) ) {
480
/* translators: 1: theme name, 2: details URL, 3: accessibility text, 4: version number */
481
printf( __( 'There is a new version of %1$s available. <a href="%2$s" class="thickbox open-plugin-details-modal" aria-label="%3$s">View version %4$s details</a>. <em>Automatic update is unavailable for this theme.</em>' ),
526
} elseif ( empty( $response['package'] ) ) {
527
/* translators: 1: theme name, 2: details URL, 3: additional link attributes, 4: version number */
528
printf( __( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>. <em>Automatic update is unavailable for this theme.</em>' ),
483
530
esc_url( $details_url ),
484
/* translators: 1: theme name, 2: version number */
485
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme_name, $r['new_version'] ) ),
531
sprintf( 'class="thickbox open-plugin-details-modal" aria-label="%s"',
532
/* translators: 1: theme name, 2: version number */
533
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme['Name'], $response['new_version'] ) )
535
$response['new_version']
489
/* translators: 1: theme name, 2: details URL, 3: accessibility text, 4: version number, 5: update URL, 6: accessibility text */
490
printf( __( 'There is a new version of %1$s available. <a href="%2$s" class="thickbox open-plugin-details-modal" aria-label="%3$s">View version %4$s details</a> or <a href="%5$s" class="update-link" aria-label="%6$s">update now</a>.' ),
538
/* translators: 1: theme name, 2: details URL, 3: additional link attributes, 4: version number, 5: update URL, 6: additional link attributes */
539
printf( __( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a> or <a href="%5$s" %6$s>update now</a>.' ),
492
541
esc_url( $details_url ),
493
/* translators: 1: theme name, 2: version number */
494
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme_name, $r['new_version'] ) ),
542
sprintf( 'class="thickbox open-plugin-details-modal" aria-label="%s"',
543
/* translators: 1: theme name, 2: version number */
544
esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme['Name'], $response['new_version'] ) )
546
$response['new_version'],
496
547
wp_nonce_url( self_admin_url( 'update.php?action=upgrade-theme&theme=' ) . $theme_key, 'upgrade-theme_' . $theme_key ),
497
/* translators: %s: theme name */
498
esc_attr( sprintf( __( 'Update %s now' ), $theme_name ) )
548
sprintf( 'class="update-link" aria-label="%s"',
549
/* translators: %s: theme name */
550
esc_attr( sprintf( __( 'Update %s now' ), $theme['Name'] ) )
502
556
* Fires at the end of the update message container in each
503
557
* row of the themes list table.
558
612
echo "<div class='update-nag'>$msg</div>";
616
* Prints the JavaScript templates for update admin notices.
618
* Template takes one argument with four values:
620
* param {object} data {
621
* Arguments for admin notice.
623
* @type string id ID of the notice.
624
* @type string className Class names for the notice.
625
* @type string message The notice's message.
626
* @type string type The type of update the notice is for. Either 'plugin' or 'theme'.
631
function wp_print_admin_notice_templates() {
633
<script id="tmpl-wp-updates-admin-notice" type="text/html">
634
<div <# if ( data.id ) { #>id="{{ data.id }}"<# } #> class="notice {{ data.className }}"><p>{{{ data.message }}}</p></div>
636
<script id="tmpl-wp-bulk-updates-admin-notice" type="text/html">
637
<div id="{{ data.id }}" class="{{ data.className }} notice <# if ( data.errors ) { #>notice-error<# } else { #>notice-success<# } #>">
639
<# if ( data.successes ) { #>
640
<# if ( 1 === data.successes ) { #>
641
<# if ( 'plugin' === data.type ) { #>
643
/* translators: %s: Number of plugins */
644
printf( __( '%s plugin successfully updated.' ), '{{ data.successes }}' );
648
/* translators: %s: Number of themes */
649
printf( __( '%s theme successfully updated.' ), '{{ data.successes }}' );
653
<# if ( 'plugin' === data.type ) { #>
655
/* translators: %s: Number of plugins */
656
printf( __( '%s plugins successfully updated.' ), '{{ data.successes }}' );
660
/* translators: %s: Number of themes */
661
printf( __( '%s themes successfully updated.' ), '{{ data.successes }}' );
666
<# if ( data.errors ) { #>
667
<button class="button-link bulk-action-errors-collapsed" aria-expanded="false">
668
<# if ( 1 === data.errors ) { #>
670
/* translators: %s: Number of failed updates */
671
printf( __( '%s update failed.' ), '{{ data.errors }}' );
675
/* translators: %s: Number of failed updates */
676
printf( __( '%s updates failed.' ), '{{ data.errors }}' );
679
<span class="screen-reader-text"><?php _e( 'Show more details' ); ?></span>
680
<span class="toggle-indicator" aria-hidden="true"></span>
684
<# if ( data.errors ) { #>
685
<ul class="bulk-action-errors hidden">
686
<# _.each( data.errorMessages, function( errorMessage ) { #>
687
<li>{{ errorMessage }}</li>
697
* Prints the JavaScript templates for update and deletion rows in list tables.
699
* The update template takes one argument with four values:
701
* param {object} data {
702
* Arguments for the update row
704
* @type string slug Plugin slug.
705
* @type string plugin Plugin base name.
706
* @type string colspan The number of table columns this row spans.
707
* @type string content The row content.
710
* The delete template takes one argument with four values:
712
* param {object} data {
713
* Arguments for the update row
715
* @type string slug Plugin slug.
716
* @type string plugin Plugin base name.
717
* @type string name Plugin name.
718
* @type string colspan The number of table columns this row spans.
723
function wp_print_update_row_templates() {
725
<script id="tmpl-item-update-row" type="text/template">
726
<tr class="plugin-update-tr update" id="{{ data.slug }}-update" data-slug="{{ data.slug }}" <# if ( data.plugin ) { #>data-plugin="{{ data.plugin }}"<# } #>>
727
<td colspan="{{ data.colspan }}" class="plugin-update colspanchange">
732
<script id="tmpl-item-deleted-row" type="text/template">
733
<tr class="plugin-deleted-tr inactive deleted" id="{{ data.slug }}-deleted" data-slug="{{ data.slug }}" <# if ( data.plugin ) { #>data-plugin="{{ data.plugin }}"<# } #>>
734
<td colspan="{{ data.colspan }}" class="plugin-update colspanchange">
735
<# if ( data.plugin ) { #>
738
/* translators: %s: Plugin name */
739
_x( '%s was successfully deleted.', 'plugin' ),
740
'<strong>{{{ data.name }}}</strong>'
746
/* translators: %s: Theme name */
747
_x( '%s was successfully deleted.', 'theme' ),
748
'<strong>{{{ data.name }}}</strong>'