Make WordPress Core

Changeset 37202


Ignore:
Timestamp:
04/14/2016 03:39:45 AM (10 years ago)
Author:
jeremyfelt
Message:

Multisite: Introduce WP_Theme methods to network enable/disable themes.

  • WP_Theme::network_enable_theme() can be used to enable a theme or array of themes on a network.
  • WP_Theme::network_disable_theme() can be used to disable a theme or array of themes on a network.
  • Use these new methods in the network admin vs direct update_site_option() calls.
  • Add tests.

Props igmoweb.
Fixes #30594.

Location:
trunk
Files:
3 edited

Legend:

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

    r36770 r37202  
    3030
    3131if ( $action ) {
    32         $allowed_themes = get_site_option( 'allowedthemes' );
    3332        switch ( $action ) {
    3433                case 'enable':
    3534                        check_admin_referer('enable-theme_' . $_GET['theme']);
    36                         $allowed_themes[ $_GET['theme'] ] = true;
    37                         update_site_option( 'allowedthemes', $allowed_themes );
     35                        WP_Theme::network_enable_theme( $_GET['theme'] );
    3836                        if ( false === strpos( $referer, '/network/themes.php' ) )
    3937                                wp_redirect( network_admin_url( 'themes.php?enabled=1' ) );
     
    4341                case 'disable':
    4442                        check_admin_referer('disable-theme_' . $_GET['theme']);
    45                         unset( $allowed_themes[ $_GET['theme'] ] );
    46                         update_site_option( 'allowedthemes', $allowed_themes );
     43                        WP_Theme::network_disable_theme( $_GET['theme'] );
    4744                        wp_safe_redirect( add_query_arg( 'disabled', '1', $referer ) );
    4845                        exit;
     
    5451                                exit;
    5552                        }
    56                         foreach ( (array) $themes as $theme )
    57                                 $allowed_themes[ $theme ] = true;
    58                         update_site_option( 'allowedthemes', $allowed_themes );
     53                        WP_Theme::network_enable_theme( (array) $themes );
    5954                        wp_safe_redirect( add_query_arg( 'enabled', count( $themes ), $referer ) );
    6055                        exit;
     
    6661                                exit;
    6762                        }
    68                         foreach ( (array) $themes as $theme )
    69                                 unset( $allowed_themes[ $theme ] );
    70                         update_site_option( 'allowedthemes', $allowed_themes );
     63                        WP_Theme::network_disable_theme( (array) $themes );
    7164                        wp_safe_redirect( add_query_arg( 'disabled', count( $themes ), $referer ) );
    7265                        exit;
  • trunk/src/wp-includes/class-wp-theme.php

    r36739 r37202  
    13171317
    13181318        /**
     1319         * Enable a theme for all sites on the current network.
     1320         *
     1321         * @since 4.6.0
     1322         *
     1323         * @static
     1324         * @access public
     1325         *
     1326         * @param string|array $stylesheets Stylesheet name or array of stylesheet names.
     1327         */
     1328        public static function network_enable_theme( $stylesheets ) {
     1329                if ( ! is_multisite() ) {
     1330                        return;
     1331                }
     1332
     1333                if ( ! is_array( $stylesheets ) ) {
     1334                        $stylesheets = array( $stylesheets );
     1335                }
     1336
     1337                $allowed_themes = get_site_option( 'allowedthemes' );
     1338                foreach ( $stylesheets as $stylesheet ) {
     1339                        $allowed_themes[ $stylesheet ] = true;
     1340                }
     1341
     1342                update_site_option( 'allowedthemes', $allowed_themes );
     1343        }
     1344
     1345        /**
     1346         * Disable a theme for all sites on the current network.
     1347         *
     1348         * @since 4.6.0
     1349         *
     1350         * @static
     1351         * @access public
     1352         *
     1353         * @param string|array $stylesheets Stylesheet name or array of stylesheet names.
     1354         */
     1355        public static function network_disable_theme( $stylesheets ) {
     1356                if ( ! is_multisite() ) {
     1357                        return;
     1358                }
     1359
     1360                if ( ! is_array( $stylesheets ) ) {
     1361                        $stylesheets = array( $stylesheets );
     1362                }
     1363
     1364                $allowed_themes = get_site_option( 'allowedthemes' );
     1365                foreach ( $stylesheets as $stylesheet ) {
     1366                        if ( isset( $allowed_themes[ $stylesheet ] ) ) {
     1367                                unset( $allowed_themes[ $stylesheet ] );
     1368                        }
     1369                }
     1370
     1371                update_site_option( 'allowedthemes', $allowed_themes );
     1372        }
     1373
     1374        /**
    13191375         * Sorts themes by name.
    13201376         *
  • trunk/tests/phpunit/tests/theme/WPTheme.php

    r27915 r37202  
    140140                $this->assertFalse( $theme->display( 'Tags' ) );
    141141        }
     142
     143
     144        /**
     145         * Enable a single theme on a network.
     146         *
     147         * @ticket 30594
     148         */
     149        function test_wp_theme_network_enable_single_theme() {
     150                if ( ! is_multisite() ) {
     151                        $this->markTestSkipped( 'This test requires multisite' );
     152                }
     153
     154                $theme = 'testtheme-1';
     155                $current_allowed_themes = get_site_option( 'allowedthemes' );
     156                WP_Theme::network_enable_theme( $theme );
     157                $new_allowed_themes = get_site_option( 'allowedthemes' );
     158                update_site_option( 'allowedthemes', $current_allowed_themes ); // reset previous value.
     159                $current_allowed_themes['testtheme-1'] = true; // Add the new theme to the previous set.
     160
     161                $this->assertEqualSetsWithIndex( $current_allowed_themes, $new_allowed_themes );
     162        }
     163
     164        /**
     165         * Enable multiple themes on a network.
     166         *
     167         * @ticket 30594
     168         */
     169        function test_wp_theme_network_enable_multiple_themes() {
     170                if ( ! is_multisite() ) {
     171                        $this->markTestSkipped( 'This test requires multisite' );
     172                }
     173
     174                $themes = array( 'testtheme-2', 'testtheme-3' );
     175                $current_allowed_themes = get_site_option( 'allowedthemes' );
     176                WP_Theme::network_enable_theme( $themes );
     177                $new_allowed_themes = get_site_option( 'allowedthemes' );
     178                update_site_option( 'allowedthemes', $current_allowed_themes ); // reset previous value.
     179                $current_allowed_themes = array_merge( $current_allowed_themes, array( 'testtheme-2' => true, 'testtheme-3' => true ) );
     180
     181                $this->assertEqualSetsWithIndex( $current_allowed_themes, $new_allowed_themes );
     182        }
     183
     184        /**
     185         * Disable a single theme on a network.
     186         *
     187         * @ticket 30594
     188         */
     189        function test_network_disable_single_theme() {
     190                if ( ! is_multisite() ) {
     191                        $this->markTestSkipped( 'This test requires multisite' );
     192                }
     193
     194                $current_allowed_themes = get_site_option( 'allowedthemes' );
     195
     196                $allowed_themes = array( 'existing-1' => true, 'existing-2' => true, 'existing-3' => true );
     197                update_site_option( 'allowedthemes', $allowed_themes );
     198
     199                $disable_theme = 'existing-2';
     200                WP_Theme::network_disable_theme( $disable_theme );
     201                $new_allowed_themes = get_site_option( 'allowedthemes' );
     202                update_site_option( 'allowedthemes', $current_allowed_themes ); // reset previous value.
     203                unset( $allowed_themes[ $disable_theme ] ); // Remove deleted theme from initial set.
     204
     205                $this->assertEqualSetsWithIndex( $allowed_themes, $new_allowed_themes );
     206        }
     207
     208        /**
     209         * Disable multiple themes on a network.
     210         *
     211         * @ticket 30594
     212         */
     213        function test_network_disable_multiple_themes() {
     214                if ( ! is_multisite() ) {
     215                        $this->markTestSkipped( 'This test requires multisite' );
     216                }
     217
     218                $current_allowed_themes = get_site_option( 'allowedthemes' );
     219
     220                $allowed_themes = array( 'existing-4' => true, 'existing-5' => true, 'existing-6' => true );
     221                update_site_option( 'allowedthemes', $allowed_themes );
     222
     223                $disable_themes = array( 'existing-4', 'existing-5' );
     224                WP_Theme::network_disable_theme( $disable_themes );
     225                $new_allowed_themes = get_site_option( 'allowedthemes' );
     226                update_site_option( 'allowedthemes', $current_allowed_themes ); // reset previous value.
     227                unset( $allowed_themes['existing-4'] );
     228                unset( $allowed_themes['existing-5'] );
     229
     230                $this->assertEqualSetsWithIndex( $allowed_themes, $new_allowed_themes );
     231        }
    142232}
Note: See TracChangeset for help on using the changeset viewer.