WordPress.org

Make WordPress Core

Changeset 36625


Ignore:
Timestamp:
02/23/16 02:20:28 (21 months 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.