Skip to:
Content

Ticket #7157: 7157.02.patch

File 7157.02.patch, 19.4 KB (added by imath, 18 months ago)
  • src/bp-core/admin/bp-core-admin-functions.php

    diff --git src/bp-core/admin/bp-core-admin-functions.php src/bp-core/admin/bp-core-admin-functions.php
    index 39b54b2..c996e09 100644
    function bp_core_get_admin_tabs( $active_tab = '' ) { 
    438438                        'href' => bp_get_admin_url( add_query_arg( array( 'page' => 'bp-settings' ), 'admin.php' ) ), 
    439439                        'name' => __( 'Options', 'buddypress' ) 
    440440                ), 
     441                '3' => array( 
     442                        'href' => bp_get_admin_url( add_query_arg( array( 'page' => 'bp-theme-packages' ), 'admin.php' ) ), 
     443                        'name' => __( 'Template Pack', 'buddypress' ) 
     444                ), 
    441445        ); 
    442446 
    443447        // If forums component is active, add additional tab. 
    function bp_core_get_admin_tabs( $active_tab = '' ) { 
    447451                wp_enqueue_script( 'thickbox' ); 
    448452                wp_enqueue_style( 'thickbox' ); 
    449453 
    450                 $tabs['3'] = array( 
     454                $tabs['4'] = array( 
    451455                        'href' => bp_get_admin_url( add_query_arg( array( 'page' => 'bb-forums-setup'  ), 'admin.php' ) ), 
    452456                        'name' => __( 'Forums', 'buddypress' ) 
    453457                ); 
  • src/bp-core/admin/bp-core-admin-theme-packages.php

    diff --git src/bp-core/admin/bp-core-admin-theme-packages.php src/bp-core/admin/bp-core-admin-theme-packages.php
    index e69de29..78e4ff5 100644
     
     1<?php 
     2/** 
     3 * BuddyPress Theme Packages. 
     4 * 
     5 * @package BuddyPress 
     6 * @subpackage Core 
     7 * @since 2.7.0 
     8 */ 
     9 
     10// Exit if accessed directly. 
     11defined( 'ABSPATH' ) || exit; 
     12 
     13/** 
     14 * Displays the Template Packs Table's header & footer. 
     15 * 
     16 * @since  2.7.0 
     17 * 
     18 * @return string HTML Output. 
     19 */ 
     20function bp_core_admin_theme_packages_get_head() { 
     21        $table_head = array_fill_keys( array( 'head', 'foot' ), array( 
     22                'cb'          => '&nbsp;', 
     23                'name'        => __( 'Name', 'buddypress' ), 
     24                'description' => __( 'Description', 'buddypress' ), 
     25                'actions'     => __( 'Actions', 'buddypress' ), 
     26        ) ); 
     27 
     28        foreach ( $table_head as $kh => $columns ) { 
     29                printf( '<t%1$s>%2$s<tr>%3$s', $kh, "\n\t", "\n" ); 
     30 
     31                foreach ( $columns as $kc => $column ) { 
     32                        $class = ''; 
     33                        if ( 'cb' === $kc ) { 
     34                                $class = ' check_column'; 
     35                        } 
     36 
     37                        printf( 
     38                                '<th id="%2$s-%3$s" class="manage-column column-%2$s%4$s">%5$s</th>%6$s', 
     39                                "\t\t", 
     40                                $kc, 
     41                                $kh, 
     42                                $class, 
     43                                esc_html( $column ), 
     44                                "\n" 
     45                        ); 
     46                } 
     47 
     48                printf( '%1$s</tr>%2$s<t%3$s>', "\t", "\n", $kh ); 
     49        } 
     50} 
     51 
     52/** 
     53 * Format Template Pack's metas for display. 
     54 * 
     55 * @since  2.7.0 
     56 * 
     57 * @param  object $theme_package The Theme Package we need to get metas for. 
     58 * @return string HTML Output. 
     59 */ 
     60function bp_core_admin_theme_package_metas( $theme_package_id = '' ) { 
     61        $theme_packages  = buddypress()->theme_compat->packages; 
     62 
     63        if ( ! isset( $theme_packages[ $theme_package_id ] ) ) { 
     64                return; 
     65        } 
     66 
     67        $metas         = array(); 
     68        $theme_package = $theme_packages[ $theme_package_id ]; 
     69 
     70        if ( ! empty( $theme_package->__get( 'version' ) ) ) { 
     71                $metas[] = sprintf( _x( 'Version %s', 'Version of the Template Pack', 'buddypress' ), esc_html( $theme_package->__get( 'version' ) ) ); 
     72        } 
     73 
     74        if ( ! empty( $theme_package->__get( 'author' ) ) ) { 
     75                $metas[] = sprintf( _x( 'By %s', 'Name of the author of the Template Pack.', 'buddypress' ), esc_html( $theme_package->__get( 'author' ) ) ); 
     76        } 
     77 
     78        if ( ! empty( $theme_package->__get( 'link' ) ) ) { 
     79                $metas[] = sprintf( '<a href="%1$s">%2$s</a>', 
     80                        esc_url( $theme_package->__get( 'link' ) ), 
     81                        __( 'Visit Template Pack site', 'buddypress' ) 
     82                ); 
     83        } 
     84 
     85        if ( empty( $metas ) ) { 
     86                return; 
     87        } 
     88 
     89        echo join( ' | ', $metas ); 
     90} 
     91 
     92/** 
     93 * Gets Template Pack's warnings. 
     94 * 
     95 * @since  2.7.0 
     96 * 
     97 * @param  object $theme_package The Theme Package we need to set warnings for. 
     98 * @return string HTML Output. 
     99 */ 
     100function bp_core_admin_theme_package_get_warnings() { 
     101        $theme_packages  = buddypress()->theme_compat->packages; 
     102        $warnings        = array(); 
     103 
     104        $wp_version        = bp_get_major_wp_version(); 
     105        $bp_version        = bp_get_version(); 
     106        $active_components = array_intersect( array_keys( buddypress()->active_components ), bp_core_get_packaged_component_ids() ); 
     107        $retired_forums    = array_search( 'forums', $active_components ); 
     108 
     109 
     110        if ( $retired_forums ) { 
     111                $active_components[ $retired_forums ] = 'retired-forums'; 
     112        } 
     113 
     114        foreach ( $theme_packages as $theme_package ) { 
     115                if ( ! empty( $theme_package->__get( 'bp_required_version' ) ) && version_compare( $bp_version, $theme_package->__get( 'bp_required_version' ), '<' ) ) { 
     116                        $warnings[ $theme_package->id ][] = sprintf( __( 'BuddyPress required version is %s.', 'buddypress' ), $theme_package->__get( 'bp_required_version' ) ); 
     117                } 
     118 
     119                if ( ! empty( $theme_package->__get( 'wp_required_version' ) ) && version_compare( $wp_version, $theme_package->__get( 'wp_required_version' ), '<' ) ) { 
     120                        $warnings[ $theme_package->id ][] = sprintf( __( 'WordPress required version is %s.', 'buddypress' ), $theme_package->__get( 'wp_required_version' ) ); 
     121                } 
     122 
     123                if ( ! empty( $theme_package->__get( 'supports' ) ) ) { 
     124                        $supported_components = (array) $theme_package->__get( 'supports' ); 
     125 
     126                        // This component is often forgotten. 
     127                        if ( ! array_search( 'members', $supported_components ) ) { 
     128                                $supported_components[] = 'members'; 
     129                        } 
     130 
     131                        $no_support = array_diff( $active_components, $supported_components ); 
     132 
     133                        if ( ! empty( $no_support ) ) { 
     134                                $warnings[ $theme_package->id ][] = sprintf( __( 'No support is provided for the following component(s): %s.', 'buddypress' ), join( ', ', $no_support ) ); 
     135                        } 
     136                } 
     137        } 
     138 
     139        return $warnings; 
     140} 
     141 
     142/** 
     143 * Displays the Template Packs Table's body. 
     144 * 
     145 * @since  2.7.0 
     146 * 
     147 * @return string HTML Output. 
     148 */ 
     149function bp_core_admin_theme_packages_get_body() { 
     150        $theme_packages  = buddypress()->theme_compat->packages; 
     151        $current         = bp_get_theme_package_id(); 
     152        $warnings        = bp_core_admin_theme_package_get_warnings(); 
     153 
     154        $customizer_args = array( 
     155                'url'    => rawurlencode( bp_loggedin_user_domain() ), 
     156                'return' => esc_url( add_query_arg( 'page', 'bp-theme-packages', bp_get_admin_url( 'admin.php' ) ) ), 
     157        ); 
     158        ?> 
     159 
     160        <tbody id="the-list"> 
     161 
     162                <?php if ( empty( $theme_packages ) ) : ?> 
     163 
     164                        <tr class="no-items"> 
     165                                <td class="colspanchange" colspan="4"><?php esc_html_e( 'No template packs found.', 'buddypress' ); ?></td> 
     166                        </tr> 
     167 
     168                <?php else : foreach( $theme_packages as $theme_package ) : 
     169                        $class           = 'active'; 
     170                        $activation_link = ''; 
     171 
     172                        if ( $theme_package->id !== $current ) { 
     173                                $class = 'inactive'; 
     174                                $activation_link = wp_nonce_url( add_query_arg( array( 
     175                                        'page'    => 'bp-theme-packages', 
     176                                        'action'  => 'activate', 
     177                                        'package' => $theme_package->id, 
     178                                ), bp_get_admin_url( 'admin.php' ) ), 'bp-theme-packages-activate' ); 
     179 
     180                                $customizer_args['bp_template_pack'] = $theme_package->id; 
     181                        } else { 
     182                                $customizer_args = array_intersect_key( $customizer_args, array( 'url' => true, 'return' => true ) ); 
     183                        } 
     184 
     185                        $customizer_link = add_query_arg( $customizer_args, admin_url( 'customize.php' ) ); 
     186                ?> 
     187 
     188                        <tr id="<?php echo esc_attr( $theme_package->id ); ?>" class="<?php echo esc_attr( $theme_package->id ) . ' ' . esc_attr( $class ); ?>"> 
     189                                        <th scope="row" class="check-column"> 
     190 
     191                                        </th> 
     192 
     193                                        <td class="plugin-title" style="width: 190px;"> 
     194                                                <span></span> 
     195 
     196                                                <label for="bp_theme_package-<?php echo esc_attr( $theme_package->id ); ?>"> 
     197                                                        <strong><?php echo esc_html( $theme_package->name ); ?></strong> 
     198                                                </label> 
     199 
     200                                                <div class="row-actions-visible"></div> 
     201                                        </td> 
     202 
     203                                        <td class="column-description desc"> 
     204                                                <div class="plugin-description"> 
     205                                                        <p><?php echo esc_html( $theme_package->description ); ?></p> 
     206                                                </div> 
     207 
     208                                                <div class="active second plugin-version-author-uri"> 
     209                                                        <?php bp_core_admin_theme_package_metas( $theme_package->id ); ?> 
     210                                                </div> 
     211 
     212                                                <?php if ( ! empty( $warnings[ $theme_package->id ] ) ) : ?> 
     213 
     214                                                        <div class="attention"> 
     215 
     216                                                                <?php echo join( '<br/>', array_map( 'esc_html', $warnings[ $theme_package->id ] ) ); ?> 
     217 
     218                                                        </div> 
     219 
     220                                                <?php endif; ?> 
     221                                        </td> 
     222 
     223                                        <td class="column-actions desc"> 
     224                                                <?php if ( ! empty( $warnings[ $theme_package->id ] ) ) : ?> 
     225                                                        <?php esc_html_e( 'Not compatible', 'buddypress' ); ?> 
     226                                                <?php elseif ( ! empty( $activation_link ) ) : ?> 
     227                                                        <a href="<?php echo esc_url( $activation_link ); ?>" class="button button-primary"><?php esc_html_e( 'Activate', 'buddypress' ); ?></a> 
     228                                                        <a href="<?php echo esc_url( $customizer_link ); ?>" class="button button-secondary"><?php esc_html_e( 'Preview', 'buddypress' ); ?></a> 
     229                                                <?php else : ?> 
     230                                                        <a href="<?php echo esc_url( $customizer_link ); ?>" class="button button-secondary"><?php esc_html_e( 'Customize', 'buddypress' ); ?></a> 
     231                                                <?php endif; ?> 
     232 
     233                                        </td> 
     234                                </tr> 
     235 
     236 
     237                <?php endforeach; endif; ?> 
     238 
     239        </tbody> 
     240        <?php 
     241} 
     242 
     243/** 
     244 * Returns feedback messages to inform the site owner. 
     245 * 
     246 * @since  2.7.0 
     247 * 
     248 * @return array The list of feedback messages. 
     249 */ 
     250function bp_core_admin_theme_packages_feedbacks() { 
     251        /** 
     252         * Filter here to add your own feedback messages. 
     253         * 
     254         * @since  2.7.0 
     255         * 
     256         * @param array $value The list of feedback messages. 
     257         */ 
     258        return apply_filters( 'bp_core_admin_theme_packages_feedbacks', array( 
     259                'activated' => array( 
     260                        'message' => __( 'Template pack successfully activated.', 'buddypress' ), 
     261                        'type'    => 'updated', 
     262                ), 
     263                'activation_error' => array( 
     264                        'message' => __( 'The Template Pack could not be activated.', 'buddypress' ), 
     265                        'type'    => 'error', 
     266                ), 
     267        ) ); 
     268} 
     269 
     270/** 
     271 * Manage the actions the site owner requested. 
     272 * 
     273 * @since  2.7.0 
     274 */ 
     275function bp_core_admin_theme_packages_load() { 
     276 
     277        // Bail if it's not a BP Theme Package form. 
     278        if ( empty( $_GET['action'] ) ) { 
     279                return; 
     280        } 
     281 
     282        $action = $_GET['action']; 
     283 
     284        // Build the redirect args. 
     285        $query_arg = array( 'page' => 'bp-theme-packages' ); 
     286 
     287        if ( 'activate' === $action && ! empty( $_GET['package'] ) ) { 
     288                // Check the nonce. 
     289                check_admin_referer( 'bp-theme-packages-activate' ); 
     290 
     291                $theme_packages  = buddypress()->theme_compat->packages; 
     292                $theme_package_id  = sanitize_key( $_GET['package'] ); 
     293 
     294                // Bail if we can't activate the Template Pack due to some missing informations. 
     295                if ( ! isset( $theme_packages[ $theme_package_id ] ) || ! is_dir( $theme_packages[ $theme_package_id ]->dir ) || ! file_exists( $theme_packages[ $theme_package_id ]->dir . '/buddypress-functions.php' ) ) { 
     296                        $query_arg['status'] = 'activation_error'; 
     297 
     298                // Process to the activation. 
     299                } else { 
     300 
     301                        // Update the Theme Package ID 
     302                        bp_update_option( '_bp_theme_package_id', $theme_package_id ); 
     303                        $query_arg['status'] = 'activated'; 
     304                } 
     305 
     306        } else { 
     307                /** 
     308                 * Hook here to run your custom actions 
     309                 * 
     310                 * @since 2.7.0 
     311                 * 
     312                 * @param $action the current Template Pack action. 
     313                 */ 
     314                do_action( 'bp_core_admin_theme_packages_load', $action ); 
     315        } 
     316 
     317        wp_safe_redirect( add_query_arg( $query_arg, bp_get_admin_url( 'admin.php' ) ) ); 
     318        exit(); 
     319} 
     320 
     321/** 
     322 * Main UI to Manage the Template Packs. 
     323 * 
     324 * @since  2.7.0 
     325 * 
     326 * @return string HTML Output. 
     327 */ 
     328function bp_core_admin_theme_packages() { 
     329        $bp = buddypress(); 
     330 
     331        ?> 
     332        <div class="wrap"> 
     333 
     334                <h1><?php _e( 'BuddyPress Settings', 'buddypress' ); ?> </h1> 
     335 
     336                <h2 class="nav-tab-wrapper"><?php bp_core_admin_tabs( __( 'Template Pack', 'buddypress' ) ); ?></h2> 
     337 
     338                <?php 
     339                // User feedbacks 
     340                if ( isset( $_GET['status'] ) ) { 
     341                        // Defaults to an error. 
     342                        $type      = 'error'; 
     343                        $how_to    = ''; 
     344                        $feedbacks = bp_core_admin_theme_packages_feedbacks(); 
     345 
     346                        if ( isset( $feedbacks[ $_GET['status'] ] ) ) { 
     347                                $feedback = $feedbacks[ $_GET['status'] ]; 
     348 
     349                                // Display the feedback message. 
     350                                printf( 
     351                                        '<div id="message" class="%1$s notice is-dismissible"><p>%2$s</p></div>', 
     352                                        $feedback['type'], 
     353                                        esc_html( $feedback['message'] ) 
     354                                ); 
     355                        } 
     356                } 
     357 
     358                /** 
     359                 * Fires before the form tag. 
     360                 * 
     361                 * @since 2.7.0 
     362                 */ 
     363                do_action( 'bp_core_admin_before_theme_packages_form' ); ?> 
     364 
     365                <form action="<?php echo esc_url( add_query_arg( array( 'page' => 'bp-theme-packages' ), bp_get_admin_url( 'admin.php' ) ) ); ?>" method="post" id="bp-core-admin-theme-packages-form" style="margin-top:1.5em"> 
     366 
     367                        <?php 
     368                        /** 
     369                         * Fires before the list table. 
     370                         * 
     371                         * @since 2.7.0 
     372                         */ 
     373                        do_action( 'bp_core_admin_before_theme_packages_list' ); ?> 
     374 
     375                        <table class="widefat plugins" cellspacing="0"> 
     376 
     377                                <?php bp_core_admin_theme_packages_get_head() ;?> 
     378 
     379                                <?php bp_core_admin_theme_packages_get_body() ;?> 
     380 
     381                        </table> 
     382 
     383                        <?php 
     384                        /** 
     385                         * Fires after the list table. 
     386                         * 
     387                         * @since 2.7.0 
     388                         */ 
     389                        do_action( 'bp_core_admin_after_theme_packages_list' ); 
     390 
     391                        wp_nonce_field( 'bp-theme-packages-manage' ); ?> 
     392 
     393                </form> 
     394        </div> 
     395        <?php 
     396} 
  • src/bp-core/bp-core-theme-compatibility.php

    diff --git src/bp-core/bp-core-theme-compatibility.php src/bp-core/bp-core-theme-compatibility.php
    index ea83317..5c24bff 100644
    function bp_setup_theme_compat( $theme = '' ) { 
    4343        // Make sure theme package is available, set to default if not. 
    4444        if ( ! isset( $bp->theme_compat->packages[$theme] ) || ! is_a( $bp->theme_compat->packages[$theme], 'BP_Theme_Compat' ) ) { 
    4545                $theme = 'legacy'; 
     46 
     47                /** 
     48                 * If we are here, that's probably because a Template Pack Plugin 
     49                 * has been deactivated. Bring back legacy into options. 
     50                 */ 
     51                bp_update_option( '_bp_theme_package_id', $theme ); 
    4652        } 
    4753 
    4854        // Set the active theme compat theme. 
    function bp_theme_compat_loop_end( $query ) { 
    991997        unset( $bp->theme_compat->is_page_toggled ); 
    992998} 
    993999add_action( 'loop_end', 'bp_theme_compat_loop_end' ); 
     1000 
     1001/** 
     1002 * Are we currently previewing a Template Pack in the customizer? 
     1003 * 
     1004 * @since  2.7.0 
     1005 * 
     1006 * @return bool|string False if no Template Pack is being previewed. 
     1007 *                     The Template Pack folder's name otherwise. 
     1008 */ 
     1009function bp_theme_compat_is_theme_package_preview() { 
     1010        $retval = false; 
     1011 
     1012        if ( empty( $_POST['wp_customize'] ) ) { 
     1013                return $retval; 
     1014        } 
     1015 
     1016        $preview_uri = parse_url( bp_get_referer_path() ); 
     1017 
     1018        // Ultimate check. 
     1019        if ( false === strpos( $preview_uri['path'], 'customize.php' ) ) { 
     1020                return $retval; 
     1021        } 
     1022 
     1023        // Is there a template pack to preview ? 
     1024        $vars = wp_parse_args( $preview_uri['query'], array() ); 
     1025 
     1026        $theme_package_key = ''; 
     1027        if ( ! empty( $vars['bp_template_pack'] ) ) { 
     1028                $theme_package_key = sanitize_key( $vars['bp_template_pack'] ); 
     1029        } 
     1030 
     1031        // Set the Theme Package Key being previewed 
     1032        if ( $theme_package_key ) { 
     1033                $retval = $theme_package_key; 
     1034        } 
     1035 
     1036        return $retval; 
     1037} 
     1038 
     1039/** 
     1040 * Eventually set the Template Pack ID to the one being previewed 
     1041 * into the customizer. 
     1042 * 
     1043 * @since  2.7.0 
     1044 * 
     1045 * @param  bool   $retval False. 
     1046 * @return string         The theme compat ID. 
     1047 */ 
     1048function bp_theme_compat_set_preview_theme_compat_id( $retval = false ) { 
     1049        $bp = buddypress(); 
     1050 
     1051        if ( ! empty( $bp->theme_compat->theme_package_previewed ) ) { 
     1052                $retval = $bp->theme_compat->theme_package_previewed; 
     1053        } 
     1054 
     1055        return $retval; 
     1056} 
     1057 
     1058/** 
     1059 * Set the Theme Package preview for the customizer. 
     1060 * 
     1061 * @since  2.7.0 
     1062 */ 
     1063function bp_theme_compat_set_theme_package_preview() { 
     1064        $theme_package = bp_theme_compat_is_theme_package_preview(); 
     1065 
     1066        // We're not previewing a Template Pack. 
     1067        if ( ! $theme_package ) { 
     1068                return; 
     1069        } 
     1070 
     1071        // Get all available Theme packages 
     1072        $theme_packages = buddypress()->theme_compat->packages; 
     1073 
     1074        // If we're not finding the Theme Package stop! 
     1075        if ( empty( $theme_packages[ $theme_package ] ) ) { 
     1076                return; 
     1077        } 
     1078 
     1079        // Set the global to use in filters 
     1080        buddypress()->theme_compat->theme_package_previewed = $theme_packages[ $theme_package ]->id; 
     1081 
     1082        // Prefilter options used to load the Template Pack 
     1083        add_filter( 'pre_option__bp_theme_package_id', 'bp_theme_compat_set_preview_theme_compat_id', 10, 1 ); 
     1084} 
     1085add_action( 'bp_setup_theme', 'bp_theme_compat_set_theme_package_preview', 4 ); 
  • src/bp-core/classes/class-bp-admin.php

    diff --git src/bp-core/classes/class-bp-admin.php src/bp-core/classes/class-bp-admin.php
    index 5946130..6e0b604 100644
    class BP_Admin { 
    121121                        require( $this->admin_dir . 'bp-core-admin-classes.php'    ); 
    122122                } 
    123123 
    124                 require( $this->admin_dir . 'bp-core-admin-actions.php'    ); 
    125                 require( $this->admin_dir . 'bp-core-admin-settings.php'   ); 
    126                 require( $this->admin_dir . 'bp-core-admin-functions.php'  ); 
    127                 require( $this->admin_dir . 'bp-core-admin-components.php' ); 
    128                 require( $this->admin_dir . 'bp-core-admin-slugs.php'      ); 
    129                 require( $this->admin_dir . 'bp-core-admin-tools.php'      ); 
     124                require( $this->admin_dir . 'bp-core-admin-actions.php'        ); 
     125                require( $this->admin_dir . 'bp-core-admin-settings.php'       ); 
     126                require( $this->admin_dir . 'bp-core-admin-functions.php'      ); 
     127                require( $this->admin_dir . 'bp-core-admin-components.php'     ); 
     128                require( $this->admin_dir . 'bp-core-admin-slugs.php'          ); 
     129                require( $this->admin_dir . 'bp-core-admin-tools.php'          ); 
     130                require( $this->admin_dir . 'bp-core-admin-theme-packages.php' ); 
    130131        } 
    131132 
    132133        /** 
    class BP_Admin { 
    270271                        'bp_core_admin_settings' 
    271272                ); 
    272273 
     274                $hooks[] = add_submenu_page( 
     275                        $this->settings_page, 
     276                        __( 'BuddyPress Template Pack', 'buddypress' ), 
     277                        __( 'BuddyPress Template Pack', 'buddypress' ), 
     278                        $this->capability, 
     279                        'bp-theme-packages', 
     280                        'bp_core_admin_theme_packages' 
     281                ); 
     282 
    273283                // For consistency with non-Multisite, we add a Tools menu in 
    274284                // the Network Admin as a home for our Tools panel. 
    275285                if ( is_multisite() && bp_core_do_network_admin() ) { 
    class BP_Admin { 
    327337 
    328338                foreach( $hooks as $hook ) { 
    329339                        add_action( "admin_head-$hook", 'bp_core_modify_admin_menu_highlight' ); 
     340 
     341                        if ( false !== strpos( $hook, 'bp-theme-packages' ) ) { 
     342                                add_action( "load-{$hook}", 'bp_core_admin_theme_packages_load' ); 
     343                        } 
    330344                } 
    331345        } 
    332346 
    class BP_Admin { 
    524538        public function admin_head() { 
    525539 
    526540                // Settings pages. 
    527                 remove_submenu_page( $this->settings_page, 'bp-page-settings' ); 
    528                 remove_submenu_page( $this->settings_page, 'bp-settings'      ); 
     541                remove_submenu_page( $this->settings_page, 'bp-page-settings'  ); 
     542                remove_submenu_page( $this->settings_page, 'bp-settings'       ); 
     543                remove_submenu_page( $this->settings_page, 'bp-theme-packages' ); 
    529544 
    530545                // Network Admin Tools. 
    531546                remove_submenu_page( 'network-tools', 'network-tools' ); 
  • src/bp-loader.php

    diff --git src/bp-loader.php src/bp-loader.php
    index 1d05b96..635a0d7 100644
    class BuddyPress { 
    749749 
    750750                // Register the default theme compatibility package 
    751751                bp_register_theme_package( array( 
    752                         'id'      => 'legacy', 
    753                         'name'    => __( 'BuddyPress Default', 'buddypress' ), 
    754                         'version' => bp_get_version(), 
    755                         'dir'     => trailingslashit( $this->themes_dir . '/bp-legacy' ), 
    756                         'url'     => trailingslashit( $this->themes_url . '/bp-legacy' ) 
     752                        'id'          => 'legacy', 
     753                        'name'        => __( 'BuddyPress Default', 'buddypress' ), 
     754                        'version'     => bp_get_version(), 
     755                        'dir'         => trailingslashit( $this->themes_dir . '/bp-legacy' ), 
     756                        'url'         => trailingslashit( $this->themes_url . '/bp-legacy' ), 
     757                        'description' => __( 'The BuddyPress legacy Template Pack', 'buddypress' ), 
     758                        'author'      => __( 'The BuddyPress community', 'buddypress' ), 
     759                        'link'        => 'https://buddypress.org', 
    757760                ) ); 
    758761 
    759762                // Register the basic theme stack. This is really dope.