Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
05/03/2023 06:18:23 AM (22 months ago)
Author:
imath
Message:

Stop using BP Legacy URL parser in favor of the new BP Rewrites API

  • Deprecate bp_core_set_uri_globals(). This function is moved inside the BP Classic compatibility plugin.
  • Introduce the new bp_register_nav action to hook to when globalizing Members single item navigations from the BP_Component class.
  • Improve bp_get_component_navigations() so that Avatar/Cover images navigation items are moved inside the Profile sub nav if the Extended profile component is active.
  • Register Avatar/Cover images Ajax actions so that these actions trigger our new URL Parser inside Ajax context.
  • Improve the BP_Core_Nav::add_nav() method so that any BP action variable slugs can be customized.
  • Improve Members & Groups component canonical redirections.
  • Handle slugs customization persistency using directory pages post metas.
  • Introduce a new repair tool to reset all slugs to BuddyPress default one.
  • Adapt some PHPUnit tests to better handle our new URL parser.

Props Props r-a-y, johnjamesjacoby, boonebgorges

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

File:
1 edited

Legend:

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

    r13451 r13468  
    3030
    3131    wp_enqueue_script( 'bp-rewrites-ui' );
     32
     33    // Handle slugs customization.
     34    if ( isset( $_POST['bp-admin-rewrites-submit'] ) ) {
     35        check_admin_referer( 'bp-admin-rewrites-setup' );
     36
     37        $base_url = bp_get_admin_url( add_query_arg( 'page', 'bp-rewrites', 'admin.php' ) );
     38
     39        if ( ! isset( $_POST['components'] ) ) {
     40            wp_safe_redirect( add_query_arg( 'error', 'true', $base_url ) );
     41        }
     42
     43        $directory_pages     = (array) bp_core_get_directory_pages();
     44        $current_page_slugs  = wp_list_pluck( $directory_pages, 'slug', 'id' );
     45        $current_page_titles = wp_list_pluck( $directory_pages, 'title', 'id' );
     46        $reset_rewrites      = false;
     47
     48        // Data is sanitized inside the foreach loop.
     49        $components = wp_unslash( $_POST['components'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
     50
     51        foreach ( $components as $page_id => $posted_data ) {
     52            $postarr = array();
     53
     54            if ( ! isset( $current_page_slugs[ $page_id ] ) ) {
     55                continue;
     56            }
     57
     58            $postarr['ID'] = $page_id;
     59
     60            if ( isset( $posted_data['post_title'] ) ) {
     61                $post_title = sanitize_text_field( $posted_data['post_title'] );
     62
     63                if ( $current_page_titles[ $page_id ] !== $post_title ) {
     64                    $postarr['post_title'] = $post_title;
     65                }
     66            }
     67
     68            if ( isset( $posted_data['post_name'] ) ) {
     69                $post_name = sanitize_text_field( $posted_data['post_name'] );
     70
     71                if ( $current_page_slugs[ $page_id ] !== $post_name ) {
     72                    $reset_rewrites       = true;
     73                    $postarr['post_name'] = $post_name;
     74                }
     75            }
     76
     77            if ( isset( $posted_data['_bp_component_slugs'] ) && is_array( $posted_data['_bp_component_slugs'] ) ) {
     78                $postarr['meta_input']['_bp_component_slugs'] = array_map( 'sanitize_title', $posted_data['_bp_component_slugs'] );
     79            }
     80
     81            if ( isset( $posted_data['_bp_component_slugs']['bp_group_create'] ) ) {
     82                $new_current_group_create_slug    = sanitize_text_field( $posted_data['_bp_component_slugs']['bp_group_create'] );
     83                $current_group_create_custom_slug = '';
     84
     85                if ( isset( $directory_pages->groups->custom_slugs['bp_group_create'] ) ) {
     86                    $current_group_create_custom_slug = $directory_pages->groups->custom_slugs['bp_group_create'];
     87                }
     88
     89                if ( $new_current_group_create_slug !== $current_group_create_custom_slug ) {
     90                    $reset_rewrites = true;
     91                }
     92            }
     93
     94            wp_update_post( $postarr );
     95        }
     96
     97        // Make sure the WP rewrites will be regenarated at next page load.
     98        if ( $reset_rewrites ) {
     99            bp_delete_rewrite_rules();
     100        }
     101
     102        wp_safe_redirect( add_query_arg( 'updated', 'true', $base_url ) );
     103    }
    32104}
    33105
     
    133205
    134206                                            if ( isset( $navs['sub_nav'] ) ) {
     207                                                if ( 'profile' === $navs['main_nav']['slug'] ) {
     208                                                    $edit_subnav = wp_list_filter( $navs['sub_nav'], array( 'slug' => 'edit' ) );
     209                                                    $position    = key( $edit_subnav );
     210
     211                                                    if ( $edit_subnav ) {
     212                                                        $edit_subnav = reset( $edit_subnav );
     213                                                        array_splice(
     214                                                            $navs['sub_nav'],
     215                                                            $position + 1,
     216                                                            0,
     217                                                            array(
     218                                                                array(
     219                                                                    'name'       => __( 'Field Group', 'buddypress' ),
     220                                                                    'slug'       => 'group',
     221                                                                    'rewrite_id' => $edit_subnav['rewrite_id'] . '_group',
     222                                                                )
     223                                                            )
     224                                                        );
     225                                                    }
     226                                                }
     227
    135228                                                $members_sub_navigation[ $navs['main_nav']['slug'] ] = array(
    136229                                                    'name'    => $navs['main_nav']['name'],
     
    146239                                                        /* translators: %s is the member primary screen name */
    147240                                                        esc_html_x( '"%s" slug', 'member primary screen name URL admin label', 'buddypress' ),
    148                                                         esc_html( _bp_strip_spans_from_title( $navs['main_nav']['name'] ) )
     241                                                        esc_html( $navs['main_nav']['name'] )
    149242                                                    );
    150243                                                    ?>
     
    184277                                                                    /* translators: %s is the member secondary view name */
    185278                                                                    esc_html_x( '"%s" slug', 'member secondary screen name URL admin label', 'buddypress' ),
    186                                                                     esc_html( _bp_strip_spans_from_title( $secondary_nav_item['name'] ) )
     279                                                                    esc_html( $secondary_nav_item['name'] )
    187280                                                                );
    188281                                                                ?>
     
    253346                                                                /* translators: %s is group view name */
    254347                                                                esc_html_x( '"%s" slug', 'group view name URL admin label', 'buddypress' ),
    255                                                                 esc_html( _bp_strip_spans_from_title( $group_screen['name'] ) )
     348                                                                esc_html( str_replace( ' %s', '', $group_screen['name'] ) )
    256349                                                            );
    257350                                                            ?>
     
    270363                    </div>
    271364                <?php endforeach; ?>
     365
     366                <p class="submit clear">
     367                    <input class="button-primary" type="submit" name="bp-admin-rewrites-submit" id="bp-admin-rewrites-submit" value="<?php esc_attr_e( 'Save Settings', 'buddypress' ); ?>"/>
     368                </p>
     369
     370                <?php wp_nonce_field( 'bp-admin-rewrites-setup' ); ?>
     371
    272372            </form>
    273373        </div>
Note: See TracChangeset for help on using the changeset viewer.