WordPress.org

Make WordPress Core

Ticket #50448: 50448.2.diff

File 50448.2.diff, 7.7 KB (added by desrosj, 10 months ago)
  • src/wp-admin/includes/class-plugin-upgrader.php

     
    205205                // Force refresh of plugin update information.
    206206                wp_clean_plugins_cache( $parsed_args['clear_update_cache'] );
    207207
     208                // Ensure any new auto-update failures trigger a failure email when plugins update successfully.
     209                $past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() );
     210
     211                if ( isset( $past_failure_emails[ $plugin ] ) ) {
     212                        unset( $past_failure_emails[ $plugin ] );
     213                        update_option( 'auto_plugin_theme_update_emails', $past_failure_emails );
     214                }
     215
    208216                return true;
    209217        }
    210218
     
    329337                // Cleanup our hooks, in case something else does a upgrade on this connection.
    330338                remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ) );
    331339
     340                // Ensure any new auto-update failures trigger a failure email when plugins update successfully.
     341                $past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() );
     342
     343                foreach ( $results as $plugin => $result ) {
     344                        // Maintain last failure notification when plugins failed to update manually.
     345                        if ( ! isset( $past_failure_emails[ $plugin ] ) || ! $result || is_wp_error( $result ) ) {
     346                                continue;
     347                        }
     348
     349                        unset( $past_failure_emails[ $plugin ] );
     350                }
     351                update_option( 'auto_plugin_theme_update_emails', $past_failure_emails );
     352
    332353                return $results;
    333354        }
    334355
  • src/wp-admin/includes/class-theme-upgrader.php

     
    313313
    314314                wp_clean_themes_cache( $parsed_args['clear_update_cache'] );
    315315
     316                // Ensure any new auto-update failures trigger a failure email when themes update successfully.
     317                $past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() );
     318
     319                if ( isset( $past_failure_emails[ $theme ] ) ) {
     320                        unset( $past_failure_emails[ $theme ] );
     321                        update_option( 'auto_plugin_theme_update_emails', $past_failure_emails );
     322                }
     323
    316324                return true;
    317325        }
    318326
     
    441449                remove_filter( 'upgrader_post_install', array( $this, 'current_after' ) );
    442450                remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_theme' ) );
    443451
     452                // Ensure any new auto-update failures trigger a failure email when themes update successfully.
     453                $past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() );
     454
     455                foreach ( $results as $theme => $result ) {
     456                        // Maintain last failure notification when themes failed to update manually.
     457                        if ( ! isset( $past_failure_emails[ $theme ] ) || ! $result || is_wp_error( $result ) ) {
     458                                continue;
     459                        }
     460
     461                        unset( $past_failure_emails[ $theme ] );
     462                }
     463                update_option( 'auto_plugin_theme_update_emails', $past_failure_emails );
     464
    444465                return $results;
    445466        }
    446467
  • src/wp-admin/includes/class-wp-automatic-updater.php

     
    941941                        return;
    942942                }
    943943
     944                $unique_failures = false;
     945                $failure_emails  = get_option( 'auto_plugin_theme_update_emails', array() );
     946
     947                // When only failures have occurred, an email should only be sent if there are either new failures,
     948                // or failures that have not sent out an email recently.
     949                if ( 'fail' === $type ) {
     950                        $unique_failures = false;
     951
     952                        /**
     953                         * Filters the time interval between failure emails for a plugin.
     954                         *
     955                         * This prevents a site owner from receiving an email notice every time
     956                         * the auto-update routine runs (every 12 hours by default).
     957                         *
     958                         * @param int $time Time interval in seconds between failure notifications.
     959                         *                  Default is 259,200 (3 days).
     960                         */
     961                        $failure_email_interval = apply_filters( 'auto_plugin_theme_update_email_fail_interval', DAY_IN_SECONDS * 3 );
     962
     963                        foreach ( $failed_updates as $update_type => $failures ) {
     964                                foreach ( $failures as $failed_update ) {
     965                                        if ( ! isset( $failure_emails[ $failed_update->item->{$update_type} ] ) ) {
     966                                                $unique_failures = true;
     967                                                continue;
     968                                        }
     969
     970                                        // Enough time has passed to make this failure warrant an email.
     971                                        if ( time() - $failure_emails[ $failed_update->item->{$update_type} ] > $failure_email_interval ) {
     972                                                $unique_failures = true;
     973                                        }
     974                                }
     975                        }
     976
     977                        if ( ! $unique_failures ) {
     978                                return;
     979                        }
     980                }
     981
    944982                $body               = array();
    945983                $successful_plugins = ( ! empty( $successful_updates['plugin'] ) );
    946984                $successful_themes  = ( ! empty( $successful_updates['theme'] ) );
     
    10171055                                $body[] = __( 'These plugins failed to update:' );
    10181056
    10191057                                foreach ( $failed_updates['plugin'] as $item ) {
    1020                                         $body[] = "- {$item->name}";
     1058                                        $body[]                                = "- {$item->name}";
     1059                                        $failure_emails[ $item->item->plugin ] = time();
    10211060                                }
    10221061                                $body[] = "\n";
    10231062                        }
     
    10271066                                $body[] = __( 'These themes failed to update:' );
    10281067
    10291068                                foreach ( $failed_updates['theme'] as $item ) {
    1030                                         $body[] = "- {$item->name}";
     1069                                        $body[]                               = "- {$item->name}";
     1070                                        $failure_emails[ $item->item->theme ] = time();
    10311071                                }
    10321072                                $body[] = "\n";
    10331073                        }
     
    10431083
    10441084                                foreach ( $successful_updates['plugin'] as $item ) {
    10451085                                        $body[] = "- {$item->name}";
     1086                                        unset( $failure_emails[ $item->item->plugin ] );
    10461087                                }
    10471088                                $body[] = "\n";
    10481089                        }
     
    10531094                                // List successful updates.
    10541095                                foreach ( $successful_updates['theme'] as $item ) {
    10551096                                        $body[] = "- {$item->name}";
     1097                                        unset( $failure_emails[ $item->item->theme ] );
    10561098                                }
    10571099                                $body[] = "\n";
    10581100                        }
     
    11081150                 */
    11091151                $email = apply_filters( 'auto_plugin_theme_update_email', $email, $type, $successful_updates, $failed_updates );
    11101152
    1111                 wp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] );
     1153                $result = wp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] );
     1154
     1155                if ( $result ) {
     1156                        update_option( 'auto_plugin_theme_update_emails', $failure_emails );
     1157                }
    11121158        }
    11131159
    11141160        /**
  • src/wp-admin/includes/schema.php

     
    534534                // 5.5.0
    535535                'blocklist_keys'                  => '',
    536536                'comment_previously_approved'     => 1,
     537                'auto_plugin_theme_update_emails' => array(),
    537538        );
    538539
    539540        // 3.3.0
     
    552553        $options = wp_parse_args( $options, $defaults );
    553554
    554555        // Set autoload to no for these options.
    555         $fat_options = array( 'moderation_keys', 'recently_edited', 'blocklist_keys', 'uninstall_plugins' );
     556        $fat_options = array(
     557                'moderation_keys',
     558                'recently_edited',
     559                'blocklist_keys',
     560                'uninstall_plugins',
     561                'auto_plugin_theme_update_emails',
     562        );
    556563
    557564        $keys             = "'" . implode( "', '", array_keys( $options ) ) . "'";
    558565        $existing_options = $wpdb->get_col( "SELECT option_name FROM $wpdb->options WHERE option_name in ( $keys )" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
  • src/wp-includes/version.php

     
    2020 *
    2121 * @global int $wp_db_version
    2222 */
    23 $wp_db_version = 48121;
     23$wp_db_version = 48337;
    2424
    2525/**
    2626 * Holds the TinyMCE version.