WordPress.org

Make WordPress Core

Ticket #50448: 50448.3.diff

File 50448.3.diff, 7.3 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 future 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 future 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 ( ! $result || is_wp_error( $result ) || ! isset( $past_failure_emails[ $plugin ] ) ) {
     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 future 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 future 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 ( ! $result || is_wp_error( $result ) || ! isset( $past_failure_emails[ $theme ] ) ) {
     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 unique failures.
     948                // A failure is considered unique if an email has not been sent for an update attempt failure
     949                // to a plugin or theme with the same new_version.
     950                if ( 'fail' === $type ) {
     951                        foreach ( $failed_updates as $update_type => $failures ) {
     952                                foreach ( $failures as $failed_update ) {
     953                                        if ( ! isset( $failure_emails[ $failed_update->item->{$update_type} ] ) ) {
     954                                                $unique_failures = true;
     955                                                continue;
     956                                        }
     957
     958                                        // Check that the failure represents a new failure based on the new_version.
     959                                        if ( version_compare( $failure_emails[ $failed_update->item->{$update_type} ], $failed_update->item->new_version, '<' ) ) {
     960                                                $unique_failures = true;
     961                                        }
     962                                }
     963                        }
     964
     965                        if ( ! $unique_failures ) {
     966                                return;
     967                        }
     968                }
     969
    944970                $body               = array();
    945971                $successful_plugins = ( ! empty( $successful_updates['plugin'] ) );
    946972                $successful_themes  = ( ! empty( $successful_updates['theme'] ) );
     
    10171043                                $body[] = __( 'These plugins failed to update:' );
    10181044
    10191045                                foreach ( $failed_updates['plugin'] as $item ) {
    1020                                         $body[] = "- {$item->name}";
     1046                                        $body[]                                = "- {$item->name}";
     1047                                        $failure_emails[ $item->item->plugin ] = $item->item->new_version;
    10211048                                }
    10221049                                $body[] = "\n";
    10231050                        }
     
    10271054                                $body[] = __( 'These themes failed to update:' );
    10281055
    10291056                                foreach ( $failed_updates['theme'] as $item ) {
    1030                                         $body[] = "- {$item->name}";
     1057                                        $body[]                               = "- {$item->name}";
     1058                                        $failure_emails[ $item->item->theme ] = $item->item->new_version;
    10311059                                }
    10321060                                $body[] = "\n";
    10331061                        }
     
    10431071
    10441072                                foreach ( $successful_updates['plugin'] as $item ) {
    10451073                                        $body[] = "- {$item->name}";
     1074                                        unset( $failure_emails[ $item->item->plugin ] );
    10461075                                }
    10471076                                $body[] = "\n";
    10481077                        }
     
    10531082                                // List successful updates.
    10541083                                foreach ( $successful_updates['theme'] as $item ) {
    10551084                                        $body[] = "- {$item->name}";
     1085                                        unset( $failure_emails[ $item->item->theme ] );
    10561086                                }
    10571087                                $body[] = "\n";
    10581088                        }
     
    11081138                 */
    11091139                $email = apply_filters( 'auto_plugin_theme_update_email', $email, $type, $successful_updates, $failed_updates );
    11101140
    1111                 wp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] );
     1141                $result = wp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] );
     1142
     1143                if ( $result ) {
     1144                        update_option( 'auto_plugin_theme_update_emails', $failure_emails );
     1145                }
    11121146        }
    11131147
    11141148        /**
  • 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.