Make WordPress Core

Changeset 36625


Ignore:
Timestamp:
02/23/2016 02:20:28 AM (10 years ago)
Author:
boonebgorges
Message:

Query: is_*( $int ) should not falsely match strings starting with "$int".

Another chapter in the Storied Annals of Weird in_array() Behavior:
in_array( 4, array( "4-cool-dudes" ) ); resolves to true, such that
is_page( 4 ) was returning true for posts with the name '4-cool-dudes'.

We work around this behavior by ensuring that values passed to the is_
methods are cast to strings before the in_array() checks. ID checks still
work as expected; see #24674.

Props mikejolley, swissspidy, boonebgorges.
Fixes #35902.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/query.php

    r36566 r36625  
    42034203                }
    42044204
    4205                 $attachment = (array) $attachment;
     4205                $attachment = array_map( 'strval', (array) $attachment );
    42064206
    42074207                $post_obj = $this->get_queried_object();
     
    42374237                $author_obj = $this->get_queried_object();
    42384238
    4239                 $author = (array) $author;
     4239                $author = array_map( 'strval', (array) $author );
    42404240
    42414241                if ( in_array( (string) $author_obj->ID, $author ) )
     
    42694269                $cat_obj = $this->get_queried_object();
    42704270
    4271                 $category = (array) $category;
     4271                $category = array_map( 'strval', (array) $category );
    42724272
    42734273                if ( in_array( (string) $cat_obj->term_id, $category ) )
     
    43014301                $tag_obj = $this->get_queried_object();
    43024302
    4303                 $tag = (array) $tag;
     4303                $tag = array_map( 'strval', (array) $tag );
    43044304
    43054305                if ( in_array( (string) $tag_obj->term_id, $tag ) )
     
    45034503                $page_obj = $this->get_queried_object();
    45044504
    4505                 $page = (array) $page;
     4505                $page = array_map( 'strval', (array) $page );
    45064506
    45074507                if ( in_array( (string) $page_obj->ID, $page ) ) {
     
    45964596                $post_obj = $this->get_queried_object();
    45974597
    4598                 $post = (array) $post;
     4598                $post = array_map( 'strval', (array) $post );
    45994599
    46004600                if ( in_array( (string) $post_obj->ID, $post ) ) {
  • trunk/tests/phpunit/tests/query/conditionals.php

    r36138 r36625  
    10181018                $this->assertTrue( is_page_template( array('test.php', 'example.php') ) );
    10191019        }
     1020
     1021        /**
     1022         * @ticket 35902
     1023         */
     1024        public function test_is_attachment_should_not_match_numeric_id_to_post_title_beginning_with_id() {
     1025                $p1 = self::factory()->post->create( array(
     1026                        'post_type' => 'attachment',
     1027                        'post_title' => 'Foo',
     1028                        'post_name' => 'foo',
     1029                ) );
     1030                $p2 = self::factory()->post->create( array(
     1031                        'post_type' => 'attachment',
     1032                        'post_title' => "$p1 Foo",
     1033                        'post_name' => 'foo-2',
     1034                ) );
     1035
     1036                $this->go_to( get_permalink( $p2 ) );
     1037
     1038                $this->assertTrue( is_attachment( $p2 ) );
     1039                $this->assertFalse( is_attachment( $p1 ) );
     1040        }
     1041
     1042        /**
     1043         * @ticket 35902
     1044         */
     1045        public function test_is_attachment_should_not_match_numeric_id_to_post_name_beginning_with_id() {
     1046                $p1 = self::factory()->post->create( array(
     1047                        'post_type' => 'attachment',
     1048                        'post_title' => 'Foo',
     1049                        'post_name' => 'foo',
     1050                ) );
     1051                $p2 = self::factory()->post->create( array(
     1052                        'post_type' => 'attachment',
     1053                        'post_title' => 'Foo',
     1054                        'post_name' => "$p1-foo",
     1055                ) );
     1056
     1057                $this->go_to( get_permalink( $p2 ) );
     1058
     1059                $this->assertTrue( is_attachment( $p2 ) );
     1060                $this->assertFalse( is_attachment( $p1 ) );
     1061        }
     1062
     1063        /**
     1064         * @ticket 35902
     1065         */
     1066        public function test_is_author_should_not_match_numeric_id_to_nickname_beginning_with_id() {
     1067                $u1 = self::factory()->user->create( array(
     1068                        'nickname' => 'Foo',
     1069                        'user_nicename' => 'foo',
     1070                ) );
     1071                $u2 = self::factory()->user->create( array(
     1072                        'nickname' => "$u1 Foo",
     1073                        'user_nicename' => 'foo-2',
     1074                ) );
     1075
     1076                $this->go_to( get_author_posts_url( $u2 ) );
     1077
     1078                $this->assertTrue( is_author( $u2 ) );
     1079                $this->assertFalse( is_author( $u1 ) );
     1080        }
     1081
     1082        /**
     1083         * @ticket 35902
     1084         */
     1085        public function test_is_author_should_not_match_numeric_id_to_user_nicename_beginning_with_id() {
     1086                $u1 = self::factory()->user->create( array(
     1087                        'nickname' => 'Foo',
     1088                        'user_nicename' => 'foo',
     1089                ) );
     1090                $u2 = self::factory()->user->create( array(
     1091                        'nickname' => 'Foo',
     1092                        'user_nicename' => "$u1-foo",
     1093                ) );
     1094
     1095                $this->go_to( get_author_posts_url( $u2 ) );
     1096
     1097                $this->assertTrue( is_author( $u2 ) );
     1098                $this->assertFalse( is_author( $u1 ) );
     1099        }
     1100
     1101        /**
     1102         * @ticket 35902
     1103         */
     1104        public function test_is_category_should_not_match_numeric_id_to_name_beginning_with_id() {
     1105                $t1 = self::factory()->term->create( array(
     1106                        'taxonomy' => 'category',
     1107                        'slug' => 'foo',
     1108                        'name' => 'foo',
     1109                ) );
     1110                $t2 = self::factory()->term->create( array(
     1111                        'taxonomy' => 'category',
     1112                        'slug' => "$t1-foo",
     1113                        'name' => 'foo 2',
     1114                ) );
     1115
     1116                $this->go_to( get_term_link( $t2 ) );
     1117
     1118                $this->assertTrue( is_category( $t2 ) );
     1119                $this->assertFalse( is_category( $t1 ) );
     1120        }
     1121
     1122        /**
     1123         * @ticket 35902
     1124         */
     1125        public function test_is_category_should_not_match_numeric_id_to_slug_beginning_with_id() {
     1126                $t1 = self::factory()->term->create( array(
     1127                        'taxonomy' => 'category',
     1128                        'slug' => 'foo',
     1129                        'name' => 'foo',
     1130                ) );
     1131                $t2 = self::factory()->term->create( array(
     1132                        'taxonomy' => 'category',
     1133                        'slug' => 'foo-2',
     1134                        'name' => "$t1 foo",
     1135                ) );
     1136
     1137                $this->go_to( get_term_link( $t2 ) );
     1138
     1139                $this->assertTrue( is_category( $t2 ) );
     1140                $this->assertFalse( is_category( $t1 ) );
     1141        }
     1142
     1143        /**
     1144         * @ticket 35902
     1145         */
     1146        public function test_is_tag_should_not_match_numeric_id_to_name_beginning_with_id() {
     1147                $t1 = self::factory()->term->create( array(
     1148                        'taxonomy' => 'post_tag',
     1149                        'slug' => 'foo',
     1150                        'name' => 'foo',
     1151                ) );
     1152                $t2 = self::factory()->term->create( array(
     1153                        'taxonomy' => 'post_tag',
     1154                        'slug' => "$t1-foo",
     1155                        'name' => 'foo 2',
     1156                ) );
     1157
     1158                $this->go_to( get_term_link( $t2 ) );
     1159
     1160                $this->assertTrue( is_tag( $t2 ) );
     1161                $this->assertFalse( is_tag( $t1 ) );
     1162        }
     1163
     1164        /**
     1165         * @ticket 35902
     1166         */
     1167        public function test_is_tag_should_not_match_numeric_id_to_slug_beginning_with_id() {
     1168                $t1 = self::factory()->term->create( array(
     1169                        'taxonomy' => 'post_tag',
     1170                        'slug' => 'foo',
     1171                        'name' => 'foo',
     1172                ) );
     1173                $t2 = self::factory()->term->create( array(
     1174                        'taxonomy' => 'post_tag',
     1175                        'slug' => 'foo-2',
     1176                        'name' => "$t1 foo",
     1177                ) );
     1178
     1179                $this->go_to( get_term_link( $t2 ) );
     1180
     1181                $this->assertTrue( is_tag( $t2 ) );
     1182                $this->assertFalse( is_tag( $t1 ) );
     1183        }
     1184
     1185        /**
     1186         * @ticket 35902
     1187         */
     1188        public function test_is_page_should_not_match_numeric_id_to_post_title_beginning_with_id() {
     1189                $p1 = self::factory()->post->create( array(
     1190                        'post_type' => 'page',
     1191                        'post_title' => 'Foo',
     1192                        'post_name' => 'foo',
     1193                ) );
     1194                $p2 = self::factory()->post->create( array(
     1195                        'post_type' => 'page',
     1196                        'post_title' => "$p1 Foo",
     1197                        'post_name' => 'foo-2',
     1198                ) );
     1199
     1200                $this->go_to( get_permalink( $p2 ) );
     1201
     1202                $this->assertTrue( is_page( $p2 ) );
     1203                $this->assertFalse( is_page( $p1 ) );
     1204        }
     1205
     1206        /**
     1207         * @ticket 35902
     1208         */
     1209        public function test_is_page_should_not_match_numeric_id_to_post_name_beginning_with_id() {
     1210                $p1 = self::factory()->post->create( array(
     1211                        'post_type' => 'page',
     1212                        'post_title' => 'Foo',
     1213                        'post_name' => 'foo',
     1214                ) );
     1215                $p2 = self::factory()->post->create( array(
     1216                        'post_type' => 'page',
     1217                        'post_title' => 'Foo',
     1218                        'post_name' => "$p1-foo",
     1219                ) );
     1220
     1221                $this->go_to( get_permalink( $p2 ) );
     1222
     1223                $this->assertTrue( is_page( $p2 ) );
     1224                $this->assertFalse( is_page( $p1 ) );
     1225        }
     1226
     1227        /**
     1228         * @ticket 35902
     1229         */
     1230        public function test_is_single_should_not_match_numeric_id_to_post_title_beginning_with_id() {
     1231                $p1 = self::factory()->post->create( array(
     1232                        'post_type' => 'post',
     1233                        'post_title' => 'Foo',
     1234                        'post_name' => 'foo',
     1235                ) );
     1236                $p2 = self::factory()->post->create( array(
     1237                        'post_type' => 'post',
     1238                        'post_title' => "$p1 Foo",
     1239                        'post_name' => 'foo-2',
     1240                ) );
     1241
     1242                $this->go_to( get_permalink( $p2 ) );
     1243
     1244                $this->assertTrue( is_single( $p2 ) );
     1245                $this->assertFalse( is_single( $p1 ) );
     1246        }
     1247
     1248        /**
     1249         * @ticket 35902
     1250         */
     1251        public function test_is_single_should_not_match_numeric_id_to_post_name_beginning_with_id() {
     1252                $p1 = self::factory()->post->create( array(
     1253                        'post_type' => 'post',
     1254                        'post_title' => 'Foo',
     1255                        'post_name' => 'foo',
     1256                ) );
     1257                $p2 = self::factory()->post->create( array(
     1258                        'post_type' => 'post',
     1259                        'post_title' => 'Foo',
     1260                        'post_name' => "$p1-foo",
     1261                ) );
     1262
     1263                $this->go_to( get_permalink( $p2 ) );
     1264
     1265                $this->assertTrue( is_single( $p2 ) );
     1266                $this->assertFalse( is_single( $p1 ) );
     1267        }
    10201268}
Note: See TracChangeset for help on using the changeset viewer.