WordPress.org

Make WordPress Core

Ticket #48850: 48850.5.diff

File 48850.5.diff, 13.6 KB (added by audrasjb, 21 months ago)

Replace Activate/Deactivate with Enable/Disable and add Enable/Disable Autoupdate action for each plugin in Plugins screen

  • src/wp-admin/includes/class-wp-plugins-list-table.php

    diff --git a/src/wp-admin/includes/class-wp-plugins-list-table.php b/src/wp-admin/includes/class-wp-plugins-list-table.php
    index a36ec05221..e299f47734 100644
    a b class WP_Plugins_List_Table extends WP_List_Table { 
    4040                );
    4141
    4242                $status = 'all';
    43                 if ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'active', 'inactive', 'recently_activated', 'upgrade', 'mustuse', 'dropins', 'search', 'paused' ) ) ) {
     43                if ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'active', 'inactive', 'recently_activated', 'upgrade', 'mustuse', 'dropins', 'search', 'paused', 'update-on', 'update-off' ) ) ) {
    4444                        $status = $_REQUEST['plugin_status'];
    4545                }
    4646
    class WP_Plugins_List_Table extends WP_List_Table { 
    100100                        'mustuse'            => array(),
    101101                        'dropins'            => array(),
    102102                        'paused'             => array(),
     103                        'update-on'          => array(),
     104                        'update-off'         => array(),
    103105                );
    104106
    105107                $screen = $this->screen;
    class WP_Plugins_List_Table extends WP_List_Table { 
    179181                        update_option( 'recently_activated', $recently_activated );
    180182                }
    181183
    182                 $plugin_info = get_site_transient( 'update_plugins' );
     184                $plugin_info            = get_site_transient( 'update_plugins' );
     185                $wp_autoupdated_plugins = get_option( 'wp_autoupdated_plugins', array() );
    183186
    184187                foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {
    185188                        // Extra info if known. array_merge() ensures $plugin_data has precedence if keys collide.
    class WP_Plugins_List_Table extends WP_List_Table { 
    233236                                // Populate the inactive list with plugins that aren't activated
    234237                                $plugins['inactive'][ $plugin_file ] = $plugin_data;
    235238                        }
     239
     240                        if ( in_array( $plugin_data['plugin'], $wp_autoupdated_plugins, true ) ) {
     241                                $plugins['update-on'][ $plugin_file ] = $plugin_data;
     242                        } else {
     243                                $plugins['update-off'][ $plugin_file ] = $plugin_data;
     244                        }
    236245                }
    237246
    238247                if ( strlen( $s ) ) {
    class WP_Plugins_List_Table extends WP_List_Table { 
    493502                                                $count
    494503                                        );
    495504                                        break;
     505                                case 'update-on':
     506                                        /* translators: %s: Number of plugins. */
     507                                        $text = _n(
     508                                                'Auto Update On <span class="count">(%s)</span>',
     509                                                'Auto Update On <span class="count">(%s)</span>',
     510                                                $count
     511                                        );
     512                                        break;
     513                                case 'update-off':
     514                                        /* translators: %s: Number of plugins. */
     515                                        $text = _n(
     516                                                'Auto Update Off <span class="count">(%s)</span>',
     517                                                'Auto Update Off <span class="count">(%s)</span>',
     518                                                $count
     519                                        );
     520                                        break;
    496521                        }
    497522
    498523                        if ( 'search' !== $type ) {
    class WP_Plugins_List_Table extends WP_List_Table { 
    527552
    528553                if ( ! is_multisite() || $this->screen->in_admin( 'network' ) ) {
    529554                        if ( current_user_can( 'update_plugins' ) ) {
    530                                 $actions['update-selected'] = __( 'Update' );
     555                                $actions['update-selected']             = __( 'Update' );
     556                                $actions['enable-autoupdate-selected']  = __( 'Enable auto update' );
     557                                $actions['disable-autoupdate-selected'] = __( 'Disable auto update' );
    531558                        }
    532559                        if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) ) {
    533560                                $actions['delete-selected'] = __( 'Delete' );
    class WP_Plugins_List_Table extends WP_List_Table { 
    960987                                                }
    961988                                        }
    962989
     990                                        $wp_autoupdated_plugins = get_option( 'wp_autoupdated_plugins', array() );
     991                                        if ( in_array( $plugin_file, $wp_autoupdated_plugins, true ) ) {
     992                                                $aria_label = esc_attr(
     993                                                        sprintf(
     994                                                                /* translators: Plugin name. */
     995                                                                _x( 'Disable automatic updates for %s', 'plugin' ),
     996                                                                $plugin_name
     997                                                        )
     998                                                );
     999                                                echo '<p class="plugin-autoupdate-enabled">';
     1000                                                echo '<span class="dashicons dashicons-update" aria-hidden="true"></span> ' . __( 'Automatic update enabled' );
     1001                                                if ( current_user_can( 'update_plugins', $plugin_file ) ) {
     1002                                                        echo sprintf(
     1003                                                                ' | <a href="%s" class="edit" aria-label="%s">%s</a>',
     1004                                                                wp_nonce_url( 'plugins.php?action=autoupdate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;paged=' . $page, 'autoupdate-plugin_' . $plugin_file ),
     1005                                                                $aria_label,
     1006                                                                __( 'Disable' )
     1007                                                        );
     1008                                                }
     1009                                                echo '</p>';
     1010                                        } else {
     1011                                                if ( current_user_can( 'update_plugins', $plugin_file ) ) {
     1012                                                        $aria_label = esc_attr(
     1013                                                                sprintf(
     1014                                                                        /* translators: Plugin name. */
     1015                                                                        _x( 'Enable automatic updates for %s', 'plugin' ),
     1016                                                                        $plugin_name
     1017                                                                )
     1018                                                        );
     1019                                                        echo '<p class="plugin-autoupdate-enabled">';
     1020                                                        echo sprintf(
     1021                                                                '<a href="%s" class="edit" aria-label="%s"><span class="dashicons dashicons-update" aria-hidden="true"></span> %s</a>',
     1022                                                                wp_nonce_url( 'plugins.php?action=autoupdate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;paged=' . $page, 'autoupdate-plugin_' . $plugin_file ),
     1023                                                                $aria_label,
     1024                                                                __( 'Enable automatic updates' )
     1025                                                        );
     1026                                                        echo '</p>';
     1027                                                }
     1028                                        }
     1029                                       
    9631030                                        echo '</td>';
    9641031                                        break;
    9651032                                default:
  • src/wp-admin/includes/update.php

    diff --git a/src/wp-admin/includes/update.php b/src/wp-admin/includes/update.php
    index 0caa04a963..2d39b9bbde 100644
    a b function wp_plugin_update_row( $file, $plugin_data ) { 
    488488                        );
    489489                } else {
    490490                        if ( $compatible_php ) {
     491                                $wp_autoupdated_plugins = get_option( 'wp_autoupdated_plugins', array() ); /* JBA */
     492                                $autoupdate = '';
     493                                if ( in_array( $plugin_data['plugin'], $wp_autoupdated_plugins, true ) ) {
     494                                        $next_update_time = wp_next_scheduled( 'wp_version_check' );
     495                                        $time_to_next_update = human_time_diff( intval( $next_update_time ) );
     496                                        $autoupdate = ' <span class="plugin-autoupdate-enabled">';
     497                                        $autoupdate .= sprintf(
     498                                                /* translators: Time until the next update. */
     499                                                __( 'Automatic update scheduled in %s.' ),
     500                                                $time_to_next_update
     501                                        );
     502                                        $autoupdate .= '</span> ';
     503                                }
    491504                                printf(
    492                                         /* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number, 5: Update URL, 6: Additional link attributes. */
    493                                         __( '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>.' ),
     505                                        /* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number, 5: Update URL, 6: Additional link attributes, 7: Automatic update informations. */
     506                                        __( '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>. %7$s' ),
    494507                                        $plugin_name,
    495508                                        esc_url( $details_url ),
    496509                                        sprintf(
    function wp_plugin_update_row( $file, $plugin_data ) { 
    504517                                                'class="update-link" aria-label="%s"',
    505518                                                /* translators: %s: Plugin name. */
    506519                                                esc_attr( sprintf( __( 'Update %s now' ), $plugin_name ) )
    507                                         )
     520                                        ),
     521                                        $autoupdate
    508522                                );
    509523                        } else {
    510524                                printf(
  • src/wp-admin/plugins.php

    diff --git a/src/wp-admin/plugins.php b/src/wp-admin/plugins.php
    index acebd8e452..4aef5150eb 100644
    a b if ( $action ) { 
    154154                        require_once( ABSPATH . 'wp-admin/admin-footer.php' );
    155155                        exit;
    156156
     157                case 'autoupdate':
     158                        if ( ! current_user_can( 'update_plugins' ) ) {
     159                                wp_die( __( 'Sorry, you are not allowed to update plugins.' ) );
     160                        }
     161
     162                        if ( is_multisite() && ! is_network_admin() && is_network_only_plugin( $plugin ) ) {
     163                                wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
     164                                exit;
     165                        }
     166
     167                        if ( empty( $plugin ) ) {
     168                                wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
     169                                exit;
     170                        }
     171
     172                        check_admin_referer( 'autoupdate-plugin_' . $plugin );
     173
     174                        $autoupdated_plugins = get_option( 'wp_autoupdated_plugins', array() );
     175                        if ( in_array( $plugin, $autoupdated_plugins, true ) ) {
     176                                $autoupdated_plugins = array_diff( $autoupdated_plugins, array( $plugin ) );
     177                                $action_type = 'disable-autoupdate=true';
     178                        } else {
     179                                $autoupdated_plugins[] = $plugin;
     180                                $action_type = 'enable-autoupdate=true';
     181                        }
     182                        update_option( 'wp_autoupdated_plugins', $autoupdated_plugins );
     183
     184                        wp_redirect( self_admin_url( "plugins.php?$action_type&plugin_status=$status&paged=$page&s=$s" ) );
     185
     186                        exit;
     187
     188                case 'enable-autoupdate-selected':
     189                        if ( ! current_user_can( 'update_plugins' ) ) {
     190                                wp_die( __( 'Sorry, you are not allowed to enable plugin automatic updates.' ) );
     191                        }
     192
     193                        check_admin_referer( 'bulk-plugins' );
     194
     195                        $plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
     196
     197                        if ( empty( $plugins ) ) {
     198                                wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
     199                                exit;
     200                        }
     201
     202                        $previous_autoupdated_plugins = get_option( 'wp_autoupdated_plugins', array() );
     203                        $new_autoupdated_plugins      = array_merge( $previous_autoupdated_plugins, $plugins );
     204                        $new_autoupdated_plugins      = array_unique( $new_autoupdated_plugins );
     205                        update_option( 'wp_autoupdated_plugins', $new_autoupdated_plugins );
     206
     207                        wp_redirect( self_admin_url( "plugins.php?enable-autoupdate=true&plugin_status=$status&paged=$page&s=$s" ) );
     208                        exit;
     209
     210                case 'disable-autoupdate-selected':
     211                        if ( ! current_user_can( 'update_plugins' ) ) {
     212                                wp_die( __( 'Sorry, you are not allowed to disable plugin automatic updates.' ) );
     213                        }
     214
     215                        check_admin_referer( 'bulk-plugins' );
     216
     217                        $plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
     218
     219                        if ( empty( $plugins ) ) {
     220                                wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
     221                                exit;
     222                        }
     223
     224                        $previous_autoupdated_plugins = get_option( 'wp_autoupdated_plugins', array() );
     225                        $new_autoupdated_plugins      = array_diff( $previous_autoupdated_plugins, $plugins );
     226                        $new_autoupdated_plugins      = array_unique( $new_autoupdated_plugins );
     227                        update_option( 'wp_autoupdated_plugins', $new_autoupdated_plugins );
     228
     229                        wp_redirect( self_admin_url( "plugins.php?disable-autoupdate=true&plugin_status=$status&paged=$page&s=$s" ) );
     230                        exit;
     231
    157232                case 'error_scrape':
    158233                        if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
    159234                                wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
    elseif ( isset( $_GET['deleted'] ) ) : 
    578653        <div id="message" class="updated notice is-dismissible"><p><?php _e( 'Selected plugins deactivated.' ); ?></p></div>
    579654<?php elseif ( 'update-selected' == $action ) : ?>
    580655        <div id="message" class="updated notice is-dismissible"><p><?php _e( 'All selected plugins are up to date.' ); ?></p></div>
     656<?php elseif ( isset( $_GET['enable-autoupdate'] ) ) : ?>
     657        <div id="message" class="updated notice is-dismissible"><p><?php _e( 'All selected plugins will now update automatically.' ); ?></p></div>
     658<?php elseif ( isset( $_GET['disable-autoupdate'] ) ) : ?>
     659        <div id="message" class="updated notice is-dismissible"><p><?php _e( 'All selected plugins won’t automatically update anymore.' ); ?></p></div>
    581660<?php elseif ( isset( $_GET['resume'] ) ) : ?>
    582661        <div id="message" class="updated notice is-dismissible"><p><?php _e( 'Plugin resumed.' ); ?></p></div>
    583662<?php endif; ?>
  • src/wp-admin/update-core.php

    diff --git a/src/wp-admin/update-core.php b/src/wp-admin/update-core.php
    index 2093201149..85b2827841 100644
    a b function list_plugin_updates() { 
    328328
    329329        <tbody class="plugins">
    330330        <?php
     331        // Get autoupdated plugins
     332        $wp_autoupdated_plugins = get_option( 'wp_autoupdated_plugins', array() );
     333
    331334        foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
    332335                $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
    333336
    function list_plugin_updates() { 
    395398                );
    396399
    397400                $checkbox_id = 'checkbox_' . md5( $plugin_data->Name );
     401
     402                $autoupdate = '';
     403                if ( in_array( $plugin_data->update->plugin, $wp_autoupdated_plugins, true ) ) {
     404                        $next_update_time = wp_next_scheduled( 'wp_version_check' );
     405                        $time_to_next_update = human_time_diff( intval( $next_update_time ) );
     406                        $autoupdate = ' <span class="plugin-autoupdate-enabled">';
     407                        $autoupdate .= sprintf(
     408                                /* translators: Time until the next update. */
     409                                __( 'Automatic update scheduled in %s.' ),
     410                                $time_to_next_update
     411                        );
     412                        $autoupdate .= '</span> ';
     413                }
    398414                ?>
    399415        <tr>
    400416                <td class="check-column">
    function list_plugin_updates() { 
    418434                                $plugin_data->Version,
    419435                                $plugin_data->update->new_version
    420436                        );
    421                         echo ' ' . $details . $compat . $upgrade_notice;
     437                        echo ' ' . $details . $autoupdate . $compat . $upgrade_notice;
    422438                        ?>
    423439                </p></td>
    424440        </tr>
  • src/wp-includes/update.php

    diff --git a/src/wp-includes/update.php b/src/wp-includes/update.php
    index dfb27b2aad..31222f3207 100644
    a b if ( ( ! is_main_site() && ! is_network_admin() ) || wp_doing_ajax() ) { 
    813813        return;
    814814}
    815815
     816function wp_auto_update_plugin( $update, $item ) {
     817        $wp_autoupdated_plugins = get_option( 'wp_autoupdated_plugins', array() );
     818        if ( in_array( $item->plugin, $wp_autoupdated_plugins, true ) ) {
     819                return true;
     820        } else {
     821                return $update;
     822        }
     823}
     824
    816825add_action( 'admin_init', '_maybe_update_core' );
    817826add_action( 'wp_version_check', 'wp_version_check' );
    818827
    add_action( 'wp_update_themes', 'wp_update_themes' ); 
    831840add_action( 'update_option_WPLANG', 'wp_clean_update_cache', 10, 0 );
    832841
    833842add_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' );
     843add_filter( 'auto_update_plugin', 'wp_auto_update_plugin', 10, 2 );
    834844
    835845add_action( 'init', 'wp_schedule_update_checks' );