Skip to:
Content

BuddyPress.org

Ticket #6286: 6286.patch

File 6286.patch, 14.5 KB (added by boonebgorges, 7 years ago)
  • src/bp-core/bp-core-actions.php

    diff --git src/bp-core/bp-core-actions.php src/bp-core/bp-core-actions.php
    index 1a26da0..3d5cf14 100644
    add_action( 'bp_loaded', 'bp_setup_components', 2 ); 
    5555add_action( 'bp_loaded', 'bp_include',                  4  );
    5656add_action( 'bp_loaded', 'bp_setup_cache_groups',       5  );
    5757add_action( 'bp_loaded', 'bp_setup_widgets',            6  );
     58add_action( 'bp_loaded', 'bp_register_member_types',    8  );
    5859add_action( 'bp_loaded', 'bp_register_theme_packages',  12 );
    5960add_action( 'bp_loaded', 'bp_register_theme_directory', 14 );
    6061
  • src/bp-core/bp-core-catchuri.php

    diff --git src/bp-core/bp-core-catchuri.php src/bp-core/bp-core-catchuri.php
    index ffc3200..0bda454 100644
    function bp_core_set_uri_globals() { 
    252252                // If members component, do more work to find the actual component
    253253                if ( 'members' == $match->key ) {
    254254
    255                         // Viewing a specific user
    256                         if ( !empty( $bp_uri[$uri_offset + 1] ) ) {
     255                        $after_member_slug = false;
     256                        if ( ! empty( $bp_uri[ $uri_offset + 1 ] ) ) {
     257                                $after_member_slug = $bp_uri[ $uri_offset + 1 ];
     258                        }
    257259
     260                        // Viewing a specific user
     261                        if ( $after_member_slug ) {
    258262                                // Switch the displayed_user based on compatibility mode
    259263                                if ( bp_is_username_compatibility_mode() ) {
    260                                         $bp->displayed_user->id = (int) bp_core_get_userid( urldecode( $bp_uri[$uri_offset + 1] ) );
     264                                        $bp->displayed_user->id = (int) bp_core_get_userid( urldecode( $after_member_slug ) );
    261265                                } else {
    262                                         $bp->displayed_user->id = (int) bp_core_get_userid_from_nicename( urldecode( $bp_uri[$uri_offset + 1] ) );
     266                                        $bp->displayed_user->id = (int) bp_core_get_userid_from_nicename( $after_member_slug );
    263267                                }
     268                        }
    264269
    265                                 if ( !bp_displayed_user_id() ) {
     270                        // Is this a member type directory?
     271                        if ( ! bp_displayed_user_id() && $after_member_slug ) {
     272                                $matched_types = bp_get_member_types( array(
     273                                        'has_directory'  => true,
     274                                        'directory_slug' => $after_member_slug,
     275                                ) );
    266276
    267                                         // Prevent components from loading their templates
    268                                         $bp->current_component = '';
     277                                if ( ! empty( $matched_types ) ) {
     278                                        $bp->current_member_type = reset( $matched_types );
     279                                        unset( $bp_uri[ $uri_offset + 1 ] );
     280                                }
     281                        }
     282
     283                        // If the slug matches neither a member type nor a specific member, 404.
     284                        if ( ! bp_displayed_user_id() && empty( $bp->current_member_type ) && $after_member_slug ) {
     285
     286                                // Prevent components from loading their templates
     287                                $bp->current_component = '';
     288
     289                                bp_do_404();
     290                                return;
     291                        }
    269292
     293                        // If the displayed user is marked as a spammer, 404 (unless logged-
     294                        // in user is a super admin)
     295                        if ( bp_displayed_user_id() && bp_is_user_spammer( bp_displayed_user_id() ) ) {
     296                                if ( bp_current_user_can( 'bp_moderate' ) ) {
     297                                        bp_core_add_message( __( 'This user has been marked as a spammer. Only site admins can view this profile.', 'buddypress' ), 'warning' );
     298                                } else {
    270299                                        bp_do_404();
    271300                                        return;
    272301                                }
     302                        }
    273303
    274                                 // If the displayed user is marked as a spammer, 404 (unless logged-
    275                                 // in user is a super admin)
    276                                 if ( bp_displayed_user_id() && bp_is_user_spammer( bp_displayed_user_id() ) ) {
    277                                         if ( bp_current_user_can( 'bp_moderate' ) ) {
    278                                                 bp_core_add_message( __( 'This user has been marked as a spammer. Only site admins can view this profile.', 'buddypress' ), 'warning' );
    279                                         } else {
    280                                                 bp_do_404();
    281                                                 return;
    282                                         }
    283                                 }
    284 
    285                                 // Bump the offset
     304                        // Bump the offset
     305                        if ( $after_member_slug ) {
    286306                                if ( isset( $bp_uri[$uri_offset + 2] ) ) {
    287307                                        $bp_uri                = array_merge( array(), array_slice( $bp_uri, $uri_offset + 2 ) );
    288308                                        $bp->current_component = $bp_uri[0];
    289309
    290310                                // No component, so default will be picked later
    291                                 } else {
     311                                } elseif ( empty( $bp->current_member_type ) ) {
    292312                                        $bp_uri                = array_merge( array(), array_slice( $bp_uri, $uri_offset + 2 ) );
    293313                                        $bp->current_component = '';
    294314                                }
    295 
    296                                 // Reset the offset
    297                                 $uri_offset = 0;
    298315                        }
     316
     317                        // Reset the offset
     318                        $uri_offset = 0;
    299319                }
    300320        }
    301321
  • src/bp-core/bp-core-dependency.php

    diff --git src/bp-core/bp-core-dependency.php src/bp-core/bp-core-dependency.php
    index 25f483a..a67fb6f 100644
    function bp_setup_widgets() { 
    141141}
    142142
    143143/**
     144 * Fire the 'bp_register_widgets' action, where plugins should register widgets.
     145 *
     146 * @since BuddyPress (2.3.0)
     147 */
     148function bp_register_member_types() {
     149        do_action( 'bp_register_member_types' );
     150}
     151
     152/**
    144153 * Fire the 'bp_setup_cache_groups' action, where cache groups are registered.
    145154 *
    146155 * @since BuddyPress (2.2.0)
  • src/bp-loader.php

    diff --git src/bp-loader.php src/bp-loader.php
    index 4ee261c..13ff8c0 100644
    class BuddyPress { 
    8181        public $action_variables = array();
    8282
    8383        /**
     84         * @var string Current member directory type.
     85         */
     86        public $current_member_type = '';
     87
     88        /**
    8489         * @var array Required components (core, members).
    8590         */
    8691        public $required_components = array();
  • src/bp-members/bp-members-functions.php

    diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php
    index 01e9772..7cf83c1 100644
    function bp_register_member_type( $member_type, $args = array() ) { 
    24692469
    24702470        $r = bp_parse_args( $args, array(
    24712471                'labels' => array(),
     2472                'has_directory' => true,
    24722473        ), 'register_member_type' );
    24732474
    24742475        $member_type = sanitize_key( $member_type );
    function bp_register_member_type( $member_type, $args = array() ) { 
    24832484                'singular_name' => $default_name,
    24842485        ), $r['labels'] );
    24852486
     2487        // Directory slug.
     2488        if ( $r['has_directory'] ) {
     2489                // A string value is intepreted as the directory slug. Otherwise fall back on member type.
     2490                if ( is_string( $r['has_directory'] ) ) {
     2491                        $directory_slug = $r['has_directory'];
     2492                } else {
     2493                        $directory_slug = $member_type;
     2494                }
     2495
     2496                // Sanitize for use in URLs.
     2497                $r['directory_slug'] = sanitize_title( $directory_slug );
     2498                $r['has_directory']  = true;
     2499        } else {
     2500                $r['directory_slug'] = '';
     2501                $r['has_directory']  = false;
     2502        }
     2503
    24862504        $bp->members->types[ $member_type ] = $type = (object) $r;
    24872505
    24882506        /**
  • src/bp-members/bp-members-template.php

    diff --git src/bp-members/bp-members-template.php src/bp-members/bp-members-template.php
    index bb3c177..a938830 100644
    function bp_has_members( $args = '' ) { 
    515515                $user_id = bp_displayed_user_id();
    516516        }
    517517
     518        $member_type = buddypress()->current_member_type;
     519        if ( ! $member_type && ! empty( $_GET['member_type'] ) ) {
     520                if ( is_array( $_GET['member_type'] ) ) {
     521                        $member_type = $_GET['member_type'];
     522                } else {
     523                        // Can be a comma-separated list.
     524                        $member_type = explode( ',', $_GET['member_type'] );
     525                }
     526        }
     527
    518528        // type: active ( default ) | random | newest | popular | online | alphabetical
    519529        $r = bp_parse_args( $args, array(
    520530                'type'            => 'active',
    function bp_has_members( $args = '' ) { 
    528538                'exclude'         => false,    // Pass a user_id or a list (comma-separated or array) of user_ids to exclude these users
    529539
    530540                'user_id'         => $user_id, // Pass a user_id to only show friends of this user
    531                 'member_type'     => '',
     541                'member_type'     => $member_type,
    532542                'search_terms'    => null,     // Pass search_terms to filter users by their profile data
    533543
    534544                'meta_key'        => false,        // Only return users with this usermeta
  • tests/phpunit/includes/testcase.php

    diff --git tests/phpunit/includes/testcase.php tests/phpunit/includes/testcase.php
    index 2789e46..d14fe76 100644
    class BP_UnitTestCase extends WP_UnitTestCase { 
    4444
    4545        function clean_up_global_scope() {
    4646                buddypress()->bp_nav                = buddypress()->bp_options_nav = buddypress()->action_variables = buddypress()->canonical_stack = buddypress()->unfiltered_uri = $GLOBALS['bp_unfiltered_uri'] = array();
    47                 buddypress()->current_component     = buddypress()->current_item = buddypress()->current_action = '';
     47                buddypress()->current_component     = buddypress()->current_item = buddypress()->current_action = buddypress()->current_member_type = '';
    4848                buddypress()->unfiltered_uri_offset = 0;
    4949                buddypress()->is_single_item        = false;
    5050                buddypress()->current_user          = new stdClass();
  • tests/phpunit/testcases/members/template.php

    diff --git tests/phpunit/testcases/members/template.php tests/phpunit/testcases/members/template.php
    index d91d780..a1bcb40 100644
    class BP_Tests_Members_Template extends BP_UnitTestCase { 
    132132        }
    133133
    134134        /**
     135         * @group bp_has_members
     136         * @ticket BP6286
     137         */
     138        public function test_bp_has_members_should_infer_member_type_from_get_param() {
     139                bp_register_member_type( 'foo' );
     140                bp_register_member_type( 'bar' );
     141                $users = $this->factory->user->create_many( 3 );
     142                bp_set_member_type( $users[0], 'foo' );
     143                bp_set_member_type( $users[1], 'bar' );
     144
     145                global $members_template;
     146                $old_members_template = $members_template;
     147
     148                $old_get = $_GET;
     149                $_GET['member_type'] = 'bar';
     150
     151                bp_has_members();
     152
     153                $members = is_array( $members_template->members ) ? array_values( $members_template->members ) : array();
     154                $member_ids = wp_list_pluck( $members, 'ID' );
     155                $this->assertEquals( array( $users[1] ), $member_ids );
     156
     157                $GLOBALS['members_template'] = $old_members_template;
     158        }
     159
     160        /**
     161         * @group bp_has_members
     162         * @ticket BP6286
     163         */
     164        public function test_bp_has_members_should_infer_member_type_from_get_param_comma_sep() {
     165                bp_register_member_type( 'foo' );
     166                bp_register_member_type( 'bar' );
     167                bp_register_member_type( 'baz' );
     168                $users = $this->factory->user->create_many( 4 );
     169                bp_set_member_type( $users[0], 'foo' );
     170                bp_set_member_type( $users[1], 'bar' );
     171                bp_set_member_type( $users[2], 'baz' );
     172
     173                global $members_template;
     174                $old_members_template = $members_template;
     175
     176                $old_get = $_GET;
     177                $_GET['member_type'] = 'foo,bar';
     178
     179                bp_has_members();
     180
     181                $members = is_array( $members_template->members ) ? array_values( $members_template->members ) : array();
     182                $member_ids = wp_list_pluck( $members, 'ID' );
     183                $this->assertEqualSets( array( $users[0], $users[1] ), $member_ids );
     184
     185                $GLOBALS['members_template'] = $old_members_template;
     186        }
     187
     188        /**
    135189         * @group bp_get_member_last_active
    136190         */
    137191        public function test_bp_get_member_last_active_default_params() {
  • tests/phpunit/testcases/members/types.php

    diff --git tests/phpunit/testcases/members/types.php tests/phpunit/testcases/members/types.php
    index bdec116..249049b 100644
    class BP_Tests_Members_Types extends BP_UnitTestCase { 
    7373                $this->assertSame( 'Bar', $object->labels['singular_name'] );
    7474        }
    7575
     76        /**
     77         * @ticket BP6286
     78         */
     79        public function test_bp_register_member_type_has_directory_should_default_to_true() {
     80                $object = bp_register_member_type( 'foo', array(
     81                        'has_directory' => true,
     82                ) );
     83
     84                $this->assertTrue( $object->has_directory );
     85                $this->assertSame( 'foo', $object->directory_slug );
     86        }
     87
     88        /**
     89         * @ticket BP6286
     90         */
     91        public function test_bp_register_member_type_has_directory_true() {
     92                $object = bp_register_member_type( 'foo', array(
     93                        'has_directory' => true,
     94                ) );
     95
     96                $this->assertTrue( $object->has_directory );
     97                $this->assertSame( 'foo', $object->directory_slug );
     98        }
     99
     100        /**
     101         * @ticket BP6286
     102         */
     103        public function test_bp_register_member_type_should_store_has_directory_false() {
     104                $object = bp_register_member_type( 'foo', array(
     105                        'has_directory' => false,
     106                ) );
     107
     108                $this->assertFalse( $object->has_directory );
     109                $this->assertSame( '', $object->directory_slug );
     110        }
     111
     112        /**
     113         * @ticket BP6286
     114         */
     115        public function test_bp_register_member_type_should_store_has_directory_string() {
     116                $object = bp_register_member_type( 'foo', array(
     117                        'has_directory' => 'foos',
     118                ) );
     119
     120                $this->assertTrue( $object->has_directory );
     121                $this->assertSame( 'foos', $object->directory_slug );
     122        }
     123
    76124        public function test_bp_get_member_type_object_should_return_null_for_non_existent_member_type() {
    77125                $this->assertSame( null, bp_get_member_type_object( 'foo' ) );
    78126        }
  • tests/phpunit/testcases/routing/members.php

    diff --git tests/phpunit/testcases/routing/members.php tests/phpunit/testcases/routing/members.php
    index a4c5d46..a4813db 100644
    class BP_Tests_Routing_Members extends BP_UnitTestCase { 
    99        public function setUp() {
    1010                parent::setUp();
    1111
     12                buddypress()->members->types = array();
    1213                $this->old_current_user = get_current_user_id();
    1314                $this->set_current_user( $this->factory->user->create( array( 'user_login' => 'paulgibbs', 'role' => 'subscriber' ) ) );
    1415        }
    1516
    1617        public function tearDown() {
    17                 parent::tearDown();
    1818                $this->set_current_user( $this->old_current_user );
     19                parent::tearDown();
    1920        }
    2021
    2122        function test_members_directory() {
    class BP_Tests_Routing_Members extends BP_UnitTestCase { 
    2728                $this->go_to( bp_core_get_user_domain( bp_loggedin_user_id() ) );
    2829                $this->assertTrue( bp_is_my_profile() );
    2930        }
     31
     32        /**
     33         * @ticket BP6286
     34         */
     35        public function test_member_directory_with_member_type() {
     36                bp_register_member_type( 'foo' );
     37                $this->go_to( bp_get_members_directory_permalink() . 'foo/' );
     38                $this->assertTrue( bp_is_members_component() );
     39                $this->assertSame( 'foo', get_query_var( 'bp_member_type' ) );
     40        }
     41
     42        /**
     43         * @ticket BP6286
     44         */
     45        public function test_member_directory_with_member_type_that_has_custom_directory_slug() {
     46                bp_register_member_type( 'foo', array( 'has_directory' => 'foos' ) );
     47                $this->go_to( bp_get_members_directory_permalink() . 'foos/' );
     48                $this->assertTrue( bp_is_members_component() );
     49                $this->assertSame( 'foo', get_query_var( 'bp_member_type' ) );
     50        }
     51
     52        /**
     53         * @ticket BP6286
     54         */
     55        public function test_member_directory_with_member_type_should_be_overridden_by_member_with_same_nicename() {
     56                $u = $this->factory->user->create( array( 'user_nicename' => 'foo' ) );
     57                bp_register_member_type( 'foo' );
     58                $this->go_to( bp_get_members_directory_permalink() . 'foo/' );
     59                $this->assertEquals( $u, bp_displayed_user_id() );
     60        }
     61
     62        /**
     63         * @ticket BP6286
     64         */
     65        public function test_member_directory_should_404_for_member_types_that_have_no_directory() {
     66                bp_register_member_type( 'foo', array( 'has_directory' => false ) );
     67                $this->go_to( bp_get_members_directory_permalink() . 'foo/' );
     68                $this->assertTrue( is_404() );
     69        }
    3070}