Make WordPress Core


Ignore:
Timestamp:
10/06/2015 05:39:23 PM (11 years ago)
Author:
boonebgorges
Message:

Improve role-related arguments in WP_User_Query.

  • 'role' now accepts an array or comma-separated list of role names. When passing multiple values for 'role', WP_User_Query will only match users that have all of the specified roles.
  • 'rolein' accepts an array of role names, and allow the filtering of matched users to those with at least one of the specified roles.
  • 'rolenot_in' accepts an array of role names, and allows the filtering of matched users to those who have none of the specified roles.

Props swissspidy, mordauk, barrykooij, sirbrillig.
Fixes #22212.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/user/query.php

    r34804 r34875  
    897897                }
    898898        }
     899
     900        /**
     901         * @ticket 22212
     902         */
     903        public function test_get_single_role_by_user_query() {
     904                $this->factory->user->create_many( 2, array(
     905                        'role' => 'subscriber',
     906                ) );
     907
     908                $this->factory->user->create( array(
     909                        'role' => 'contributor',
     910                ) );
     911
     912                $wp_user_search = new WP_User_Query( array( 'role' => 'subscriber' ) );
     913                $users          = $wp_user_search->get_results();
     914
     915                $this->assertEquals( 2, count( $users ) );
     916        }
     917
     918        /**
     919         * @ticket 22212
     920         */
     921        public function test_get_multiple_roles_by_user_query() {
     922                $this->factory->user->create_many( 2, array(
     923                        'role' => 'subscriber',
     924                ) );
     925
     926                $this->factory->user->create_many( 3, array(
     927                        'role' => 'editor',
     928                ) );
     929
     930                $this->factory->user->create( array(
     931                        'role' => 'contributor',
     932                ) );
     933
     934                $wp_user_search = new WP_User_Query( array( 'role__in' => array( 'subscriber', 'editor' ) ) );
     935                $users          = $wp_user_search->get_results();
     936                $this->assertEquals( 5, count( $users ) );
     937        }
     938
     939        /**
     940         * @ticket 22212
     941         */
     942        public function test_get_single_role_by_string() {
     943                $this->factory->user->create_many( 2, array(
     944                        'role' => 'subscriber',
     945                ) );
     946
     947                $this->factory->user->create( array(
     948                        'role' => 'contributor',
     949                ) );
     950
     951                $users = get_users( array(
     952                        'role' => 'subscriber',
     953                ) );
     954
     955                $this->assertEquals( 2, count( $users ) );
     956        }
     957
     958        /**
     959         * @ticket 22212
     960         */
     961        public function test_get_single_role_by_array() {
     962                $this->factory->user->create_many( 2, array(
     963                        'role' => 'subscriber',
     964                ) );
     965
     966                $this->factory->user->create( array(
     967                        'role' => 'contributor',
     968                ) );
     969
     970                $users = get_users( array(
     971                        'role' => array( 'subscriber' ),
     972                ) );
     973
     974                $this->assertEquals( 2, count( $users ) );
     975        }
     976
     977        /**
     978         * @ticket 22212
     979         */
     980        public function test_get_multiple_roles_should_only_match_users_who_have_each_role() {
     981                $subscribers = $this->factory->user->create_many( 2, array(
     982                        'role' => 'subscriber',
     983                ) );
     984
     985                $this->factory->user->create_many( 3, array(
     986                        'role' => 'editor',
     987                ) );
     988
     989                $this->factory->user->create_many( 2, array(
     990                        'role' => 'administrator',
     991                ) );
     992
     993                $users = new WP_User_Query( array( 'role' => array( 'subscriber', 'editor' ) ) );
     994                $users = $users->get_results();
     995
     996                $this->assertEmpty( $users );
     997
     998                foreach ( $subscribers as $subscriber ) {
     999                        $subscriber = get_user_by( 'ID', $subscriber );
     1000                        $subscriber->add_role( 'editor' );
     1001                }
     1002
     1003                $users = new WP_User_Query( array( 'role' => array( 'subscriber', 'editor' ) ) );
     1004                $users = $users->get_results();
     1005
     1006                $this->assertEquals( 2, count( $users ) );
     1007
     1008                foreach ( $users as $user ) {
     1009                        $this->assertInstanceOf( 'WP_User', $user );
     1010                }
     1011        }
     1012
     1013        /**
     1014         * @ticket 22212
     1015         */
     1016        public function test_get_multiple_roles_or() {
     1017                $this->factory->user->create_many( 2, array(
     1018                        'role' => 'subscriber',
     1019                ) );
     1020
     1021                $this->factory->user->create_many( 3, array(
     1022                        'role' => 'editor',
     1023                ) );
     1024
     1025                $this->factory->user->create_many( 2, array(
     1026                        'role' => 'administrator',
     1027                ) );
     1028
     1029                $this->factory->user->create_many( 1, array(
     1030                        'role' => 'contributor',
     1031                ) );
     1032
     1033                $users = new WP_User_Query( array( 'role__in' => array( 'subscriber', 'editor', 'administrator' ) ) );
     1034                $users = $users->get_results();
     1035
     1036                // +1 for the default user created during installation.
     1037                $this->assertEquals( 8, count( $users ) );
     1038                foreach ( $users as $user ) {
     1039                        $this->assertInstanceOf( 'WP_User', $user );
     1040                }
     1041        }
     1042
     1043        /**
     1044         * @ticket 22212
     1045         */
     1046        public function test_get_multiple_roles_by_comma_separated_list() {
     1047                $subscribers = $this->factory->user->create_many( 2, array(
     1048                        'role' => 'subscriber',
     1049                ) );
     1050
     1051                $this->factory->user->create_many( 3, array(
     1052                        'role' => 'editor',
     1053                ) );
     1054
     1055                $users = get_users( array(
     1056                        'role' => 'subscriber, editor',
     1057                ) );
     1058
     1059                $this->assertEmpty( $users );
     1060
     1061                foreach ( $subscribers as $subscriber ) {
     1062                        $subscriber = get_user_by( 'ID', $subscriber );
     1063                        $subscriber->add_role( 'editor' );
     1064                }
     1065
     1066                $users = get_users( array(
     1067                        'role' => 'subscriber, editor',
     1068                ) );
     1069
     1070                $this->assertEquals( 2, count( $users ) );
     1071        }
     1072
     1073        /**
     1074         * @ticket 22212
     1075         */
     1076        public function test_get_multiple_roles_with_meta() {
     1077                // Create administrator user + meta
     1078                $administrator_id = $this->factory->user->create( array( 'role' => 'administrator' ) );
     1079                update_user_meta( $administrator_id, 'mk1', 1 );
     1080                update_user_meta( $administrator_id, 'mk2', 1 );
     1081
     1082                // Create editor user + meta
     1083                $editor_id = $this->factory->user->create( array( 'role' => 'editor' ) );
     1084                update_user_meta( $editor_id, 'mk1', 1 );
     1085                update_user_meta( $editor_id, 'mk2', 2 );
     1086
     1087                // Create subscriber user + meta
     1088                $subscriber_id = $this->factory->user->create( array( 'role' => 'subscriber' ) );
     1089                update_user_meta( $subscriber_id, 'mk1', 1 );
     1090                update_user_meta( $subscriber_id, 'mk2', 1 );
     1091
     1092                // Create contributor user + meta
     1093                $contributor_id = $this->factory->user->create( array( 'role' => 'contributor' ) );
     1094                update_user_meta( $contributor_id, 'mk1', 1 );
     1095                update_user_meta( $contributor_id, 'mk2', 2 );
     1096
     1097                // Fetch users
     1098                $users = get_users( array(
     1099                        'role__in'   => array( 'administrator', 'editor', 'subscriber' ),
     1100                        'meta_query' => array(
     1101                                'relation' => 'AND',
     1102                                array(
     1103                                        'key'     => 'mk1',
     1104                                        'value'   => '1',
     1105                                        'compare' => "=",
     1106                                        'type'    => 'numeric',
     1107                                ),
     1108                                array(
     1109                                        'key'     => 'mk2',
     1110                                        'value'   => '2',
     1111                                        'compare' => "=",
     1112                                        'type'    => 'numeric',
     1113                                ),
     1114                        ),
     1115                ) );
     1116
     1117                // Check results
     1118                $this->assertEquals( 1, count( $users ) );
     1119                $this->assertSame( $editor_id, (int) $users[0]->ID );
     1120        }
     1121
     1122        /**
     1123         * @ticket 22212
     1124         */
     1125        public function test_role_exclusion() {
     1126                $this->factory->user->create_many( 2, array(
     1127                        'role' => 'subscriber',
     1128                ) );
     1129
     1130                $this->factory->user->create_many( 3, array(
     1131                        'role' => 'editor',
     1132                ) );
     1133
     1134                $users = get_users( array(
     1135                        'role__not_in' => 'subscriber',
     1136                ) );
     1137
     1138                // +1 for the default user created during installation.
     1139                $this->assertEquals( 4, count( $users ) );
     1140
     1141                $users = get_users( array(
     1142                        'role__not_in' => 'editor',
     1143                ) );
     1144
     1145                // +1 for the default user created during installation.
     1146                $this->assertEquals( 3, count( $users ) );
     1147        }
     1148
     1149        /**
     1150         * @ticket 22212
     1151         */
     1152        public function test_role__in_role__not_in_combined() {
     1153                $subscribers = $this->factory->user->create_many( 2, array(
     1154                        'role' => 'subscriber',
     1155                ) );
     1156
     1157                $this->factory->user->create_many( 3, array(
     1158                        'role' => 'editor',
     1159                ) );
     1160
     1161                foreach ( $subscribers as $subscriber ) {
     1162                        $subscriber = get_user_by( 'ID', $subscriber );
     1163                        $subscriber->add_role( 'editor' );
     1164                }
     1165
     1166                $users = get_users( array(
     1167                        'role__in'     => 'editor',
     1168                ) );
     1169
     1170                $this->assertEquals( 5, count( $users ) );
     1171
     1172                $users = get_users( array(
     1173                        'role__in'     => 'editor',
     1174                        'role__not_in' => 'subscriber',
     1175                ) );
     1176
     1177                $this->assertEquals( 3, count( $users ) );
     1178        }
     1179
     1180        /**
     1181         * @ticket 22212
     1182         */
     1183        public function test_role__not_in_role_combined() {
     1184                $subscribers = $this->factory->user->create_many( 2, array(
     1185                        'role' => 'subscriber',
     1186                ) );
     1187
     1188                $this->factory->user->create_many( 3, array(
     1189                        'role' => 'editor',
     1190                ) );
     1191
     1192                $subscriber = get_user_by( 'ID', $subscribers[0] );
     1193                $subscriber->add_role( 'editor' );
     1194
     1195                $users = get_users( array(
     1196                        'role'         => 'subscriber',
     1197                        'role__not_in' => array( 'editor' ),
     1198                ) );
     1199
     1200                $this->assertEquals( 1, count( $users ) );
     1201        }
     1202
     1203        /**
     1204         * @ticket 22212
     1205         */
     1206        public function test_role__not_in_user_without_role() {
     1207                $user_without_rule = $this->factory->user->get_object_by_id( $this->factory->user->create( array(
     1208                        'role' => 'subscriber',
     1209                ) ) );
     1210
     1211                $user_without_rule->remove_role( 'subscriber' );
     1212
     1213                $this->factory->user->create_many( 3, array(
     1214                        'role' => 'editor',
     1215                ) );
     1216
     1217                $users = get_users( array(
     1218                        'role__not_in' => 'subscriber',
     1219                ) );
     1220
     1221                // +1 for the default user created during installation.
     1222                $this->assertEquals( 5, count( $users ) );
     1223
     1224                $users = get_users( array(
     1225                        'role__not_in' => 'editor',
     1226                ) );
     1227
     1228                // +1 for the default user created during installation.
     1229                $this->assertEquals( 2, count( $users ) );
     1230        }
    8991231}
Note: See TracChangeset for help on using the changeset viewer.