Make WordPress Core


Ignore:
Timestamp:
02/17/2026 09:24:56 AM (6 weeks ago)
Author:
audrasjb
Message:

Networks and Sites: Don't automatically mark website as spam when an account is marked as spam.

This changeset does the following:

  • Explicitly add 403 to wp_die() calls for unauthorized actions
  • Introduce the network_user_spam_propagate_to_blogs filter to provide flexibility for developers to control spam status propagation
  • Use is_super_admin() checks for both "spam" and "notspam" actions to prevent unauthorized modification of network administrators
  • Refine the "notspam" logic to ensure that blog status updates are correctly scoped to the current network
  • Add related unit tests coverage

Props ignatiusjeroe, realloc, johnjamesjacoby, westonruter, mukesh27, pratiknawkar94, anukasha.
Fixes #61146.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/network/users.php

    r59784 r61660  
    8787                                            __( 'Warning! User cannot be modified. The user %s is a network administrator.' ),
    8888                                            esc_html( $user->user_login )
    89                                         )
     89                                        ),
     90                                        403
    9091                                    );
    9192                                }
    9293
    9394                                $userfunction = 'all_spam';
    94                                 $blogs        = get_blogs_of_user( $user_id, true );
    95 
    96                                 foreach ( (array) $blogs as $details ) {
    97                                     if ( ! is_main_site( $details->userblog_id ) ) { // Main site is not a spam!
    98                                         update_blog_status( $details->userblog_id, 'spam', '1' );
     95
     96                                /**
     97                                 * Filters whether to propagate the blog status when a user is marked as spam.
     98                                 *
     99                                 * @since 7.0.0
     100                                 *
     101                                 * @param bool $propagate Whether to propagate the blog status. Default false.
     102                                 * @param int  $user_id   User ID.
     103                                 */
     104                                if ( apply_filters( 'propagate_network_user_spam_to_blogs', false, $user_id ) ) {
     105                                    foreach ( get_blogs_of_user( $user_id, true ) as $details ) {
     106                                        // Assuming the main site is not a spam.
     107                                        if ( ! is_main_site( $details->userblog_id ) ) {
     108                                            update_blog_status( $details->userblog_id, 'spam', '1' );
     109                                        }
    99110                                    }
    100111                                }
     
    109120                                $user = get_userdata( $user_id );
    110121
     122                                if ( is_super_admin( $user->ID ) ) {
     123                                    wp_die(
     124                                        sprintf(
     125                                            /* translators: %s: User login. */
     126                                            __( 'Warning! User cannot be modified. The user %s is a network administrator.' ),
     127                                            esc_html( $user->user_login )
     128                                        ),
     129                                        403
     130                                    );
     131                                }
     132
    111133                                $userfunction = 'all_notspam';
    112134                                $blogs        = get_blogs_of_user( $user_id, true );
    113135
    114                                 foreach ( (array) $blogs as $details ) {
    115                                     update_blog_status( $details->userblog_id, 'spam', '0' );
     136                                /** This filter is documented in wp-admin/network/users.php */
     137                                if ( apply_filters( 'propagate_network_user_spam_to_blogs', false, $user_id ) ) {
     138                                    foreach ( get_blogs_of_user( $user_id, true ) as $details ) {
     139                                        if ( ! is_main_site( $details->userblog_id ) && get_current_network_id() === $details->site_id ) {
     140                                            // Assuming main site is never a spam and part of the current network.
     141                                            update_blog_status( $details->userblog_id, 'spam', '0' );
     142                                        }
     143                                    }
    116144                                }
    117145
Note: See TracChangeset for help on using the changeset viewer.