meta.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. /**
  3. * @group post
  4. * @group meta
  5. */
  6. class Tests_Post_Meta extends WP_UnitTestCase {
  7. function setUp() {
  8. parent::setUp();
  9. $this->author = new WP_User( $this->factory->user->create( array( 'role' => 'editor' ) ) );
  10. $post = array(
  11. 'post_author' => $this->author->ID,
  12. 'post_status' => 'publish',
  13. 'post_content' => rand_str(),
  14. 'post_title' => rand_str(),
  15. );
  16. // insert a post
  17. $this->post_id = wp_insert_post($post);
  18. $post = array(
  19. 'post_author' => $this->author->ID,
  20. 'post_status' => 'publish',
  21. 'post_content' => rand_str(),
  22. 'post_title' => rand_str(),
  23. );
  24. // insert a post
  25. $this->post_id_2 = wp_insert_post($post);
  26. }
  27. function tearDown() {
  28. parent::tearDown();
  29. wp_delete_post($this->post_id);
  30. wp_delete_post($this->post_id_2);
  31. }
  32. function test_unique_postmeta() {
  33. // Add a unique post meta item
  34. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'unique', 'value', true) );
  35. // Check unique is enforced
  36. $this->assertFalse(add_post_meta($this->post_id, 'unique', 'another value', true));
  37. //Check it exists
  38. $this->assertEquals('value', get_post_meta($this->post_id, 'unique', true));
  39. $this->assertEquals(array('value'), get_post_meta($this->post_id, 'unique', false));
  40. //Fail to delete the wrong value
  41. $this->assertFalse(delete_post_meta($this->post_id, 'unique', 'wrong value'));
  42. //Delete it
  43. $this->assertTrue(delete_post_meta($this->post_id, 'unique', 'value'));
  44. //Check it is deleted
  45. $this->assertEquals('', get_post_meta($this->post_id, 'unique', true));
  46. $this->assertEquals(array(), get_post_meta($this->post_id, 'unique', false));
  47. }
  48. function test_nonunique_postmeta() {
  49. // Add two non unique post meta item
  50. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'nonunique', 'value') );
  51. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'nonunique', 'another value'));
  52. //Check they exists
  53. $this->assertEquals('value', get_post_meta($this->post_id, 'nonunique', true));
  54. $this->assertEquals(array('value', 'another value'), get_post_meta($this->post_id, 'nonunique', false));
  55. //Fail to delete the wrong value
  56. $this->assertFalse(delete_post_meta($this->post_id, 'nonunique', 'wrong value'));
  57. //Delete the first one
  58. $this->assertTrue(delete_post_meta($this->post_id, 'nonunique', 'value'));
  59. //Check the remainder exists
  60. $this->assertEquals('another value', get_post_meta($this->post_id, 'nonunique', true));
  61. $this->assertEquals(array('another value'), get_post_meta($this->post_id, 'nonunique', false));
  62. //Add a third one
  63. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'nonunique', 'someother value') );
  64. //Check they exists
  65. $expected = array(
  66. 'someother value',
  67. 'another value'
  68. );
  69. sort( $expected );
  70. $this->assertTrue( in_array( get_post_meta( $this->post_id, 'nonunique', true ), $expected ) );
  71. $actual = get_post_meta( $this->post_id, 'nonunique', false );
  72. sort( $actual );
  73. $this->assertEquals( $expected, $actual );
  74. //Delete the lot
  75. $this->assertTrue(delete_post_meta_by_key('nonunique'));
  76. }
  77. function test_update_post_meta() {
  78. // Add a unique post meta item
  79. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'unique_update', 'value', true) );
  80. // Add two non unique post meta item
  81. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'nonunique_update', 'value') );
  82. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'nonunique_update', 'another value') );
  83. //Check they exists
  84. $this->assertEquals('value', get_post_meta($this->post_id, 'unique_update', true));
  85. $this->assertEquals(array('value'), get_post_meta($this->post_id, 'unique_update', false));
  86. $this->assertEquals('value', get_post_meta($this->post_id, 'nonunique_update', true));
  87. $this->assertEquals(array('value', 'another value'), get_post_meta($this->post_id, 'nonunique_update', false));
  88. // Update them
  89. $this->assertTrue(update_post_meta($this->post_id, 'unique_update', 'new', 'value'));
  90. $this->assertTrue(update_post_meta($this->post_id, 'nonunique_update', 'new', 'value'));
  91. $this->assertTrue(update_post_meta($this->post_id, 'nonunique_update', 'another new', 'another value'));
  92. //Check they updated
  93. $this->assertEquals('new', get_post_meta($this->post_id, 'unique_update', true));
  94. $this->assertEquals(array('new'), get_post_meta($this->post_id, 'unique_update', false));
  95. $this->assertEquals('new', get_post_meta($this->post_id, 'nonunique_update', true));
  96. $this->assertEquals(array('new', 'another new'), get_post_meta($this->post_id, 'nonunique_update', false));
  97. }
  98. function test_delete_post_meta() {
  99. // Add a unique post meta item
  100. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'unique_delete', 'value', true) );
  101. $this->assertInternalType( 'integer', add_post_meta($this->post_id_2, 'unique_delete', 'value', true) );
  102. //Check they exists
  103. $this->assertEquals('value', get_post_meta($this->post_id, 'unique_delete', true));
  104. $this->assertEquals('value', get_post_meta($this->post_id_2, 'unique_delete', true));
  105. //Delete one of them
  106. $this->assertTrue(delete_post_meta($this->post_id, 'unique_delete', 'value'));
  107. //Check the other still exitsts
  108. $this->assertEquals('value', get_post_meta($this->post_id_2, 'unique_delete', true));
  109. }
  110. function test_delete_post_meta_by_key() {
  111. // Add a unique post meta item
  112. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'unique_delete_by_key', 'value', true) );
  113. $this->assertInternalType( 'integer', add_post_meta($this->post_id_2, 'unique_delete_by_key', 'value', true) );
  114. //Check they exist
  115. $this->assertEquals('value', get_post_meta($this->post_id, 'unique_delete_by_key', true));
  116. $this->assertEquals('value', get_post_meta($this->post_id_2, 'unique_delete_by_key', true));
  117. //Delete one of them
  118. $this->assertTrue(delete_post_meta_by_key('unique_delete_by_key'));
  119. //Check the other still exists
  120. $this->assertEquals('', get_post_meta($this->post_id_2, 'unique_delete_by_key', true));
  121. $this->assertEquals('', get_post_meta($this->post_id_2, 'unique_delete_by_key', true));
  122. }
  123. function test_get_post_meta_by_id() {
  124. $mid = add_post_meta( $this->post_id, 'get_post_meta_by_key', 'get_post_meta_by_key_value', true );
  125. $this->assertInternalType( 'integer', $mid );
  126. $mobj = new stdClass;
  127. $mobj->meta_id = $mid;
  128. $mobj->post_id = $this->post_id;
  129. $mobj->meta_key = 'get_post_meta_by_key';
  130. $mobj->meta_value = 'get_post_meta_by_key_value';
  131. $this->assertEquals( $mobj, get_post_meta_by_id( $mid ) );
  132. delete_metadata_by_mid( 'post', $mid );
  133. $mid = add_post_meta( $this->post_id, 'get_post_meta_by_key', array( 'foo', 'bar' ), true );
  134. $this->assertInternalType( 'integer', $mid );
  135. $mobj->meta_id = $mid;
  136. $mobj->meta_value = array( 'foo', 'bar' );
  137. $this->assertEquals( $mobj, get_post_meta_by_id( $mid ) );
  138. delete_metadata_by_mid( 'post', $mid );
  139. }
  140. function test_delete_meta() {
  141. $mid = add_post_meta( $this->post_id, 'delete_meta', 'delete_meta_value', true );
  142. $this->assertInternalType( 'integer', $mid );
  143. $this->assertTrue( delete_meta( $mid ) );
  144. $this->assertFalse( get_metadata_by_mid( 'post', $mid ) );
  145. $this->assertFalse( delete_meta( 123456789 ) );
  146. }
  147. function test_update_meta() {
  148. // Add a unique post meta item
  149. $this->assertInternalType( 'integer', $mid1 = add_post_meta($this->post_id, 'unique_update', 'value', true) );
  150. // Add two non unique post meta item
  151. $this->assertInternalType( 'integer', $mid2 = add_post_meta($this->post_id, 'nonunique_update', 'value') );
  152. $this->assertInternalType( 'integer', $mid3 = add_post_meta($this->post_id, 'nonunique_update', 'another value') );
  153. //Check they exist
  154. $this->assertEquals('value', get_post_meta($this->post_id, 'unique_update', true));
  155. $this->assertEquals(array('value'), get_post_meta($this->post_id, 'unique_update', false));
  156. $this->assertEquals('value', get_post_meta($this->post_id, 'nonunique_update', true));
  157. $this->assertEquals(array('value', 'another value'), get_post_meta($this->post_id, 'nonunique_update', false));
  158. // Update them
  159. $this->assertTrue( update_meta( $mid1, 'unique_update', 'new' ) );
  160. $this->assertTrue( update_meta( $mid2, 'nonunique_update', 'new' ) );
  161. $this->assertTrue( update_meta( $mid3, 'nonunique_update', 'another new' ) );
  162. //Check they updated
  163. $this->assertEquals('new', get_post_meta($this->post_id, 'unique_update', true));
  164. $this->assertEquals(array('new'), get_post_meta($this->post_id, 'unique_update', false));
  165. $this->assertEquals('new', get_post_meta($this->post_id, 'nonunique_update', true));
  166. $this->assertEquals(array('new', 'another new'), get_post_meta($this->post_id, 'nonunique_update', false));
  167. // Slashed update
  168. $data = "'quote and \slash";
  169. $this->assertTrue( update_meta( $mid1, 'unique_update', addslashes( $data ) ) );
  170. $meta = get_metadata_by_mid( 'post', $mid1 );
  171. $this->assertEquals( $data, $meta->meta_value );
  172. }
  173. /**
  174. * @ticket 12860
  175. */
  176. function test_funky_post_meta() {
  177. $classy = new StdClass();
  178. $classy->ID = 1;
  179. $classy->stringy = "I love slashes\\\\";
  180. $funky_meta[] = $classy;
  181. $classy = new StdClass();
  182. $classy->ID = 2;
  183. $classy->stringy = "I love slashes\\\\ more";
  184. $funky_meta[] = $classy;
  185. // Add a post meta item
  186. $this->assertInternalType( 'integer', add_post_meta($this->post_id, 'test_funky_post_meta', $funky_meta, true) );
  187. //Check they exists
  188. $this->assertEquals($funky_meta, get_post_meta($this->post_id, 'test_funky_post_meta', true));
  189. }
  190. }