Skip to:
Content

BuddyPress.org

Changeset 13451


Ignore:
Timestamp:
04/14/2023 04:11:52 AM (20 months ago)
Author:
imath
Message:

Administration: add Group slugs management into the URLs settings tab

  • Add a new $built_in argument to bp_get_group_screens() to only get BP built in single Groups item screens.
  • Edit the BP_Groups_Component::setup_nav() method so that it uses bp_get_group_screens() to generate the single group's navigation items.
  • bp_get_group_screens() is making it easier to manage all single group's nav item slugs from the BP Urls settings tab.

Props r-a-y, johnjamesjacoby, boonebgorges

Closes https://github.com/buddypress/buddypress/pull/85
See #4954

Location:
trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-core/admin/bp-core-admin-rewrites.php

    r13450 r13451  
    200200                            <?php endif; ?>
    201201                        <?php endif; ?>
     202
     203                        <?php if ( 'groups' === $component_id ) : ?>
     204
     205                            <?php
     206                            foreach (
     207                                array(
     208                                    'create' => __( 'Single Group creation steps slugs', 'buddypress' ),
     209                                    'read'   => __( 'Single Group regular screens slugs', 'buddypress' ),
     210                                    'manage' => __( 'Single Group management screens slugs', 'buddypress' ),
     211                                ) as $screen_type => $screen_type_title ) :
     212                                ?>
     213
     214                                <div class="health-check-accordion">
     215                                    <h4 class="health-check-accordion-heading">
     216                                        <button aria-expanded="false" class="health-check-accordion-trigger" aria-controls="health-check-accordion-block-group-<?php echo esc_attr( $screen_type ); ?>" type="button">
     217                                            <span class="title"><?php echo esc_html( $screen_type_title ); ?></span>
     218                                            <span class="icon"></span>
     219                                        </button>
     220                                    </h4>
     221                                    <div id="health-check-accordion-block-group-<?php echo esc_attr( $screen_type ); ?>" class="health-check-accordion-panel" hidden="hidden">
     222                                        <table class="form-table" role="presentation">
     223
     224                                        <?php
     225                                        if ( 'create' === $screen_type ) :
     226                                            foreach ( bp_get_group_restricted_screens() as $group_create_restricted_screen ) :
     227                                                ?>
     228                                                <tr>
     229                                                    <th scope="row">
     230                                                        <label style="margin-left: 2em; display: inline-block; vertical-align: middle" for="<?php echo esc_attr( sprintf( '%s-slug', sanitize_key( $group_create_restricted_screen['rewrite_id'] ) ) ); ?>">
     231                                                            <?php echo esc_html( $group_create_restricted_screen['name'] ); ?>
     232                                                        </label>
     233                                                    </th>
     234                                                    <td>
     235                                                        <input type="text" class="code" name="<?php printf( 'components[%1$d][_bp_component_slugs][%2$s]', absint( $directory_data->id ), esc_attr( $group_create_restricted_screen['rewrite_id'] ) ); ?>" id="<?php echo esc_attr( sprintf( '%s-slug', sanitize_key( $group_create_restricted_screen['rewrite_id'] ) ) ); ?>" value="<?php echo esc_attr( bp_rewrites_get_slug( $component_id, $group_create_restricted_screen['rewrite_id'], $group_create_restricted_screen['slug'] ) ); ?>">
     236                                                    </td>
     237                                                </tr>
     238                                                <?php
     239                                            endforeach;
     240
     241                                        endif;
     242
     243                                        foreach ( bp_get_group_screens( $screen_type ) as $group_screen ) :
     244                                            if ( ! isset( $group_screen['rewrite_id'] ) || ! $group_screen['rewrite_id'] ) {
     245                                                continue;
     246                                            }
     247                                            ?>
     248                                                <tr>
     249                                                    <th scope="row">
     250                                                        <label style="margin-left: 2em; display: inline-block; vertical-align: middle" for="<?php echo esc_attr( sprintf( '%s-slug', sanitize_key( $group_screen['rewrite_id'] ) ) ); ?>">
     251                                                            <?php
     252                                                            printf(
     253                                                                /* translators: %s is group view name */
     254                                                                esc_html_x( '"%s" slug', 'group view name URL admin label', 'buddypress' ),
     255                                                                esc_html( _bp_strip_spans_from_title( $group_screen['name'] ) )
     256                                                            );
     257                                                            ?>
     258                                                        </label>
     259                                                    </th>
     260                                                    <td>
     261                                                        <input type="text" class="code" name="<?php printf( 'components[%1$d][_bp_component_slugs][%2$s]', absint( $directory_data->id ), esc_attr( $group_screen['rewrite_id'] ) ); ?>" id="<?php echo esc_attr( sprintf( '%s-slug', sanitize_key( $group_screen['rewrite_id'] ) ) ); ?>" value="<?php echo esc_attr( bp_rewrites_get_slug( $component_id, $group_screen['rewrite_id'], $group_screen['slug'] ) ); ?>">
     262                                                    </td>
     263                                                </tr>
     264                                            <?php endforeach; ?>
     265                                        </table>
     266                                    </div>
     267                                </div>
     268                            <?php endforeach; ?>
     269                        <?php endif; ?>
    202270                    </div>
    203271                <?php endforeach; ?>
  • trunk/src/bp-groups/bp-groups-functions.php

    r13449 r13451  
    12761276     */
    12771277    return apply_filters( 'groups_get_current_group', $current_group );
     1278}
     1279
     1280/**
     1281 * Can the current user access to the current group?
     1282 *
     1283 * @since 12.0.0
     1284 *
     1285 * @return boolean True if the current user can access to the current group.
     1286 *                 False otherwise.
     1287 */
     1288function bp_groups_user_can_access_current_group() {
     1289    $can_access = false;
     1290
     1291    $current_group = groups_get_current_group();
     1292    if ( isset( $current_group->user_has_access ) ) {
     1293        $can_access = $current_group->user_has_access;
     1294    }
     1295
     1296    return $can_access;
    12781297}
    12791298
     
    37913810 * @since 12.0.0
    37923811 *
    3793  * @param string $context The display context. Required. Defaults to `read`.
    3794  * @return array          The list of potential Group screens.
    3795  */
    3796 function bp_get_group_screens( $context = 'read' ) {
     3812 * @param string  $context  The display context. Required. Defaults to `read`.
     3813 * @param boolean $built_in True to only get builtin screens. False otherwise.
     3814 * @return array            The list of potential Group screens.
     3815 */
     3816function bp_get_group_screens( $context = 'read', $built_in = false ) {
    37973817    $screens = array(
    37983818        'create' => array(
     
    38373857                'item_css_id'     => 'home',
    38383858            ),
    3839             'activity'            => array(
    3840                 'rewrite_id'      => 'bp_group_read_activity',
    3841                 'slug'            => 'activity',
    3842                 'name'            => _x( 'Activity', 'Group read screen', 'buddypress' ),
    3843                 'screen_function' => 'groups_screen_group_activity',
    3844                 'position'        => 11,
    3845                 'user_has_access' => false,
    3846                 'no_access_url'   => '',
    3847                 'item_css_id'     => 'activity',
    3848             ),
    38493859            'request-membership' => array(
    38503860                'rewrite_id'      => 'bp_group_read_request_membership',
     
    38543864                'position'        => 30,
    38553865            ),
     3866            'activity'           => array(
     3867                'rewrite_id'               => 'bp_group_read_activity',
     3868                'slug'                     => 'activity',
     3869                'name'                     => _x( 'Activity', 'Group read screen', 'buddypress' ),
     3870                'screen_function'          => 'groups_screen_group_activity',
     3871                'position'                 => 11,
     3872                'user_has_access'          => false,
     3873                'user_has_access_callback' => 'bp_groups_user_can_access_current_group',
     3874                'no_access_url'            => '',
     3875                'item_css_id'              => 'activity',
     3876            ),
    38563877            'members'            => array(
    3857                 'rewrite_id'      => 'bp_group_read_members',
    3858                 'slug'            => 'members',
     3878                'rewrite_id'               => 'bp_group_read_members',
     3879                'slug'                     => 'members',
    38593880                /* translators: %s: total member count */
    3860                 'name'            => _x( 'Members %s', 'Group read screen', 'buddypress' ),
    3861                 'screen_function' => 'groups_screen_group_members',
    3862                 'position'        => 60,
    3863                 'user_has_access' => false,
    3864                 'no_access_url'   => '',
    3865                 'item_css_id'     => 'members',
     3881                'name'                     => _x( 'Members %s', 'Group read screen', 'buddypress' ),
     3882                'screen_function'          => 'groups_screen_group_members',
     3883                'position'                 => 60,
     3884                'user_has_access'          => false,
     3885                'user_has_access_callback' => 'bp_groups_user_can_access_current_group',
     3886                'no_access_url'            => '',
     3887                'item_css_id'              => 'members',
    38663888            ),
    38673889            'send-invites'       => array(
    3868                 'rewrite_id'      => 'bp_group_read_send_invites',
    3869                 'slug'            => 'send-invites',
    3870                 'name'            => _x( 'Send Invites', 'Group read screen', 'buddypress' ),
    3871                 'screen_function' => 'groups_screen_group_invite',
    3872                 'position'        => 70,
    3873                 'user_has_access' => false,
    3874                 'no_access_url'   => '',
    3875                 'item_css_id'     => 'invite',
     3890                'rewrite_id'               => 'bp_group_read_send_invites',
     3891                'slug'                     => 'send-invites',
     3892                'name'                     => _x( 'Send Invites', 'Group read screen', 'buddypress' ),
     3893                'screen_function'          => 'groups_screen_group_invite',
     3894                'position'                 => 70,
     3895                'user_has_access'          => false,
     3896                'user_has_access_callback' => 'bp_groups_user_can_send_invites',
     3897                'no_access_url'            => '',
     3898                'item_css_id'              => 'invite',
    38763899            ),
    38773900            'admin'              => array(
    3878                 'rewrite_id'      => 'bp_group_read_admin',
    3879                 'slug'            => 'admin',
    3880                 'name'            => _x( 'Manage', 'Group read screen', 'buddypress' ),
    3881                 'screen_function' => 'groups_screen_group_admin',
    3882                 'position'        => 1000,
    3883                 'user_has_access' => false,
    3884                 'no_access_url'   => '',
    3885                 'item_css_id'     => 'admin',
     3901                'rewrite_id'               => 'bp_group_read_admin',
     3902                'slug'                     => 'admin',
     3903                'name'                     => _x( 'Manage', 'Group read screen', 'buddypress' ),
     3904                'screen_function'          => 'groups_screen_group_admin',
     3905                'position'                 => 1000,
     3906                'user_has_access'          => false,
     3907                'user_has_access_callback' => 'bp_is_item_admin',
     3908                'no_access_url'            => '',
     3909                'item_css_id'              => 'admin',
    38863910            ),
    38873911        ),
     
    39573981    }
    39583982
     3983    // We only need built-in screens, do not get custom ones.
     3984    if ( $built_in ) {
     3985        return $screens[ $context ];
     3986    }
     3987
    39593988    $context_screens         = array();
    39603989    $custom_screens          = apply_filters( 'bp_get_group_custom_' . $context . '_screens', $context_screens );
     
    39673996    if ( $custom_screens && ! wp_is_numeric_array( $custom_screens ) ) {
    39683997        // The screen key (used as default slug) and `rewrite_id` prop need to be unique.
    3969         $valid_custom_screens   = array_diff_key( $custom_screens, $screens[ $context ] );
     3998        $valid_custom_screens = array_diff_key( $custom_screens, $screens[ $context ] );
    39703999        $existing_rewrite_ids = array_column( $screens[ $context ], 'rewrite_id' );
    39714000        $existing_rewrite_ids = array_merge(
  • trunk/src/bp-groups/bp-groups-template.php

    r13449 r13451  
    32433243        }
    32443244
    3245         $views = bp_get_group_screens( 'read' );
    3246         if ( isset( $views[ $page ]['rewrite_id'] ) ) {
    3247             $page = bp_rewrites_get_slug( 'groups', $views[ $page ]['rewrite_id'], $page );
     3245        $screens = bp_get_group_screens( 'read' );
     3246        if ( isset( $screens[ $page ]['rewrite_id'] ) ) {
     3247            $page = bp_rewrites_get_slug( 'groups', $screens[ $page ]['rewrite_id'], $page );
    32483248        }
    32493249
     
    33033303        }
    33043304
    3305         $views = bp_get_group_screens( 'manage' );
    3306         if ( isset( $views[ $page ]['rewrite_id'] ) ) {
    3307             $page = bp_rewrites_get_slug( 'groups', $views[ $page ]['rewrite_id'], $page );
     3305        $screens = bp_get_group_screens( 'manage' );
     3306        if ( isset( $screens[ $page ]['rewrite_id'] ) ) {
     3307            $page = bp_rewrites_get_slug( 'groups', $screens[ $page ]['rewrite_id'], $page );
    33083308        }
    33093309
  • trunk/src/bp-groups/classes/class-bp-groups-component.php

    r13450 r13451  
    375375
    376376        // Set default Group creation steps.
    377         $group_creation_steps = bp_get_group_screens( 'create' );
     377        $group_creation_steps = bp_get_group_screens( 'create', true );
    378378
    379379        // If avatar uploads are disabled, remove avatar view.
     
    632632        }
    633633
     634        // Generate the displayed User navigation for the Groupe compnent.
     635        parent::setup_nav( $main_nav, $sub_nav );
     636
     637        // Generate the displayed Group navigation.
    634638        if ( bp_is_groups_component() && bp_is_single_item() ) {
    635639            /*
     
    637641             * It does not appear in the interface.
    638642             */
    639             bp_core_new_nav_item( array(
    640                 'name'                => __( 'Memberships', 'buddypress' ),
    641                 'slug'                => $this->current_group->slug,
    642                 'position'            => -1, // Do not show into the navigation.
    643                 'screen_function'     => 'groups_screen_group_home',
    644                 'default_subnav_slug' => $this->default_extension,
    645                 'item_css_id'         => $this->id
    646             ), 'groups' );
    647 
     643            bp_core_new_nav_item(
     644                array(
     645                    'name'                => __( 'Memberships', 'buddypress' ),
     646                    'slug'                => $this->current_group->slug,
     647                    'position'            => -1, // Do not show into the navigation.
     648                    'screen_function'     => 'groups_screen_group_home',
     649                    'default_subnav_slug' => $this->default_extension,
     650                    'item_css_id'         => $this->id
     651                ),
     652                'groups'
     653            );
     654
     655            // Get the "read" screens.
     656            $screens    = bp_get_group_screens( 'read', true );
    648657            $group_link = bp_get_group_url( $this->current_group );
    649 
    650             // Add the "Home" subnav item, as this will always be present.
    651             $sub_nav[] = array(
    652                 'name'            =>  _x( 'Home', 'Group screen navigation title', 'buddypress' ),
    653                 'slug'            => 'home',
    654                 'parent_slug'     => $this->current_group->slug,
    655                 'screen_function' => 'groups_screen_group_home',
    656                 'position'        => 10,
    657                 'item_css_id'     => 'home'
    658             );
     658            $sub_nav    = array();
    659659
    660660            /*
    661661             * If this is a private group, and the user is not a member and does not
    662              * have an outstanding invitation, how a "Request Membership" nav item.
     662             * have an outstanding invitation, only generate the request membership
     663             * nav item if the user can request this membership.
    663664             */
    664             if ( bp_current_user_can( 'groups_request_membership', array( 'group_id' => $this->current_group->id ) ) ) {
    665                 $sub_nav[] = array(
    666                     'name'            => _x( 'Request Membership','Group screen nav', 'buddypress' ),
    667                     'slug'            => 'request-membership',
    668                     'parent_slug'     => $this->current_group->slug,
    669                     'screen_function' => 'groups_screen_group_request_membership',
    670                     'position'        => 30
    671                 );
    672             }
    673 
    674             if ( $this->current_group->front_template || bp_is_active( 'activity' ) ) {
    675                 // If the theme is using a custom front, create activity subnav.
    676                 if ( $this->current_group->front_template && bp_is_active( 'activity' ) ) {
    677                     $sub_nav[] = array(
    678                         'name'            => _x( 'Activity', 'My Group screen nav', 'buddypress' ),
    679                         'slug'            => 'activity',
    680                         'parent_slug'     => $this->current_group->slug,
    681                         'screen_function' => 'groups_screen_group_activity',
    682                         'position'        => 11,
    683                         'user_has_access' => $this->current_group->user_has_access,
    684                         'item_css_id'     => 'activity',
    685                         'no_access_url'   => $group_link,
     665            if ( ! bp_current_user_can( 'groups_request_membership', array( 'group_id' => $this->current_group->id ) ) ) {
     666                unset( $screens['request-membership'] );
     667            }
     668
     669            // If the invitations feature is not active remove the corresponding nav item.
     670            if ( ! bp_is_active( 'groups', 'invitations' ) ) {
     671                unset( $screens['send-invites'] );
     672            }
     673
     674            /*
     675             * By default activity is group's home, only keep an activity sub nab if there's
     676             * a custom group's front page and the activity component is active.
     677             */
     678            if ( ! $this->current_group->front_template || ! bp_is_active( 'activity' ) ) {
     679                unset( $screens['activity'] );
     680            }
     681
     682            /*
     683             * If there's a custom group's front page and the activity component is not active,
     684             * The members screen is use as the group's home page. If it's not the case, remove
     685             * the corresponding nav item.
     686             */
     687            if ( ! $this->current_group->front_template && ! bp_is_active( 'activity' ) ) {
     688                unset( $screens['members'] );
     689            }
     690
     691            foreach ( $screens as $screen_id => $sub_nav_item ) {
     692                $sub_nav_item['parent_slug'] = $this->current_group->slug;
     693
     694                if ( 'members' === $screen_id ) {
     695                    $sub_nav_item['name'] = sprintf(
     696                        $sub_nav_item['name'],
     697                        '<span>' . number_format( $this->current_group->total_member_count ) . '</span>'
    686698                    );
    687699                }
    688700
    689                 // Only add the members subnav if it's not the home's nav.
    690                 $sub_nav[] = array(
    691                     'name'            => sprintf(
    692                         /* translators: %s: total member count */
    693                         _x( 'Members %s', 'My Group screen nav', 'buddypress' ),
    694                         '<span>' . number_format( $this->current_group->total_member_count ) . '</span>'
    695                     ),
    696                     'slug'            => 'members',
    697                     'parent_slug'     => $this->current_group->slug,
    698                     'screen_function' => 'groups_screen_group_members',
    699                     'position'        => 60,
    700                     'user_has_access' => $this->current_group->user_has_access,
    701                     'item_css_id'     => 'members',
    702                     'no_access_url'   => $group_link,
    703                 );
    704             }
    705 
    706             if ( bp_is_active( 'groups', 'invitations' ) ) {
    707                 $sub_nav[] = array(
    708                     'name'            => _x( 'Send Invites', 'My Group screen nav', 'buddypress' ),
    709                     'slug'            => 'send-invites',
    710                     'parent_slug'     => $this->current_group->slug,
    711                     'screen_function' => 'groups_screen_group_invite',
    712                     'item_css_id'     => 'invite',
    713                     'position'        => 70,
    714                     'user_has_access' => bp_groups_user_can_send_invites(),
    715                     'no_access_url'   => $group_link,
    716                 );
     701                if ( isset( $sub_nav_item['no_access_url'] ) ) {
     702                    $sub_nav_item['no_access_url'] = $group_link;
     703                }
     704
     705                if ( isset( $sub_nav_item['user_has_access_callback'] ) && is_callable( $sub_nav_item['user_has_access_callback'] ) ) {
     706                    $sub_nav_item['user_has_access'] = call_user_func( $sub_nav_item['user_has_access_callback'] );
     707                    unset( $sub_nav_item['user_has_access_callback'] );
     708                }
     709
     710                // Add the sub nav item.
     711                $sub_nav[] = $sub_nav_item;
    717712            }
    718713
    719714            // If the user is a group admin, then show the group admin nav item.
    720715            if ( bp_is_item_admin() ) {
    721                 $sub_nav[] = array(
    722                     'name'            => _x( 'Manage', 'My Group screen nav', 'buddypress' ),
    723                     'slug'            => 'admin',
    724                     'parent_slug'     => $this->current_group->slug,
    725                     'screen_function' => 'groups_screen_group_admin',
    726                     'position'        => 1000,
    727                     'user_has_access' => true,
    728                     'item_css_id'     => 'admin',
    729                     'no_access_url'   => $group_link,
    730                 );
    731 
    732                 $admin_link = bp_get_group_url(
     716                // Get the "manage" screens.
     717                $manage_screens    = bp_get_group_screens( 'manage', true );
     718                $admin_link        = bp_get_group_url(
    733719                    $this->current_group,
    734720                    array(
     
    745731                );
    746732
    747                 $sub_nav[] = array_merge( array(
    748                     'name'     => __( 'Details', 'buddypress' ),
    749                     'slug'     => 'edit-details',
    750                     'position' => 0,
    751                 ), $default_params );
    752 
    753                 $sub_nav[] = array_merge( array(
    754                     'name'     => __( 'Settings', 'buddypress' ),
    755                     'slug'     => 'group-settings',
    756                     'position' => 10,
    757                 ), $default_params );
    758 
    759                 if ( ! bp_disable_group_avatar_uploads() && buddypress()->avatar->show_avatars ) {
    760                     $sub_nav[] = array_merge( array(
    761                         'name'     => __( 'Photo', 'buddypress' ),
    762                         'slug'     => 'group-avatar',
    763                         'position' => 20,
    764                     ), $default_params );
    765                 }
    766 
    767                 if ( bp_group_use_cover_image_header() ) {
    768                     $sub_nav[] = array_merge( array(
    769                         'name'     => __( 'Cover Image', 'buddypress' ),
    770                         'slug'     => 'group-cover-image',
    771                         'position' => 25,
    772                     ), $default_params );
    773                 }
    774 
    775                 $sub_nav[] = array_merge( array(
    776                     'name'     => __( 'Members', 'buddypress' ),
    777                     'slug'     => 'manage-members',
    778                     'position' => 30,
    779                 ), $default_params );
    780 
    781                 if ( 'private' == $this->current_group->status ) {
    782                     $sub_nav[] = array_merge( array(
    783                         'name'     => __( 'Requests', 'buddypress' ),
    784                         'slug'     => 'membership-requests',
    785                         'position' => 40,
    786                     ), $default_params );
    787                 }
    788 
    789                 $sub_nav[] = array_merge( array(
    790                     'name'     => __( 'Delete', 'buddypress' ),
    791                     'slug'     => 'delete-group',
    792                     'position' => 1000,
    793                 ), $default_params );
    794             }
    795 
     733                // Only keep the Group's profile photo screen if avatars are enabled.
     734                if ( bp_disable_group_avatar_uploads() || ! buddypress()->avatar->show_avatars ) {
     735                    unset( $manage_screens['group-avatar'] );
     736                }
     737
     738                // Only keep the Group's cover image screen if cover images are enabled.
     739                if ( ! bp_group_use_cover_image_header() ) {
     740                    unset( $manage_screens['group-cover-image'] );
     741                }
     742
     743                // Only keep the membership requests screen for private groups.
     744                if ( 'private' !== $this->current_group->status ) {
     745                    unset( $manage_screens['membership-requests'] );
     746                }
     747
     748                foreach ( $manage_screens as $manage_screen_id => $manage_sub_nav_item ) {
     749                    $sub_nav[] = array_merge( $manage_sub_nav_item, $default_params );
     750                }
     751            }
     752
     753            // Finally generate read/manage nav items.
    796754            foreach ( $sub_nav as $nav ) {
    797755                bp_core_new_subnav_item( $nav, 'groups' );
     
    814772            }
    815773        }
    816 
    817         parent::setup_nav( $main_nav, $sub_nav );
    818774    }
    819775
Note: See TracChangeset for help on using the changeset viewer.