query.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. <?php
  2. /**
  3. * @group meta
  4. */
  5. class Tests_Post_Query extends WP_UnitTestCase {
  6. function setUp() {
  7. parent::setUp();
  8. }
  9. function test_meta_key_or_query() {
  10. $post_id = $this->factory->post->create();
  11. add_post_meta( $post_id, 'foo', rand_str() );
  12. add_post_meta( $post_id, 'foo', rand_str() );
  13. $post_id2 = $this->factory->post->create();
  14. add_post_meta( $post_id2, 'bar', 'val2' );
  15. $post_id3 = $this->factory->post->create();
  16. add_post_meta( $post_id3, 'baz', rand_str() );
  17. $post_id4 = $this->factory->post->create();
  18. add_post_meta( $post_id4, 'froo', rand_str() );
  19. $post_id5 = $this->factory->post->create();
  20. add_post_meta( $post_id5, 'tango', 'val2' );
  21. $post_id6 = $this->factory->post->create();
  22. add_post_meta( $post_id6, 'bar', 'val1' );
  23. $query = new WP_Query( array(
  24. 'meta_query' => array(
  25. array(
  26. 'key' => 'foo'
  27. ),
  28. array(
  29. 'key' => 'bar',
  30. 'value' => 'val2'
  31. ),
  32. array(
  33. 'key' => 'baz'
  34. ),
  35. array(
  36. 'key' => 'froo'
  37. ),
  38. 'relation' => 'OR',
  39. ),
  40. ) );
  41. $posts = $query->get_posts();
  42. $this->assertEquals( 4, count( $posts ) );
  43. foreach ( $posts as $post ) {
  44. $this->assertInstanceOf( 'WP_Post', $post );
  45. $this->assertEquals( 'raw', $post->filter );
  46. }
  47. $post_ids = wp_list_pluck( $posts, 'ID' );
  48. $this->assertEqualSets( array( $post_id, $post_id2, $post_id3, $post_id4 ), $post_ids );
  49. }
  50. function test_meta_key_and_query() {
  51. $post_id = $this->factory->post->create();
  52. add_post_meta( $post_id, 'foo', rand_str() );
  53. add_post_meta( $post_id, 'foo', rand_str() );
  54. $post_id2 = $this->factory->post->create();
  55. add_post_meta( $post_id2, 'bar', 'val2' );
  56. add_post_meta( $post_id2, 'foo', rand_str() );
  57. $post_id3 = $this->factory->post->create();
  58. add_post_meta( $post_id3, 'baz', rand_str() );
  59. $post_id4 = $this->factory->post->create();
  60. add_post_meta( $post_id4, 'froo', rand_str() );
  61. $post_id5 = $this->factory->post->create();
  62. add_post_meta( $post_id5, 'tango', 'val2' );
  63. $post_id6 = $this->factory->post->create();
  64. add_post_meta( $post_id6, 'bar', 'val1' );
  65. add_post_meta( $post_id6, 'foo', rand_str() );
  66. $post_id7 = $this->factory->post->create();
  67. add_post_meta( $post_id7, 'foo', rand_str() );
  68. add_post_meta( $post_id7, 'froo', rand_str() );
  69. add_post_meta( $post_id7, 'baz', rand_str() );
  70. add_post_meta( $post_id7, 'bar', 'val2' );
  71. $query = new WP_Query( array(
  72. 'meta_query' => array(
  73. array(
  74. 'key' => 'foo'
  75. ),
  76. array(
  77. 'key' => 'bar',
  78. 'value' => 'val2'
  79. ),
  80. array(
  81. 'key' => 'baz'
  82. ),
  83. array(
  84. 'key' => 'froo'
  85. ),
  86. 'relation' => 'AND',
  87. ),
  88. ) );
  89. $posts = $query->get_posts();
  90. $this->assertEquals( 1, count( $posts ) );
  91. foreach ( $posts as $post ) {
  92. $this->assertInstanceOf( 'WP_Post', $post );
  93. $this->assertEquals( 'raw', $post->filter );
  94. }
  95. $post_ids = wp_list_pluck( $posts, 'ID' );
  96. $this->assertEquals( array( $post_id7 ), $post_ids );
  97. $query = new WP_Query( array(
  98. 'meta_query' => array(
  99. array(
  100. 'key' => 'foo'
  101. ),
  102. array(
  103. 'key' => 'bar',
  104. ),
  105. 'relation' => 'AND',
  106. ),
  107. ) );
  108. $posts = $query->get_posts();
  109. $this->assertEquals( 3, count( $posts ) );
  110. foreach ( $posts as $post ) {
  111. $this->assertInstanceOf( 'WP_Post', $post );
  112. $this->assertEquals( 'raw', $post->filter );
  113. }
  114. $post_ids = wp_list_pluck( $posts, 'ID' );
  115. $this->assertEqualSets( array( $post_id2, $post_id6, $post_id7 ), $post_ids );
  116. }
  117. /**
  118. * @ticket 18158
  119. */
  120. function test_meta_key_not_exists() {
  121. $post_id = $this->factory->post->create();
  122. add_post_meta( $post_id, 'foo', rand_str() );
  123. $post_id2 = $this->factory->post->create();
  124. add_post_meta( $post_id2, 'bar', rand_str() );
  125. $post_id3 = $this->factory->post->create();
  126. add_post_meta( $post_id3, 'bar', rand_str() );
  127. $post_id4 = $this->factory->post->create();
  128. add_post_meta( $post_id4, 'baz', rand_str() );
  129. $post_id5 = $this->factory->post->create();
  130. add_post_meta( $post_id5, 'foo', rand_str() );
  131. $query = new WP_Query( array(
  132. 'meta_query' => array(
  133. array(
  134. 'key' => 'foo',
  135. 'compare' => 'NOT EXISTS',
  136. ),
  137. ),
  138. ) );
  139. $posts = $query->get_posts();
  140. $this->assertEquals( 3, count( $posts ) );
  141. foreach ( $posts as $post ) {
  142. $this->assertInstanceOf( 'WP_Post', $post );
  143. $this->assertEquals( 'raw', $post->filter );
  144. }
  145. $query = new WP_Query( array(
  146. 'meta_query' => array(
  147. array(
  148. 'key' => 'foo',
  149. 'compare' => 'NOT EXISTS',
  150. ),
  151. array(
  152. 'key' => 'bar',
  153. 'compare' => 'NOT EXISTS',
  154. ),
  155. ),
  156. ) );
  157. $posts = $query->get_posts();
  158. $this->assertEquals( 1, count( $posts ) );
  159. foreach ( $posts as $post ) {
  160. $this->assertInstanceOf( 'WP_Post', $post );
  161. $this->assertEquals( 'raw', $post->filter );
  162. }
  163. $query = new WP_Query( array(
  164. 'meta_query' => array(
  165. array(
  166. 'key' => 'foo',
  167. 'compare' => 'NOT EXISTS',
  168. ),
  169. array(
  170. 'key' => 'bar',
  171. 'compare' => 'NOT EXISTS',
  172. ),
  173. array(
  174. 'key' => 'baz',
  175. 'compare' => 'NOT EXISTS',
  176. ),
  177. )
  178. ) );
  179. $posts = $query->get_posts();
  180. $this->assertEquals( 0, count( $posts ) );
  181. }
  182. /**
  183. * @ticket 23033
  184. */
  185. function test_meta_query_decimal_results() {
  186. $post_1 = $this->factory->post->create();
  187. $post_2 = $this->factory->post->create();
  188. $post_3 = $this->factory->post->create();
  189. $post_4 = $this->factory->post->create();
  190. update_post_meta( $post_1, 'decimal_value', '-0.3' );
  191. update_post_meta( $post_2, 'decimal_value', '0.23409844' );
  192. update_post_meta( $post_3, 'decimal_value', '0.3' );
  193. update_post_meta( $post_4, 'decimal_value', '0.4' );
  194. $query = new WP_Query( array(
  195. 'meta_query' => array(
  196. array(
  197. 'key' => 'decimal_value',
  198. 'value' => '.300',
  199. 'compare' => '=',
  200. 'type' => 'DECIMAL(10,2)'
  201. )
  202. ),
  203. ) );
  204. $this->assertEqualSets( array( $post_3 ), wp_list_pluck( $query->posts, 'ID' ) );
  205. $query = new WP_Query( array(
  206. 'meta_query' => array(
  207. array(
  208. 'key' => 'decimal_value',
  209. 'value' => '0.35',
  210. 'compare' => '>',
  211. 'type' => 'DECIMAL(10,2)'
  212. )
  213. ),
  214. ) );
  215. $this->assertEqualSets( array( $post_4 ), wp_list_pluck( $query->posts, 'ID' ) );
  216. $query = new WP_Query( array(
  217. 'meta_query' => array(
  218. array(
  219. 'key' => 'decimal_value',
  220. 'value' => '0.3',
  221. 'compare' => '>=',
  222. 'type' => 'DECIMAL(10,2)'
  223. )
  224. ),
  225. ) );
  226. $this->assertEqualSets( array( $post_3, $post_4 ), wp_list_pluck( $query->posts, 'ID' ) );
  227. $query = new WP_Query( array(
  228. 'meta_query' => array(
  229. array(
  230. 'key' => 'decimal_value',
  231. 'value' => '0',
  232. 'compare' => '<',
  233. 'type' => 'DECIMAL(10,2)'
  234. )
  235. ),
  236. ) );
  237. $this->assertEqualSets( array( $post_1 ), wp_list_pluck( $query->posts, 'ID' ) );
  238. $query = new WP_Query( array(
  239. 'meta_query' => array(
  240. array(
  241. 'key' => 'decimal_value',
  242. 'value' => '0.3',
  243. 'compare' => '<=',
  244. 'type' => 'DECIMAL(10,2)'
  245. )
  246. ),
  247. ) );
  248. $this->assertEqualSets( array( $post_1, $post_2, $post_3 ), wp_list_pluck( $query->posts, 'ID' ) );
  249. $query = new WP_Query( array(
  250. 'meta_query' => array(
  251. array(
  252. 'key' => 'decimal_value',
  253. 'value' => array( 0.23409845, .31 ),
  254. 'compare' => 'BETWEEN',
  255. 'type' => 'DECIMAL(10, 10)'
  256. )
  257. ),
  258. ) );
  259. $this->assertEqualSets( array( $post_3 ), wp_list_pluck( $query->posts, 'ID' ) );
  260. $query = new WP_Query( array(
  261. 'meta_query' => array(
  262. array(
  263. 'key' => 'decimal_value',
  264. 'value' => array( 0.23409845, .31 ),
  265. 'compare' => 'NOT BETWEEN',
  266. 'type' => 'DECIMAL(10,10)'
  267. )
  268. ),
  269. ) );
  270. $this->assertEqualSets( array( $post_1, $post_2, $post_4 ), wp_list_pluck( $query->posts, 'ID' ) );
  271. $query = new WP_Query( array(
  272. 'meta_query' => array(
  273. array(
  274. 'key' => 'decimal_value',
  275. 'value' => '.3',
  276. 'compare' => 'LIKE',
  277. 'type' => 'DECIMAL(10,2)'
  278. )
  279. ),
  280. ) );
  281. $this->assertEqualSets( array( $post_1, $post_3 ), wp_list_pluck( $query->posts, 'ID' ) );
  282. $query = new WP_Query( array(
  283. 'meta_query' => array(
  284. array(
  285. 'key' => 'decimal_value',
  286. 'value' => '.3',
  287. 'compare' => 'NOT LIKE',
  288. 'type' => 'DECIMAL(10,2)'
  289. )
  290. ),
  291. ) );
  292. $this->assertEqualSets( array( $post_2, $post_4 ), wp_list_pluck( $query->posts, 'ID' ) );
  293. $query = new WP_Query( array(
  294. 'orderby' => 'meta_value',
  295. 'order' => 'DESC',
  296. 'meta_key' => 'decimal_value',
  297. 'meta_type' => 'DECIMAL(10, 2)'
  298. ) );
  299. $this->assertEqualSets( array( $post_4, $post_3, $post_2, $post_1 ), wp_list_pluck( $query->posts, 'ID' ) );
  300. }
  301. /**
  302. * @ticket 20604
  303. */
  304. function test_taxonomy_empty_or() {
  305. // An empty tax query should return an empty array, not all posts.
  306. $this->factory->post->create_many( 10 );
  307. $query = new WP_Query( array(
  308. 'fields' => 'ids',
  309. 'tax_query' => array(
  310. 'relation' => 'OR',
  311. array(
  312. 'taxonomy' => 'post_tag',
  313. 'field' => 'id',
  314. 'terms' => false,
  315. 'operator' => 'IN'
  316. ),
  317. array(
  318. 'taxonomy' => 'category',
  319. 'field' => 'id',
  320. 'terms' => false,
  321. 'operator' => 'IN'
  322. )
  323. )
  324. ) );
  325. $posts = $query->get_posts();
  326. $this->assertEquals( 0 , count( $posts ) );
  327. }
  328. function test_meta_between_not_between() {
  329. $post_id = $this->factory->post->create();
  330. add_post_meta( $post_id, 'time', 500 );
  331. $post_id2 = $this->factory->post->create();
  332. add_post_meta( $post_id2, 'time', 1001 );
  333. $post_id3 = $this->factory->post->create();
  334. add_post_meta( $post_id3, 'time', 0 );
  335. $post_id4 = $this->factory->post->create();
  336. add_post_meta( $post_id4, 'time', 1 );
  337. $post_id5 = $this->factory->post->create();
  338. add_post_meta( $post_id5, 'time', 1000 );
  339. $args = array(
  340. 'meta_key' => 'time',
  341. 'meta_value' => array( 1, 1000 ),
  342. 'meta_type' => 'numeric',
  343. 'meta_compare' => 'NOT BETWEEN'
  344. );
  345. $query = new WP_Query( $args );
  346. $this->assertEquals( 2, count ( $query->posts ) );
  347. foreach ( $query->posts as $post ) {
  348. $this->assertInstanceOf( 'WP_Post', $post );
  349. $this->assertEquals( 'raw', $post->filter );
  350. }
  351. $posts = wp_list_pluck( $query->posts, 'ID' );
  352. $this->assertEqualSets( array( $post_id2, $post_id3 ), $posts );
  353. $args = array(
  354. 'meta_key' => 'time',
  355. 'meta_value' => array( 1, 1000 ),
  356. 'meta_type' => 'numeric',
  357. 'meta_compare' => 'BETWEEN'
  358. );
  359. $query = new WP_Query( $args );
  360. $this->assertEquals( 3, count ( $query->posts ) );
  361. foreach ( $query->posts as $post ) {
  362. $this->assertInstanceOf( 'WP_Post', $post );
  363. $this->assertEquals( 'raw', $post->filter );
  364. }
  365. $posts = wp_list_pluck( $query->posts, 'ID' );
  366. $this->assertEqualSets( array( $post_id, $post_id4, $post_id5 ), $posts );
  367. }
  368. /**
  369. * @ticket 16829
  370. */
  371. function test_meta_default_compare() {
  372. // compare should default to IN when meta_value is an array
  373. $post_id = $this->factory->post->create();
  374. add_post_meta( $post_id, 'foo', 'bar' );
  375. $post_id2 = $this->factory->post->create();
  376. add_post_meta( $post_id2, 'bar', 'baz' );
  377. $post_id3 = $this->factory->post->create();
  378. add_post_meta( $post_id3, 'foo', 'baz' );
  379. $post_id4 = $this->factory->post->create();
  380. add_post_meta( $post_id4, 'baz', 'bar' );
  381. $post_id5 = $this->factory->post->create();
  382. add_post_meta( $post_id5, 'foo', rand_str() );
  383. $posts = get_posts( array(
  384. 'meta_key' => 'foo',
  385. 'meta_value' => array( 'bar', 'baz' )
  386. ) );
  387. $this->assertEquals( 2, count( $posts ) );
  388. $posts = wp_list_pluck( $posts, 'ID' );
  389. $this->assertEqualSets( array( $post_id, $post_id3 ), $posts );
  390. $posts = get_posts( array(
  391. 'meta_key' => 'foo',
  392. 'meta_value' => array( 'bar', 'baz' ),
  393. 'meta_compare' => 'IN'
  394. ) );
  395. $this->assertEquals( 2, count( $posts ) );
  396. foreach ( $posts as $post ) {
  397. $this->assertInstanceOf( 'WP_Post', $post );
  398. $this->assertEquals( 'raw', $post->filter );
  399. }
  400. $posts = wp_list_pluck( $posts, 'ID' );
  401. $this->assertEqualSets( array( $post_id, $post_id3 ), $posts );
  402. }
  403. /**
  404. * @ticket 17264
  405. */
  406. function test_duplicate_posts_when_no_key() {
  407. $post_id = $this->factory->post->create();
  408. add_post_meta( $post_id, 'city', 'Lorem' );
  409. add_post_meta( $post_id, 'address', '123 Lorem St.' );
  410. $post_id2 = $this->factory->post->create();
  411. add_post_meta( $post_id2, 'city', 'Lorem' );
  412. $post_id3 = $this->factory->post->create();
  413. add_post_meta( $post_id3, 'city', 'Loren' );
  414. $args = array(
  415. 'meta_query' => array(
  416. array(
  417. 'value' => 'lorem',
  418. 'compare' => 'LIKE'
  419. )
  420. )
  421. );
  422. $posts = get_posts( $args );
  423. $this->assertEquals( 2, count( $posts ) );
  424. foreach ( $posts as $post ) {
  425. $this->assertInstanceOf( 'WP_Post', $post );
  426. $this->assertEquals( 'raw', $post->filter );
  427. }
  428. $posts = wp_list_pluck( $posts, 'ID' );
  429. $this->assertEqualSets( array( $post_id, $post_id2 ), $posts );
  430. }
  431. /**
  432. * @ticket 15292
  433. */
  434. function test_empty_meta_value() {
  435. $post_id = $this->factory->post->create();
  436. add_post_meta( $post_id, 'foo', '0' );
  437. add_post_meta( $post_id, 'bar', 0 );
  438. $post_id2 = $this->factory->post->create();
  439. add_post_meta( $post_id2, 'foo', 1 );
  440. $post_id3 = $this->factory->post->create();
  441. add_post_meta( $post_id3, 'baz', 0 );
  442. $post_id4 = $this->factory->post->create();
  443. add_post_meta( $post_id4, 'baz', 0 );
  444. $post_id5 = $this->factory->post->create();
  445. add_post_meta( $post_id5, 'baz', 0 );
  446. add_post_meta( $post_id5, 'bar', '0' );
  447. $post_id6 = $this->factory->post->create();
  448. add_post_meta( $post_id6, 'baz', 0 );
  449. $posts = get_posts( array( 'meta_key' => 'foo', 'meta_value' => '0' ) );
  450. $this->assertEquals( 1, count ( $posts ) );
  451. foreach ( $posts as $post ) {
  452. $this->assertInstanceOf( 'WP_Post', $post );
  453. $this->assertEquals( 'raw', $post->filter );
  454. }
  455. $this->assertEquals( $post_id, $posts[0]->ID );
  456. $posts = get_posts( array( 'meta_key' => 'bar', 'meta_value' => '0' ) );
  457. $this->assertEquals( 2, count ( $posts ) );
  458. foreach ( $posts as $post ) {
  459. $this->assertInstanceOf( 'WP_Post', $post );
  460. $this->assertEquals( 'raw', $post->filter );
  461. }
  462. $posts = wp_list_pluck( $posts, 'ID' );
  463. $this->assertEqualSets( array( $post_id, $post_id5 ), $posts );
  464. $posts = get_posts( array( 'meta_key' => 'bar', 'meta_value' => 0 ) );
  465. $this->assertEquals( 2, count ( $posts ) );
  466. foreach ( $posts as $post ) {
  467. $this->assertInstanceOf( 'WP_Post', $post );
  468. $this->assertEquals( 'raw', $post->filter );
  469. }
  470. $posts = wp_list_pluck( $posts, 'ID' );
  471. $this->assertEqualSets( array( $post_id, $post_id5 ), $posts );
  472. $posts = get_posts( array( 'meta_value' => 0 ) );
  473. $this->assertEquals( 5, count ( $posts ) );
  474. foreach ( $posts as $post ) {
  475. $this->assertInstanceOf( 'WP_Post', $post );
  476. $this->assertEquals( 'raw', $post->filter );
  477. }
  478. $posts = wp_list_pluck( $posts, 'ID' );
  479. $this->assertEqualSets( array( $post_id, $post_id3, $post_id4, $post_id5, $post_id6 ), $posts );
  480. $posts = get_posts( array( 'meta_value' => '0' ) );
  481. $this->assertEquals( 5, count ( $posts ) );
  482. foreach ( $posts as $post ) {
  483. $this->assertInstanceOf( 'WP_Post', $post );
  484. $this->assertEquals( 'raw', $post->filter );
  485. }
  486. $posts = wp_list_pluck( $posts, 'ID' );
  487. $this->assertEqualSets( array( $post_id, $post_id3, $post_id4, $post_id5, $post_id6 ), $posts );
  488. }
  489. function test_taxonomy_include_children() {
  490. $cat_a = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'Australia' ) );
  491. $cat_b = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'Sydney', 'parent' => $cat_a ) );
  492. $cat_c = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'East Syndney', 'parent' => $cat_b ) );
  493. $cat_d = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'West Syndney', 'parent' => $cat_b ) );
  494. $post_a = $this->factory->post->create( array( 'post_category' => array( $cat_a ) ) );
  495. $post_b = $this->factory->post->create( array( 'post_category' => array( $cat_b ) ) );
  496. $post_c = $this->factory->post->create( array( 'post_category' => array( $cat_c ) ) );
  497. $post_d = $this->factory->post->create( array( 'post_category' => array( $cat_d ) ) );
  498. $posts = get_posts( array(
  499. 'tax_query' => array(
  500. array(
  501. 'taxonomy' => 'category',
  502. 'field' => 'id',
  503. 'terms' => array( $cat_a ),
  504. )
  505. )
  506. ) );
  507. $this->assertEquals( 4 , count( $posts ) );
  508. $posts = get_posts( array(
  509. 'tax_query' => array(
  510. array(
  511. 'taxonomy' => 'category',
  512. 'field' => 'id',
  513. 'terms' => array( $cat_a ),
  514. 'include_children' => false
  515. )
  516. )
  517. ) );
  518. $this->assertEquals( 1 , count( $posts ) );
  519. $posts = get_posts( array(
  520. 'tax_query' => array(
  521. array(
  522. 'taxonomy' => 'category',
  523. 'field' => 'id',
  524. 'terms' => array( $cat_b ),
  525. )
  526. )
  527. ) );
  528. $this->assertEquals( 3 , count( $posts ) );
  529. $posts = get_posts( array(
  530. 'tax_query' => array(
  531. array(
  532. 'taxonomy' => 'category',
  533. 'field' => 'id',
  534. 'terms' => array( $cat_b ),
  535. 'include_children' => false
  536. )
  537. )
  538. ) );
  539. $this->assertEquals( 1 , count( $posts ) );
  540. $posts = get_posts( array(
  541. 'tax_query' => array(
  542. array(
  543. 'taxonomy' => 'category',
  544. 'field' => 'id',
  545. 'terms' => array( $cat_c ),
  546. )
  547. )
  548. ) );
  549. $this->assertEquals( 1 , count( $posts ) );
  550. $posts = get_posts( array(
  551. 'tax_query' => array(
  552. array(
  553. 'taxonomy' => 'category',
  554. 'field' => 'id',
  555. 'terms' => array( $cat_c ),
  556. 'include_children' => false
  557. )
  558. )
  559. ) );
  560. $this->assertEquals( 1 , count( $posts ) );
  561. }
  562. /**
  563. * @ticket 22448
  564. */
  565. function test_the_posts_filter() {
  566. // Create posts and clear their caches.
  567. $post_ids = $this->factory->post->create_many( 10 );
  568. foreach ( $post_ids as $post_id )
  569. clean_post_cache( $post_id );
  570. add_filter( 'the_posts', array( $this, 'the_posts_filter' ) );
  571. $query = new WP_Query( array(
  572. 'post_type' => 'post',
  573. 'posts_per_page' => 5,
  574. ) );
  575. // Sixth post added in filter
  576. $this->assertEquals( 6, count( $query->posts ) );
  577. $this->assertEquals( 6, $query->post_count );
  578. foreach ( $query->posts as $post ) {
  579. // posts are WP_Post objects
  580. $this->assertTrue( is_a( $post, 'WP_Post' ) );
  581. // filters are raw
  582. $this->assertEquals( 'raw', $post->filter );
  583. // custom data added in the_posts filter is preserved
  584. $this->assertEquals( array( $post->ID, 'custom data' ), $post->custom_data );
  585. }
  586. remove_filter( 'the_posts', array( $this, 'the_posts_filter' ) );
  587. }
  588. /**
  589. * Use with the_posts filter, appends a post and adds some custom data.
  590. */
  591. function the_posts_filter( $posts ) {
  592. $posts[] = clone $posts[0];
  593. // Add some custom data to each post.
  594. foreach ( $posts as $key => $post )
  595. $posts[ $key ]->custom_data = array( $post->ID, 'custom data' );
  596. return $posts;
  597. }
  598. }