Make WordPress Core

Changeset 43654


Ignore:
Timestamp:
09/24/2018 03:08:32 PM (6 years ago)
Author:
flixos90
Message:

Multisite: Introduce a site initialization and uninitialization API.

This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function wp_initialize_site(), which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling wp_insert_site(). Similarly, a new function wp_uninitialize_site(), which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling wp_delete_site().

A new function wp_is_site_initialized() completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a pre_wp_is_site_initialized filter to alter that default behavior.

The separate handling of the site's row in the wp_blogs database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.

With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions wpmu_create_blog() and wpmu_delete_blog() now call the new respective function internally. Further follow-up work to this includes replacing calls to wpmu_create_blog() with wp_insert_site(), update_blog_details() with wp_update_site() and wpmu_delete_blog() with wp_delete_blog() throughout the codebase.

As a side-effect of this work, the wpmu_new_blog, delete_blog, and deleted_blog actions and the install_blog() function have been deprecated.

Fixes #41333. See #40364.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/ms.php

    r43571 r43654  
    7474
    7575    $blog = get_site( $blog_id );
    76     /**
    77      * Fires before a site is deleted.
    78      *
    79      * @since MU (3.0.0)
    80      *
    81      * @param int  $blog_id The site ID.
    82      * @param bool $drop    True if site's table should be dropped. Default is false.
    83      */
    84     do_action( 'delete_blog', $blog_id, $drop );
    85 
    86     $users = get_users(
    87         array(
    88             'blog_id' => $blog_id,
    89             'fields'  => 'ids',
    90         )
    91     );
    92 
    93     // Remove users from this blog.
    94     if ( ! empty( $users ) ) {
    95         foreach ( $users as $user_id ) {
    96             remove_user_from_blog( $user_id, $blog_id );
    97         }
    98     }
    99 
    100     update_blog_status( $blog_id, 'deleted', 1 );
    10176
    10277    $current_network = get_network();
     
    12095
    12196    if ( $drop ) {
    122         $uploads = wp_get_upload_dir();
    123 
    124         $tables = $wpdb->tables( 'blog' );
    125         /**
    126          * Filters the tables to drop when the site is deleted.
    127          *
    128          * @since MU (3.0.0)
    129          *
    130          * @param string[] $tables  Array of names of the site tables to be dropped.
    131          * @param int      $blog_id The ID of the site to drop tables for.
    132          */
    133         $drop_tables = apply_filters( 'wpmu_drop_tables', $tables, $blog_id );
    134 
    135         foreach ( (array) $drop_tables as $table ) {
    136             $wpdb->query( "DROP TABLE IF EXISTS `$table`" );
    137         }
    138 
    139         if ( is_site_meta_supported() ) {
    140             $blog_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->blogmeta WHERE blog_id = %d ", $blog_id ) );
    141             foreach ( $blog_meta_ids as $mid ) {
    142                 delete_metadata_by_mid( 'blog', $mid );
     97        wp_delete_site( $blog_id );
     98    } else {
     99        /** This action is documented in wp-includes/ms-blogs.php */
     100        do_action_deprecated( 'delete_blog', array( $blog_id, false ), '5.0.0' );
     101
     102        $users = get_users(
     103            array(
     104                'blog_id' => $blog_id,
     105                'fields'  => 'ids',
     106            )
     107        );
     108
     109        // Remove users from this blog.
     110        if ( ! empty( $users ) ) {
     111            foreach ( $users as $user_id ) {
     112                remove_user_from_blog( $user_id, $blog_id );
    143113            }
    144114        }
    145115
    146         wp_delete_site( $blog_id );
    147 
    148         /**
    149          * Filters the upload base directory to delete when the site is deleted.
    150          *
    151          * @since MU (3.0.0)
    152          *
    153          * @param string $uploads['basedir'] Uploads path without subdirectory. @see wp_upload_dir()
    154          * @param int    $blog_id            The site ID.
    155          */
    156         $dir     = apply_filters( 'wpmu_delete_blog_upload_dir', $uploads['basedir'], $blog_id );
    157         $dir     = rtrim( $dir, DIRECTORY_SEPARATOR );
    158         $top_dir = $dir;
    159         $stack   = array( $dir );
    160         $index   = 0;
    161 
    162         while ( $index < count( $stack ) ) {
    163             // Get indexed directory from stack
    164             $dir = $stack[ $index ];
    165 
    166             $dh = @opendir( $dir );
    167             if ( $dh ) {
    168                 while ( ( $file = @readdir( $dh ) ) !== false ) {
    169                     if ( $file == '.' || $file == '..' ) {
    170                         continue;
    171                     }
    172 
    173                     if ( @is_dir( $dir . DIRECTORY_SEPARATOR . $file ) ) {
    174                         $stack[] = $dir . DIRECTORY_SEPARATOR . $file;
    175                     } elseif ( @is_file( $dir . DIRECTORY_SEPARATOR . $file ) ) {
    176                         @unlink( $dir . DIRECTORY_SEPARATOR . $file );
    177                     }
    178                 }
    179                 @closedir( $dh );
    180             }
    181             $index++;
    182         }
    183 
    184         $stack = array_reverse( $stack ); // Last added dirs are deepest
    185         foreach ( (array) $stack as $dir ) {
    186             if ( $dir != $top_dir ) {
    187                 @rmdir( $dir );
    188             }
    189         }
    190 
    191         clean_blog_cache( $blog );
    192     }
    193 
    194     /**
    195      * Fires after the site is deleted from the network.
    196      *
    197      * @since 4.8.0
    198      *
    199      * @param int  $blog_id The site ID.
    200      * @param bool $drop    True if site's tables should be dropped. Default is false.
    201      */
    202     do_action( 'deleted_blog', $blog_id, $drop );
     116        update_blog_status( $blog_id, 'deleted', 1 );
     117
     118        /** This action is documented in wp-includes/ms-blogs.php */
     119        do_action_deprecated( 'deleted_blog', array( $blog_id, false ), '5.0.0' );
     120    }
    203121
    204122    if ( $switch ) {
  • trunk/src/wp-includes/ms-blogs.php

    r43571 r43654  
    443443    );
    444444
     445    // Extract the passed arguments that may be relevant for site initialization.
     446    $args = array_diff_key( $data, $defaults );
     447    if ( isset( $args['site_id'] ) ) {
     448        unset( $args['site_id'] );
     449    }
     450
    445451    $data = wp_prepare_site_data( $data, $defaults );
    446452    if ( is_wp_error( $data ) ) {
     
    464470     */
    465471    do_action( 'wp_insert_site', $new_site );
     472
     473    /**
     474     * Fires when a site's initialization routine should be executed.
     475     *
     476     * @since 5.0.0
     477     *
     478     * @param WP_Site $new_site New site object.
     479     * @param array   $args     Arguments for the initialization.
     480     */
     481    do_action( 'wp_initialize_site', $new_site, $args );
     482
     483    // Only compute extra hook parameters if the deprecated hook is actually in use.
     484    if ( has_action( 'wpmu_new_blog' ) ) {
     485        $user_id = ! empty( $args['user_id'] ) ? $args['user_id'] : 0;
     486        $meta    = ! empty( $args['options'] ) ? $args['options'] : array();
     487
     488        /**
     489         * Fires immediately after a new site is created.
     490         *
     491         * @since MU (3.0.0)
     492         * @deprecated 5.0.0 Use wp_insert_site
     493         *
     494         * @param int    $site_id    Site ID.
     495         * @param int    $user_id    User ID.
     496         * @param string $domain     Site domain.
     497         * @param string $path       Site path.
     498         * @param int    $network_id Network ID. Only relevant on multi-network installations.
     499         * @param array  $meta       Meta data. Used to set initial site options.
     500         */
     501        do_action_deprecated( 'wpmu_new_blog', array( $new_site->id, $user_id, $new_site->domain, $new_site->path, $new_site->network_id, $meta ), '5.0.0', 'wp_insert_site' );
     502    }
    466503
    467504    return (int) $new_site->id;
     
    544581    }
    545582
     583    $errors = new WP_Error();
     584
     585    /**
     586     * Fires before a site should be deleted from the database.
     587     *
     588     * Plugins should amend the `$errors` object via its `WP_Error::add()` method. If any errors
     589     * are present, the site will not be deleted.
     590     *
     591     * @since 5.0.0
     592     *
     593     * @param WP_Error $errors   Error object to add validation errors to.
     594     * @param WP_Site  $old_site The site object to be deleted.
     595     */
     596    do_action( 'wp_validate_site_deletion', $errors, $old_site );
     597
     598    if ( ! empty( $errors->errors ) ) {
     599        return $errors;
     600    }
     601
     602    /**
     603     * Fires before a site is deleted.
     604     *
     605     * @since MU (3.0.0)
     606     * @deprecated 5.0.0
     607     *
     608     * @param int  $site_id The site ID.
     609     * @param bool $drop    True if site's table should be dropped. Default is false.
     610     */
     611    do_action_deprecated( 'delete_blog', array( $old_site->id, true ), '5.0.0' );
     612
     613    /**
     614     * Fires when a site's uninitialization routine should be executed.
     615     *
     616     * @since 5.0.0
     617     *
     618     * @param WP_Site $old_site Deleted site object.
     619     */
     620    do_action( 'wp_uninitialize_site', $old_site );
     621
     622    if ( is_site_meta_supported() ) {
     623        $blog_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->blogmeta WHERE blog_id = %d ", $old_site->id ) );
     624        foreach ( $blog_meta_ids as $mid ) {
     625            delete_metadata_by_mid( 'blog', $mid );
     626        }
     627    }
     628
    546629    if ( false === $wpdb->delete( $wpdb->blogs, array( 'blog_id' => $old_site->id ) ) ) {
    547630        return new WP_Error( 'db_delete_error', __( 'Could not delete site from the database.' ), $wpdb->last_error );
     
    558641     */
    559642    do_action( 'wp_delete_site', $old_site );
     643
     644    /**
     645     * Fires after the site is deleted from the network.
     646     *
     647     * @since 4.8.0
     648     * @deprecated 5.0.0
     649     *
     650     * @param int  $site_id The site ID.
     651     * @param bool $drop    True if site's tables should be dropped. Default is false.
     652     */
     653    do_action_deprecated( 'deleted_blog', array( $old_site->id, true ), '5.0.0' );
    560654
    561655    return $old_site;
     
    620714    $non_cached_ids = _get_non_cached_ids( $ids, 'sites' );
    621715    if ( ! empty( $non_cached_ids ) ) {
    622         $fresh_sites = $wpdb->get_results( sprintf( "SELECT * FROM $wpdb->blogs WHERE blog_id IN (%s)", join( ',', array_map( 'intval', $non_cached_ids ) ) ) );
     716        $fresh_sites = $wpdb->get_results( sprintf( "SELECT * FROM $wpdb->blogs WHERE blog_id IN (%s)", join( ',', array_map( 'intval', $non_cached_ids ) ) ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
    623717
    624718        update_site_cache( $fresh_sites, $update_meta_cache );
     
    9141008
    9151009/**
     1010 * Runs the initialization routine for a given site.
     1011 *
     1012 * This process includes creating the site's database tables and
     1013 * populating them with defaults.
     1014 *
     1015 * @since 5.0.0
     1016 *
     1017 * @global wpdb     $wpdb     WordPress database abstraction object.
     1018 * @global WP_Roles $wp_roles WordPress role management object.
     1019 *
     1020 * @param int|WP_Site $site_id Site ID or object.
     1021 * @param array       $args    {
     1022 *     Optional. Arguments to modify the initialization behavior.
     1023 *
     1024 *     @type int    $user_id Required. User ID for the site administrator.
     1025 *     @type string $title   Site title. Default is 'Site %d' where %d is the
     1026 *                           site ID.
     1027 *     @type array  $options Custom option $key => $value pairs to use. Default
     1028 *                           empty array.
     1029 *     @type array  $meta    Custom site metadata $key => $value pairs to use.
     1030 *                           Default empty array.
     1031 * }
     1032 * @return bool|WP_Error True on success, or error object on failure.
     1033 */
     1034function wp_initialize_site( $site_id, array $args = array() ) {
     1035    global $wpdb, $wp_roles;
     1036
     1037    if ( empty( $site_id ) ) {
     1038        return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) );
     1039    }
     1040
     1041    $site = get_site( $site_id );
     1042    if ( ! $site ) {
     1043        return new WP_Error( 'site_invalid_id', __( 'Site with the ID does not exist.' ) );
     1044    }
     1045
     1046    if ( wp_is_site_initialized( $site ) ) {
     1047        return new WP_Error( 'site_already_initialized', __( 'The site appears to be already initialized.' ) );
     1048    }
     1049
     1050    $network = get_network( $site->network_id );
     1051    if ( ! $network ) {
     1052        $network = get_network();
     1053    }
     1054
     1055    $args = wp_parse_args(
     1056        $args,
     1057        array(
     1058            'user_id' => 0,
     1059            /* translators: %d: site ID */
     1060            'title'   => sprintf( __( 'Site %d' ), $site->id ),
     1061            'options' => array(),
     1062            'meta'    => array(),
     1063        )
     1064    );
     1065
     1066    /**
     1067     * Filters the arguments for initializing a site.
     1068     *
     1069     * @since 5.0.0
     1070     *
     1071     * @param array      $args    Arguments to modify the initialization behavior.
     1072     * @param WP_Site    $site    Site that is being initialized.
     1073     * @param WP_Network $network Network that the site belongs to.
     1074     */
     1075    $args = apply_filters( 'wp_initialize_site_args', $args, $site, $network );
     1076
     1077    $orig_installing = wp_installing();
     1078    if ( ! $orig_installing ) {
     1079        wp_installing( true );
     1080    }
     1081
     1082    $switch = false;
     1083    if ( get_current_blog_id() !== $site->id ) {
     1084        $switch = true;
     1085        switch_to_blog( $site->id );
     1086    }
     1087
     1088    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
     1089
     1090    // Set up the database tables.
     1091    make_db_current_silent( 'blog' );
     1092
     1093    $home_scheme    = 'http';
     1094    $siteurl_scheme = 'http';
     1095    if ( ! is_subdomain_install() ) {
     1096        if ( 'https' === parse_url( get_home_url( $network->site_id ), PHP_URL_SCHEME ) ) {
     1097            $home_scheme = 'https';
     1098        }
     1099        if ( 'https' === parse_url( get_network_option( $network->id, 'siteurl' ), PHP_URL_SCHEME ) ) {
     1100            $siteurl_scheme = 'https';
     1101        }
     1102    }
     1103
     1104    // Populate the site's options.
     1105    populate_options(
     1106        array_merge(
     1107            array(
     1108                'home'        => untrailingslashit( $home_scheme . '://' . $site->domain . $site->path ),
     1109                'siteurl'     => untrailingslashit( $siteurl_scheme . '://' . $site->domain . $site->path ),
     1110                'blogname'    => wp_unslash( $args['title'] ),
     1111                'admin_email' => '',
     1112                'upload_path' => get_network_option( $network->id, 'ms_files_rewriting' ) ? UPLOADBLOGSDIR . "/{$site->id}/files" : get_blog_option( $network->site_id, 'upload_path' ),
     1113                'blog_public' => (int) $site->public,
     1114                'WPLANG'      => get_network_option( $network->id, 'WPLANG' ),
     1115            ),
     1116            $args['options']
     1117        )
     1118    );
     1119
     1120    // Populate the site's roles.
     1121    populate_roles();
     1122    $wp_roles = new WP_Roles();
     1123
     1124    // Populate metadata for the site.
     1125    populate_site_meta( $site->id, $args['meta'] );
     1126
     1127    // Remove all permissions that may exist for the site.
     1128    $table_prefix = $wpdb->get_blog_prefix();
     1129    delete_metadata( 'user', 0, $table_prefix . 'user_level', null, true ); // delete all
     1130    delete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // delete all
     1131
     1132    // Install default site content.
     1133    wp_install_defaults( $args['user_id'] );
     1134
     1135    // Set the site administrator.
     1136    add_user_to_blog( $site->id, $args['user_id'], 'administrator' );
     1137    if ( ! user_can( $args['user_id'], 'manage_network' ) && ! get_user_meta( $args['user_id'], 'primary_blog', true ) ) {
     1138        update_user_meta( $args['user_id'], 'primary_blog', $site->id );
     1139    }
     1140
     1141    if ( $switch ) {
     1142        restore_current_blog();
     1143    }
     1144
     1145    wp_installing( $orig_installing );
     1146
     1147    return true;
     1148}
     1149
     1150/**
     1151 * Runs the uninitialization routine for a given site.
     1152 *
     1153 * This process includes dropping the site's database tables and deleting its uploads directory.
     1154 *
     1155 * @since 5.0.0
     1156 *
     1157 * @global wpdb $wpdb WordPress database abstraction object.
     1158 *
     1159 * @param int|WP_Site $site_id Site ID or object.
     1160 * @return bool|WP_Error True on success, or error object on failure.
     1161 */
     1162function wp_uninitialize_site( $site_id ) {
     1163    global $wpdb;
     1164
     1165    if ( empty( $site_id ) ) {
     1166        return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) );
     1167    }
     1168
     1169    $site = get_site( $site_id );
     1170    if ( ! $site ) {
     1171        return new WP_Error( 'site_invalid_id', __( 'Site with the ID does not exist.' ) );
     1172    }
     1173
     1174    if ( ! wp_is_site_initialized( $site ) ) {
     1175        return new WP_Error( 'site_already_uninitialized', __( 'The site appears to be already uninitialized.' ) );
     1176    }
     1177
     1178    $users = get_users( array(
     1179        'blog_id' => $site->id,
     1180        'fields'  => 'ids',
     1181    ) );
     1182
     1183    // Remove users from the site.
     1184    if ( ! empty( $users ) ) {
     1185        foreach ( $users as $user_id ) {
     1186            remove_user_from_blog( $user_id, $site->id );
     1187        }
     1188    }
     1189
     1190    $switch = false;
     1191    if ( get_current_blog_id() !== $site->id ) {
     1192        $switch = true;
     1193        switch_to_blog( $site->id );
     1194    }
     1195
     1196    $uploads = wp_get_upload_dir();
     1197
     1198    $tables = $wpdb->tables( 'blog' );
     1199
     1200    /**
     1201     * Filters the tables to drop when the site is deleted.
     1202     *
     1203     * @since MU (3.0.0)
     1204     *
     1205     * @param string[] $tables  Array of names of the site tables to be dropped.
     1206     * @param int      $site_id The ID of the site to drop tables for.
     1207     */
     1208    $drop_tables = apply_filters( 'wpmu_drop_tables', $tables, $site->id );
     1209
     1210    foreach ( (array) $drop_tables as $table ) {
     1211        $wpdb->query( "DROP TABLE IF EXISTS `$table`" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
     1212    }
     1213
     1214    /**
     1215     * Filters the upload base directory to delete when the site is deleted.
     1216     *
     1217     * @since MU (3.0.0)
     1218     *
     1219     * @param string $uploads['basedir'] Uploads path without subdirectory. @see wp_upload_dir()
     1220     * @param int    $site_id            The site ID.
     1221     */
     1222    $dir     = apply_filters( 'wpmu_delete_blog_upload_dir', $uploads['basedir'], $site->id );
     1223    $dir     = rtrim( $dir, DIRECTORY_SEPARATOR );
     1224    $top_dir = $dir;
     1225    $stack   = array( $dir );
     1226    $index   = 0;
     1227
     1228    while ( $index < count( $stack ) ) {
     1229        // Get indexed directory from stack
     1230        $dir = $stack[ $index ];
     1231
     1232        // phpcs:disable Generic.PHP.NoSilencedErrors.Discouraged
     1233        $dh = @opendir( $dir );
     1234        if ( $dh ) {
     1235            $file = @readdir( $dh );
     1236            while ( false !== $file ) {
     1237                if ( '.' === $file || '..' === $file ) {
     1238                    $file = @readdir( $dh );
     1239                    continue;
     1240                }
     1241
     1242                if ( @is_dir( $dir . DIRECTORY_SEPARATOR . $file ) ) {
     1243                    $stack[] = $dir . DIRECTORY_SEPARATOR . $file;
     1244                } elseif ( @is_file( $dir . DIRECTORY_SEPARATOR . $file ) ) {
     1245                    @unlink( $dir . DIRECTORY_SEPARATOR . $file );
     1246                }
     1247
     1248                $file = @readdir( $dh );
     1249            }
     1250            @closedir( $dh );
     1251        }
     1252        $index++;
     1253    }
     1254
     1255    $stack = array_reverse( $stack ); // Last added dirs are deepest
     1256    foreach ( (array) $stack as $dir ) {
     1257        if ( $dir != $top_dir ) {
     1258            @rmdir( $dir );
     1259        }
     1260    }
     1261
     1262    // phpcs:enable Generic.PHP.NoSilencedErrors.Discouraged
     1263    if ( $switch ) {
     1264        restore_current_blog();
     1265    }
     1266
     1267    return true;
     1268}
     1269
     1270/**
     1271 * Checks whether a site is initialized.
     1272 *
     1273 * A site is considered initialized when its database tables are present.
     1274 *
     1275 * @since 5.0.0
     1276 *
     1277 * @global wpdb $wpdb WordPress database abstraction object.
     1278 *
     1279 * @param int|WP_Site $site_id Site ID or object.
     1280 * @return bool True if the site is initialized, false otherwise.
     1281 */
     1282function wp_is_site_initialized( $site_id ) {
     1283    global $wpdb;
     1284
     1285    if ( is_object( $site_id ) ) {
     1286        $site_id = $site_id->blog_id;
     1287    }
     1288    $site_id = (int) $site_id;
     1289
     1290    /**
     1291     * Filters the check for whether a site is initialized before the database is accessed.
     1292     *
     1293     * Returning a non-null value will effectively short-circuit the function, returning
     1294     * that value instead.
     1295     *
     1296     * @since 5.0.0
     1297     *
     1298     * @param bool|null $pre     The value to return, if not null.
     1299     * @param int       $site_id The site ID that is being checked.
     1300     */
     1301    $pre = apply_filters( 'pre_wp_is_site_initialized', null, $site_id );
     1302    if ( null !== $pre ) {
     1303        return (bool) $pre;
     1304    }
     1305
     1306    $switch = false;
     1307    if ( get_current_blog_id() !== $site_id ) {
     1308        $switch = true;
     1309        remove_action( 'switch_blog', 'wp_switch_roles_and_user', 1 );
     1310        switch_to_blog( $site_id );
     1311    }
     1312
     1313    $suppress = $wpdb->suppress_errors();
     1314    $result   = (bool) $wpdb->get_results( "DESCRIBE {$wpdb->posts}" );
     1315    $wpdb->suppress_errors( $suppress );
     1316
     1317    if ( $switch ) {
     1318        restore_current_blog();
     1319        add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 );
     1320    }
     1321
     1322    return $result;
     1323}
     1324
     1325/**
    9161326 * Retrieve option value for a given blog id based on name of option.
    9171327 *
     
    16222032    $non_cached_ids = _get_non_cached_ids( $network_ids, 'networks' );
    16232033    if ( ! empty( $non_cached_ids ) ) {
    1624         $fresh_networks = $wpdb->get_results( sprintf( "SELECT $wpdb->site.* FROM $wpdb->site WHERE id IN (%s)", join( ',', array_map( 'intval', $non_cached_ids ) ) ) );
     2034        $fresh_networks = $wpdb->get_results( sprintf( "SELECT $wpdb->site.* FROM $wpdb->site WHERE id IN (%s)", join( ',', array_map( 'intval', $non_cached_ids ) ) ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
    16252035
    16262036        update_network_cache( $fresh_networks );
     
    17582168
    17592169    if ( $new_site->spam != $old_site->spam ) {
    1760         if ( $new_site->spam == 1 ) {
     2170        if ( 1 == $new_site->spam ) {
    17612171
    17622172            /**
     
    17822192
    17832193    if ( $new_site->mature != $old_site->mature ) {
    1784         if ( $new_site->mature == 1 ) {
     2194        if ( 1 == $new_site->mature ) {
    17852195
    17862196            /**
     
    18062216
    18072217    if ( $new_site->archived != $old_site->archived ) {
    1808         if ( $new_site->archived == 1 ) {
     2218        if ( 1 == $new_site->archived ) {
    18092219
    18102220            /**
     
    18302240
    18312241    if ( $new_site->deleted != $old_site->deleted ) {
    1832         if ( $new_site->deleted == 1 ) {
     2242        if ( 1 == $new_site->deleted ) {
    18332243
    18342244            /**
     
    18902300 */
    18912301function wp_update_blog_public_option_on_site_update( $site_id, $public ) {
     2302
     2303    // Bail if the site's database tables do not exist (yet).
     2304    if ( ! wp_is_site_initialized( $site_id ) ) {
     2305        return;
     2306    }
     2307
    18922308    update_blog_option( $site_id, 'blog_public', $public );
    18932309}
  • trunk/src/wp-includes/ms-default-filters.php

    r43548 r43654  
    3838// Blogs
    3939add_filter( 'wpmu_validate_blog_signup', 'signup_nonce_check' );
    40 add_action( 'wpmu_new_blog', 'wpmu_log_new_registrations', 10, 2 );
    41 add_action( 'wpmu_new_blog', 'newblog_notify_siteadmin', 10, 2 );
    4240add_action( 'wpmu_activate_blog', 'wpmu_welcome_notification', 10, 5 );
    4341add_action( 'after_signup_site', 'wpmu_signup_blog_notification', 10, 7 );
     
    5048add_action( 'wp_update_site', 'wp_maybe_transition_site_statuses_on_update', 10, 2 );
    5149add_action( 'wp_update_site', 'wp_maybe_clean_new_site_cache_on_update', 10, 2 );
     50add_action( 'wp_initialize_site', 'wp_initialize_site', 10, 2 );
     51add_action( 'wp_initialize_site', 'wpmu_log_new_registrations', 100, 2 );
     52add_action( 'wp_initialize_site', 'newblog_notify_siteadmin', 100, 1 );
     53add_action( 'wp_uninitialize_site', 'wp_uninitialize_site', 10, 1 );
    5254add_action( 'update_blog_public', 'wp_update_blog_public_option_on_site_update', 1, 2 );
    5355
  • trunk/src/wp-includes/ms-deprecated.php

    r43548 r43654  
    581581    return $site_id;
    582582}
     583
     584/**
     585 * Install an empty blog.
     586 *
     587 * Creates the new blog tables and options. If calling this function
     588 * directly, be sure to use switch_to_blog() first, so that $wpdb
     589 * points to the new blog.
     590 *
     591 * @since MU (3.0.0)
     592 * @deprecated 5.0.0
     593 *
     594 * @global wpdb     $wpdb
     595 * @global WP_Roles $wp_roles
     596 *
     597 * @param int    $blog_id    The value returned by wp_insert_site().
     598 * @param string $blog_title The title of the new site.
     599 */
     600function install_blog( $blog_id, $blog_title = '' ) {
     601    global $wpdb, $wp_roles;
     602
     603    _deprecated_function( __FUNCTION__, '5.0.0' );
     604
     605    // Cast for security
     606    $blog_id = (int) $blog_id;
     607
     608    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
     609
     610    $suppress = $wpdb->suppress_errors();
     611    if ( $wpdb->get_results( "DESCRIBE {$wpdb->posts}" ) ) {
     612        die( '<h1>' . __( 'Already Installed' ) . '</h1><p>' . __( 'You appear to have already installed WordPress. To reinstall please clear your old database tables first.' ) . '</p></body></html>' );
     613    }
     614    $wpdb->suppress_errors( $suppress );
     615
     616    $url = get_blogaddress_by_id( $blog_id );
     617
     618    // Set everything up
     619    make_db_current_silent( 'blog' );
     620    populate_options();
     621    populate_roles();
     622
     623    // populate_roles() clears previous role definitions so we start over.
     624    $wp_roles = new WP_Roles();
     625
     626    $siteurl = $home = untrailingslashit( $url );
     627
     628    if ( ! is_subdomain_install() ) {
     629
     630        if ( 'https' === parse_url( get_site_option( 'siteurl' ), PHP_URL_SCHEME ) ) {
     631            $siteurl = set_url_scheme( $siteurl, 'https' );
     632        }
     633        if ( 'https' === parse_url( get_home_url( get_network()->site_id ), PHP_URL_SCHEME ) ) {
     634            $home = set_url_scheme( $home, 'https' );
     635        }
     636    }
     637
     638    update_option( 'siteurl', $siteurl );
     639    update_option( 'home', $home );
     640
     641    if ( get_site_option( 'ms_files_rewriting' ) ) {
     642        update_option( 'upload_path', UPLOADBLOGSDIR . "/$blog_id/files" );
     643    } else {
     644        update_option( 'upload_path', get_blog_option( get_network()->site_id, 'upload_path' ) );
     645    }
     646
     647    update_option( 'blogname', wp_unslash( $blog_title ) );
     648    update_option( 'admin_email', '' );
     649
     650    // remove all perms
     651    $table_prefix = $wpdb->get_blog_prefix();
     652    delete_metadata( 'user', 0, $table_prefix . 'user_level', null, true ); // delete all
     653    delete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // delete all
     654}
     655
     656/**
     657 * Set blog defaults.
     658 *
     659 * This function creates a row in the wp_blogs table.
     660 *
     661 * @since MU (3.0.0)
     662 * @deprecated MU
     663 * @deprecated Use wp_install_defaults()
     664 *
     665 * @global wpdb $wpdb WordPress database abstraction object.
     666 *
     667 * @param int $blog_id Ignored in this function.
     668 * @param int $user_id
     669 */
     670function install_blog_defaults( $blog_id, $user_id ) {
     671    global $wpdb;
     672
     673    _deprecated_function( __FUNCTION__, 'MU' );
     674
     675    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
     676
     677    $suppress = $wpdb->suppress_errors();
     678
     679    wp_install_defaults( $user_id );
     680
     681    $wpdb->suppress_errors( $suppress );
     682}
  • trunk/src/wp-includes/ms-functions.php

    r43571 r43654  
    12861286 * @param string $title      The new site's title.
    12871287 * @param int    $user_id    The user ID of the new site's admin.
    1288  * @param array  $meta       Optional. Array of key=>value pairs used to set initial site options.
     1288 * @param array  $options    Optional. Array of key=>value pairs used to set initial site options.
    12891289 *                           If valid status keys are included ('public', 'archived', 'mature',
    12901290 *                           'spam', 'deleted', or 'lang_id') the given site status(es) will be
     
    12941294 * @return int|WP_Error Returns WP_Error object on failure, the new site ID on success.
    12951295 */
    1296 function wpmu_create_blog( $domain, $path, $title, $user_id, $meta = array(), $network_id = 1 ) {
     1296function wpmu_create_blog( $domain, $path, $title, $user_id, $options = array(), $network_id = 1 ) {
    12971297    $defaults = array(
    12981298        'public' => 0,
    1299         'WPLANG' => get_network_option( $network_id, 'WPLANG' ),
    13001299    );
    1301     $meta     = wp_parse_args( $meta, $defaults );
     1300    $options  = wp_parse_args( $options, $defaults );
    13021301
    13031302    $title   = strip_tags( $title );
     
    13211320            'network_id' => $network_id,
    13221321        ),
    1323         array_intersect_key(
    1324             $meta,
    1325             array_flip( $site_data_whitelist )
    1326         )
     1322        array_intersect_key( $options, array_flip( $site_data_whitelist ) )
    13271323    );
    13281324
    1329     $meta = array_diff_key( $meta, array_flip( $site_data_whitelist ) );
    1330 
    1331     remove_action( 'update_blog_public', 'wp_update_blog_public_option_on_site_update', 1 );
    1332     $blog_id = wp_insert_site( $site_data );
    1333     add_action( 'update_blog_public', 'wp_update_blog_public_option_on_site_update', 1, 2 );
     1325    // Data to pass to wp_initialize_site().
     1326    $site_initialization_data = array(
     1327        'title'   => $title,
     1328        'user_id' => $user_id,
     1329        'options' => array_diff_key( $options, array_flip( $site_data_whitelist ) ),
     1330    );
     1331
     1332    $blog_id = wp_insert_site( array_merge( $site_data, $site_initialization_data ) );
    13341333
    13351334    if ( is_wp_error( $blog_id ) ) {
     
    13371336    }
    13381337
    1339     switch_to_blog( $blog_id );
    1340     install_blog( $blog_id, $title );
    1341     wp_install_defaults( $user_id );
    1342 
    1343     add_user_to_blog( $blog_id, $user_id, 'administrator' );
    1344 
    1345     foreach ( $meta as $key => $value ) {
    1346         update_option( $key, $value );
    1347     }
    1348 
    1349     update_option( 'blog_public', (int) $site_data['public'] );
    1350 
    1351     if ( ! is_super_admin( $user_id ) && ! get_user_meta( $user_id, 'primary_blog', true ) ) {
    1352         update_user_meta( $user_id, 'primary_blog', $blog_id );
    1353     }
    1354 
    1355     restore_current_blog();
    1356 
    1357     $site = get_site( $blog_id );
    1358 
    1359     /**
    1360      * Fires immediately after a new site is created.
    1361      *
    1362      * @since MU (3.0.0)
    1363      *
    1364      * @param int    $blog_id    Site ID.
    1365      * @param int    $user_id    User ID.
    1366      * @param string $domain     Site domain.
    1367      * @param string $path       Site path.
    1368      * @param int    $network_id Network ID. Only relevant on multi-network installations.
    1369      * @param array  $meta       Meta data. Used to set initial site options.
    1370      */
    1371     do_action( 'wpmu_new_blog', $blog_id, $user_id, $site->domain, $site->path, $site->network_id, $meta );
    1372 
    13731338    wp_cache_set( 'last_changed', microtime(), 'sites' );
    13741339
     
    13831348 *
    13841349 * @since MU (3.0.0)
    1385  *
    1386  * @param int    $blog_id    The new site's ID.
    1387  * @param string $deprecated Not used.
     1350 * @since 5.0.0 $blog_id now supports input from the {@see 'wp_initialize_site'} action.
     1351 *
     1352 * @param WP_Site|int $blog_id    The new site's object or ID.
     1353 * @param string      $deprecated Not used.
    13881354 * @return bool
    13891355 */
    13901356function newblog_notify_siteadmin( $blog_id, $deprecated = '' ) {
     1357    if ( is_object( $blog_id ) ) {
     1358        $blog_id = $blog_id->blog_id;
     1359    }
     1360
    13911361    if ( get_site_option( 'registrationnotification' ) != 'yes' ) {
    13921362        return false;
     
    15271497     */
    15281498    return apply_filters( 'domain_exists', $result, $domain, $path, $network_id );
    1529 }
    1530 
    1531 /**
    1532  * Install an empty blog.
    1533  *
    1534  * Creates the new blog tables and options. If calling this function
    1535  * directly, be sure to use switch_to_blog() first, so that $wpdb
    1536  * points to the new blog.
    1537  *
    1538  * @since MU (3.0.0)
    1539  *
    1540  * @global wpdb     $wpdb
    1541  * @global WP_Roles $wp_roles
    1542  *
    1543  * @param int    $blog_id    The value returned by wp_insert_site().
    1544  * @param string $blog_title The title of the new site.
    1545  */
    1546 function install_blog( $blog_id, $blog_title = '' ) {
    1547     global $wpdb, $wp_roles;
    1548 
    1549     // Cast for security
    1550     $blog_id = (int) $blog_id;
    1551 
    1552     require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    1553 
    1554     $suppress = $wpdb->suppress_errors();
    1555     if ( $wpdb->get_results( "DESCRIBE {$wpdb->posts}" ) ) {
    1556         die( '<h1>' . __( 'Already Installed' ) . '</h1><p>' . __( 'You appear to have already installed WordPress. To reinstall please clear your old database tables first.' ) . '</p></body></html>' );
    1557     }
    1558     $wpdb->suppress_errors( $suppress );
    1559 
    1560     $url = get_blogaddress_by_id( $blog_id );
    1561 
    1562     // Set everything up
    1563     make_db_current_silent( 'blog' );
    1564     populate_options();
    1565     populate_roles();
    1566 
    1567     // populate_roles() clears previous role definitions so we start over.
    1568     $wp_roles = new WP_Roles();
    1569 
    1570     $siteurl = $home = untrailingslashit( $url );
    1571 
    1572     if ( ! is_subdomain_install() ) {
    1573 
    1574         if ( 'https' === parse_url( get_site_option( 'siteurl' ), PHP_URL_SCHEME ) ) {
    1575             $siteurl = set_url_scheme( $siteurl, 'https' );
    1576         }
    1577         if ( 'https' === parse_url( get_home_url( get_network()->site_id ), PHP_URL_SCHEME ) ) {
    1578             $home = set_url_scheme( $home, 'https' );
    1579         }
    1580     }
    1581 
    1582     update_option( 'siteurl', $siteurl );
    1583     update_option( 'home', $home );
    1584 
    1585     if ( get_site_option( 'ms_files_rewriting' ) ) {
    1586         update_option( 'upload_path', UPLOADBLOGSDIR . "/$blog_id/files" );
    1587     } else {
    1588         update_option( 'upload_path', get_blog_option( get_network()->site_id, 'upload_path' ) );
    1589     }
    1590 
    1591     update_option( 'blogname', wp_unslash( $blog_title ) );
    1592     update_option( 'admin_email', '' );
    1593 
    1594     // remove all perms
    1595     $table_prefix = $wpdb->get_blog_prefix();
    1596     delete_metadata( 'user', 0, $table_prefix . 'user_level', null, true ); // delete all
    1597     delete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // delete all
    1598 }
    1599 
    1600 /**
    1601  * Set blog defaults.
    1602  *
    1603  * This function creates a row in the wp_blogs table.
    1604  *
    1605  * @since MU (3.0.0)
    1606  * @deprecated MU
    1607  * @deprecated Use wp_install_defaults()
    1608  *
    1609  * @global wpdb $wpdb WordPress database abstraction object.
    1610  *
    1611  * @param int $blog_id Ignored in this function.
    1612  * @param int $user_id
    1613  */
    1614 function install_blog_defaults( $blog_id, $user_id ) {
    1615     global $wpdb;
    1616 
    1617     require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    1618 
    1619     $suppress = $wpdb->suppress_errors();
    1620 
    1621     wp_install_defaults( $user_id );
    1622 
    1623     $wpdb->suppress_errors( $suppress );
    16241499}
    16251500
     
    20251900 *
    20261901 * @since MU (3.0.0)
     1902 * @since 5.0.0 Parameters now support input from the {@see 'wp_initialize_site'} action.
    20271903 *
    20281904 * @global wpdb $wpdb WordPress database abstraction object.
    20291905 *
    2030  * @param int $blog_id
    2031  * @param int $user_id
     1906 * @param WP_Site|int $blog_id The new site's object or ID.
     1907 * @param int|array   $user_id User ID, or array of arguments including 'user_id'.
    20321908 */
    20331909function wpmu_log_new_registrations( $blog_id, $user_id ) {
    20341910    global $wpdb;
     1911
     1912    if ( is_object( $blog_id ) ) {
     1913        $blog_id = $blog_id->blog_id;
     1914    }
     1915
     1916    if ( is_array( $user_id ) ) {
     1917        $user_id = ! empty( $user_id['user_id'] ) ? $user_id['user_id'] : 0;
     1918    }
     1919
    20351920    $user = get_userdata( (int) $user_id );
    20361921    if ( $user ) {
  • trunk/tests/phpunit/tests/multisite/site.php

    r43571 r43654  
    1010     */
    1111    class Tests_Multisite_Site extends WP_UnitTestCase {
    12         protected $suppress          = false;
    13         protected $site_status_hooks = array();
     12        protected $suppress                = false;
     13        protected $site_status_hooks       = array();
     14        protected $wp_initialize_site_args = array();
    1415        protected static $network_ids;
    1516        protected static $site_ids;
     17        protected static $uninitialized_site_id;
    1618
    1719        function setUp() {
     
    5759            }
    5860            unset( $id );
     61
     62            remove_action( 'wp_initialize_site', 'wp_initialize_site', 10 );
     63            self::$uninitialized_site_id = wp_insert_site( array(
     64                'domain'  => 'uninitialized.org',
     65                'path'    => '/',
     66                'site_id' => self::$network_ids['make.wordpress.org/'],
     67            ) );
     68            add_action( 'wp_initialize_site', 'wp_initialize_site', 10, 2 );
    5969        }
    6070
    6171        public static function wpTearDownAfterClass() {
    6272            global $wpdb;
     73
     74            remove_action( 'wp_uninitialize_site', 'wp_uninitialize_site', 10 );
     75            wp_delete_site( self::$uninitialized_site_id );
     76            add_action( 'wp_uninitialize_site', 'wp_uninitialize_site', 10, 1 );
    6377
    6478            foreach ( self::$site_ids as $id ) {
     
    12671281         */
    12681282        public function test_wp_insert_site( $site_data, $expected_data ) {
     1283            remove_action( 'wp_initialize_site', 'wp_initialize_site', 10 );
    12691284            $site_id = wp_insert_site( $site_data );
    12701285
     
    13611376         */
    13621377        public function test_wp_insert_site_empty_domain() {
     1378            remove_action( 'wp_initialize_site', 'wp_initialize_site', 10 );
    13631379            $site_id = wp_insert_site( array( 'public' => 0 ) );
    13641380
     
    14981514
    14991515        /**
     1516         * @ticket 41333
     1517         */
     1518        public function test_wp_delete_site_validate_site_deletion_action() {
     1519            add_action( 'wp_validate_site_deletion', array( $this, 'action_wp_validate_site_deletion_prevent_deletion' ) );
     1520            $result = wp_delete_site( self::$site_ids['make.wordpress.org/'] );
     1521            $this->assertWPError( $result );
     1522            $this->assertSame( 'action_does_not_like_deletion', $result->get_error_code() );
     1523        }
     1524
     1525        public function action_wp_validate_site_deletion_prevent_deletion( $errors ) {
     1526            $errors->add( 'action_does_not_like_deletion', 'You cannot delete this site because the action does not like it.' );
     1527        }
     1528
     1529        /**
    15001530         * @ticket 40364
    15011531         * @dataProvider data_wp_normalize_site_data
     
    17101740        public function test_site_dates_are_gmt() {
    17111741            $first_date = current_time( 'mysql', true );
    1712             $site_id    = wp_insert_site(
     1742
     1743            remove_action( 'wp_initialize_site', 'wp_initialize_site', 10 );
     1744            $site_id = wp_insert_site(
    17131745                array(
    17141746                    'domain'     => 'valid-domain.com',
     
    20162048            $this->site_status_hooks[ current_action() ] = $site_id;
    20172049        }
     2050
     2051        /**
     2052         * @ticket 41333
     2053         * @dataProvider data_wp_initialize_site
     2054         */
     2055        public function test_wp_initialize_site( $args, $expected_options, $expected_meta ) {
     2056            $result = wp_initialize_site( self::$uninitialized_site_id, $args );
     2057
     2058            switch_to_blog( self::$uninitialized_site_id );
     2059
     2060            $options = array();
     2061            foreach ( $expected_options as $option => $value ) {
     2062                $options[ $option ] = get_option( $option );
     2063            }
     2064
     2065            $meta = array();
     2066            foreach ( $expected_meta as $meta_key => $value ) {
     2067                $meta[ $meta_key ] = get_site_meta( self::$uninitialized_site_id, $meta_key, true );
     2068            }
     2069
     2070            restore_current_blog();
     2071
     2072            $initialized = wp_is_site_initialized( self::$uninitialized_site_id );
     2073
     2074            wp_uninitialize_site( self::$uninitialized_site_id );
     2075
     2076            $this->assertTrue( $result );
     2077            $this->assertTrue( $initialized );
     2078            $this->assertEquals( $expected_options, $options );
     2079            $this->assertEquals( $expected_meta, $meta );
     2080        }
     2081
     2082        public function data_wp_initialize_site() {
     2083            return array(
     2084                array(
     2085                    array(),
     2086                    array(
     2087                        'home'        => 'http://uninitialized.org',
     2088                        'siteurl'     => 'http://uninitialized.org',
     2089                        'admin_email' => '',
     2090                        'blog_public' => '1',
     2091                    ),
     2092                    array(),
     2093                ),
     2094                array(
     2095                    array(
     2096                        'options' => array(
     2097                            'home'    => 'https://uninitialized.org',
     2098                            'siteurl' => 'https://uninitialized.org',
     2099                            'key'     => 'value',
     2100                        ),
     2101                        'meta'    => array(
     2102                            'key1' => 'value1',
     2103                            'key2' => 'value2',
     2104                        ),
     2105                    ),
     2106                    array(
     2107                        'home'    => 'https://uninitialized.org',
     2108                        'siteurl' => 'https://uninitialized.org',
     2109                        'key'     => 'value',
     2110                    ),
     2111                    array(
     2112                        'key1' => 'value1',
     2113                        'key2' => 'value2',
     2114                        'key3' => '',
     2115                    ),
     2116                ),
     2117                array(
     2118                    array(
     2119                        'title'   => 'My New Site',
     2120                        'options' => array(
     2121                            'blogdescription' => 'Just My New Site',
     2122                        ),
     2123                    ),
     2124                    array(
     2125                        'blogname'        => 'My New Site',
     2126                        'blogdescription' => 'Just My New Site',
     2127                    ),
     2128                    array(),
     2129                ),
     2130            );
     2131        }
     2132
     2133        /**
     2134         * @ticket 41333
     2135         */
     2136        public function test_wp_initialize_site_user_roles() {
     2137            global $wpdb;
     2138
     2139            $result = wp_initialize_site( self::$uninitialized_site_id, array() );
     2140
     2141            switch_to_blog( self::$uninitialized_site_id );
     2142            $table_prefix = $wpdb->get_blog_prefix( self::$uninitialized_site_id );
     2143            $roles        = get_option( $table_prefix . 'user_roles' );
     2144            restore_current_blog();
     2145
     2146            wp_uninitialize_site( self::$uninitialized_site_id );
     2147
     2148            $this->assertTrue( $result );
     2149            $this->assertEqualSets(
     2150                array(
     2151                    'administrator',
     2152                    'editor',
     2153                    'author',
     2154                    'contributor',
     2155                    'subscriber',
     2156                ),
     2157                array_keys( $roles )
     2158            );
     2159        }
     2160
     2161        /**
     2162         * @ticket 41333
     2163         */
     2164        public function test_wp_initialize_site_user_is_admin() {
     2165            $result = wp_initialize_site( self::$uninitialized_site_id, array( 'user_id' => 1 ) );
     2166
     2167            switch_to_blog( self::$uninitialized_site_id );
     2168            $user_is_admin = user_can( 1, 'manage_options' );
     2169            $admin_email   = get_option( 'admin_email' );
     2170            restore_current_blog();
     2171
     2172            wp_uninitialize_site( self::$uninitialized_site_id );
     2173
     2174            $this->assertTrue( $result );
     2175            $this->assertTrue( $user_is_admin );
     2176            $this->assertEquals( get_userdata( 1 )->user_email, $admin_email );
     2177        }
     2178
     2179        /**
     2180         * @ticket 41333
     2181         */
     2182        public function test_wp_initialize_site_args_filter() {
     2183            add_filter( 'wp_initialize_site_args', array( $this, 'filter_wp_initialize_site_args' ), 10, 3 );
     2184            $result = wp_initialize_site( self::$uninitialized_site_id, array( 'title' => 'My Site' ) );
     2185
     2186            switch_to_blog( self::$uninitialized_site_id );
     2187            $site_title = get_option( 'blogname' );
     2188            restore_current_blog();
     2189
     2190            wp_uninitialize_site( self::$uninitialized_site_id );
     2191
     2192            $this->assertSame(
     2193                sprintf( 'My Site %1$d in Network %2$d', self::$uninitialized_site_id, get_site( self::$uninitialized_site_id )->network_id ),
     2194                $site_title
     2195            );
     2196        }
     2197
     2198        public function filter_wp_initialize_site_args( $args, $site, $network ) {
     2199            $args['title'] = sprintf( 'My Site %1$d in Network %2$d', $site->id, $network->id );
     2200
     2201            return $args;
     2202        }
     2203
     2204        /**
     2205         * @ticket 41333
     2206         */
     2207        public function test_wp_initialize_site_empty_id() {
     2208            $result = wp_initialize_site( 0 );
     2209            $this->assertWPError( $result );
     2210            $this->assertSame( 'site_empty_id', $result->get_error_code() );
     2211        }
     2212
     2213        /**
     2214         * @ticket 41333
     2215         */
     2216        public function test_wp_initialize_site_invalid_id() {
     2217            $result = wp_initialize_site( 123 );
     2218            $this->assertWPError( $result );
     2219            $this->assertSame( 'site_invalid_id', $result->get_error_code() );
     2220        }
     2221
     2222        /**
     2223         * @ticket 41333
     2224         */
     2225        public function test_wp_initialize_site_already_initialized() {
     2226            $result = wp_initialize_site( get_current_blog_id() );
     2227            $this->assertWPError( $result );
     2228            $this->assertSame( 'site_already_initialized', $result->get_error_code() );
     2229        }
     2230
     2231        /**
     2232         * @ticket 41333
     2233         */
     2234        public function test_wp_uninitialize_site() {
     2235            $site_id = self::factory()->blog->create();
     2236
     2237            $result = wp_uninitialize_site( $site_id );
     2238            $this->assertTrue( $result );
     2239            $this->assertFalse( wp_is_site_initialized( $site_id ) );
     2240        }
     2241
     2242        /**
     2243         * @ticket 41333
     2244         */
     2245        public function test_wp_uninitialize_site_empty_id() {
     2246            $result = wp_uninitialize_site( 0 );
     2247            $this->assertWPError( $result );
     2248            $this->assertSame( 'site_empty_id', $result->get_error_code() );
     2249        }
     2250
     2251        /**
     2252         * @ticket 41333
     2253         */
     2254        public function test_wp_uninitialize_site_invalid_id() {
     2255            $result = wp_uninitialize_site( 123 );
     2256            $this->assertWPError( $result );
     2257            $this->assertSame( 'site_invalid_id', $result->get_error_code() );
     2258        }
     2259
     2260        /**
     2261         * @ticket 41333
     2262         */
     2263        public function test_wp_uninitialize_site_already_uninitialized() {
     2264            $result = wp_uninitialize_site( self::$uninitialized_site_id );
     2265            $this->assertWPError( $result );
     2266            $this->assertSame( 'site_already_uninitialized', $result->get_error_code() );
     2267        }
     2268
     2269        /**
     2270         * @ticket 41333
     2271         */
     2272        public function test_wp_is_site_initialized() {
     2273            $this->assertTrue( wp_is_site_initialized( get_current_blog_id() ) );
     2274            $this->assertFalse( wp_is_site_initialized( self::$uninitialized_site_id ) );
     2275        }
     2276
     2277        /**
     2278         * @ticket 41333
     2279         */
     2280        public function test_wp_is_site_initialized_prefilter() {
     2281            add_filter( 'pre_wp_is_site_initialized', '__return_false' );
     2282            $this->assertFalse( wp_is_site_initialized( get_current_blog_id() ) );
     2283
     2284            add_filter( 'pre_wp_is_site_initialized', '__return_true' );
     2285            $this->assertTrue( wp_is_site_initialized( self::$uninitialized_site_id ) );
     2286        }
     2287
     2288        /**
     2289         * @ticket 41333
     2290         */
     2291        public function test_wp_insert_site_forwards_args_to_wp_initialize_site() {
     2292            $args = array(
     2293                'user_id' => 1,
     2294                'title'   => 'My Site',
     2295                'options' => array( 'option1' => 'value1' ),
     2296                'meta'    => array( 'meta1' => 'value1' ),
     2297            );
     2298
     2299            add_filter( 'wp_initialize_site_args', array( $this, 'filter_wp_initialize_site_args_catch_args' ) );
     2300            $site_id = wp_insert_site(
     2301                array_merge(
     2302                    array(
     2303                        'domain' => 'testsite.org',
     2304                        'path'   => '/',
     2305                    ),
     2306                    $args
     2307                )
     2308            );
     2309            $passed_args = $this->wp_initialize_site_args;
     2310
     2311            $this->wp_initialize_site_args = null;
     2312
     2313            $this->assertEqualSetsWithIndex( $args, $passed_args );
     2314        }
     2315
     2316        public function filter_wp_initialize_site_args_catch_args( $args ) {
     2317            $this->wp_initialize_site_args = $args;
     2318
     2319            return $args;
     2320        }
    20182321    }
    20192322
Note: See TracChangeset for help on using the changeset viewer.