author_id = $this->factory->user->create( array( 'role' => 'editor' ) ); $this->old_current_user = get_current_user_id(); wp_set_current_user( $this->author_id ); _set_cron_array(array()); $this->post_ids = array(); } function tearDown() { wp_set_current_user( $this->old_current_user ); parent::tearDown(); } // helper function: return the timestamp(s) of cron jobs for the specified hook and post function _next_schedule_for_post($hook, $id) { return wp_next_scheduled('publish_future_post', array(0=>intval($id))); } // helper function, unsets current user globally function _unset_current_user() { global $current_user, $user_ID; $current_user = $user_ID = null; } // test simple valid behavior: insert and get a post function test_vb_insert_get_delete() { register_post_type( 'cpt', array( 'taxonomies' => array( 'post_tag', 'ctax' ) ) ); register_taxonomy( 'ctax', 'cpt' ); $post_types = array( 'post', 'cpt' ); foreach ( $post_types as $post_type ) { $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => rand_str(), 'tax_input' => array( 'post_tag' => 'tag1,tag2', 'ctax' => 'cterm1,cterm2' ), 'post_type' => $post_type ); // insert a post and make sure the ID is ok $id = wp_insert_post($post); $this->assertTrue(is_numeric($id)); $this->assertTrue($id > 0); // fetch the post and make sure it matches $out = get_post($id); $this->assertEquals($post['post_content'], $out->post_content); $this->assertEquals($post['post_title'], $out->post_title); $this->assertEquals($post['post_status'], $out->post_status); $this->assertEquals($post['post_author'], $out->post_author); // test cache state $pcache = wp_cache_get( $id, 'posts' ); $this->assertInstanceOf( 'stdClass', $pcache ); $this->assertEquals( $id, $pcache->ID ); update_object_term_cache( $id, $post_type ); $tcache = wp_cache_get( $id, "post_tag_relationships" ); $this->assertInternalType( 'array', $tcache ); $this->assertEquals( 2, count( $tcache ) ); $tcache = wp_cache_get( $id, "ctax_relationships" ); if ( 'cpt' == $post_type ) { $this->assertInternalType( 'array', $tcache ); $this->assertEquals( 2, count( $tcache ) ); } else { $this->assertFalse( $tcache ); } wp_delete_post( $id, true ); $this->assertFalse( wp_cache_get( $id, 'posts' ) ); $this->assertFalse( wp_cache_get( $id, "post_tag_relationships" ) ); $this->assertFalse( wp_cache_get( $id, "ctax_relationships" ) ); } $GLOBALS['wp_taxonomies']['post_tag']->object_type = array( 'post' ); } function test_vb_insert_future() { // insert a post with a future date, and make sure the status and cron schedule are correct $future_date = strtotime('+1 day'); $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => strftime("%Y-%m-%d %H:%M:%S", $future_date), ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); #dmp(_get_cron_array()); $this->assertTrue(is_numeric($id)); $this->assertTrue($id > 0); // fetch the post and make sure it matches $out = get_post($id); $this->assertEquals($post['post_content'], $out->post_content); $this->assertEquals($post['post_title'], $out->post_title); $this->assertEquals('future', $out->post_status); $this->assertEquals($post['post_author'], $out->post_author); $this->assertEquals($post['post_date'], $out->post_date); // there should be a publish_future_post hook scheduled on the future date $this->assertEquals($future_date, $this->_next_schedule_for_post('publish_future_post', $id)); } function test_vb_insert_future_over_dst() { // insert a post with a future date, and make sure the status and cron schedule are correct // Some magic days - one dst one not $future_date_1 = strtotime('June 21st +1 year'); $future_date_2 = strtotime('Jan 11th +1 year'); $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => strftime("%Y-%m-%d %H:%M:%S", $future_date_1), ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); // fetch the post and make sure has the correct date and status $out = get_post($id); $this->assertEquals('future', $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // check that there's a publish_future_post job scheduled at the right time $this->assertEquals($future_date_1, $this->_next_schedule_for_post('publish_future_post', $id)); // now save it again with a date further in the future $post['ID'] = $id; $post['post_date'] = strftime("%Y-%m-%d %H:%M:%S", $future_date_2); $post['post_date_gmt'] = NULL; wp_update_post($post); // fetch the post again and make sure it has the new post_date $out = get_post($id); $this->assertEquals('future', $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // and the correct date on the cron job $this->assertEquals($future_date_2, $this->_next_schedule_for_post('publish_future_post', $id)); } function test_vb_insert_future_edit_bug() { // future post bug: posts get published at the wrong time if you edit the timestamp // http://trac.wordpress.org/ticket/4710 $future_date_1 = strtotime('+1 day'); $future_date_2 = strtotime('+2 day'); $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => strftime("%Y-%m-%d %H:%M:%S", $future_date_1), ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); // fetch the post and make sure has the correct date and status $out = get_post($id); $this->assertEquals('future', $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // check that there's a publish_future_post job scheduled at the right time $this->assertEquals($future_date_1, $this->_next_schedule_for_post('publish_future_post', $id)); // now save it again with a date further in the future $post['ID'] = $id; $post['post_date'] = strftime("%Y-%m-%d %H:%M:%S", $future_date_2); $post['post_date_gmt'] = NULL; wp_update_post($post); // fetch the post again and make sure it has the new post_date $out = get_post($id); $this->assertEquals('future', $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // and the correct date on the cron job $this->assertEquals($future_date_2, $this->_next_schedule_for_post('publish_future_post', $id)); } function test_vb_insert_future_draft() { // insert a draft post with a future date, and make sure no cron schedule is set $future_date = strtotime('+1 day'); $post = array( 'post_author' => $this->author_id, 'post_status' => 'draft', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => strftime("%Y-%m-%d %H:%M:%S", $future_date), ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); #dmp(_get_cron_array()); $this->assertTrue(is_numeric($id)); $this->assertTrue($id > 0); // fetch the post and make sure it matches $out = get_post($id); $this->assertEquals($post['post_content'], $out->post_content); $this->assertEquals($post['post_title'], $out->post_title); $this->assertEquals('draft', $out->post_status); $this->assertEquals($post['post_author'], $out->post_author); $this->assertEquals($post['post_date'], $out->post_date); // there should be a publish_future_post hook scheduled on the future date $this->assertEquals(false, $this->_next_schedule_for_post('publish_future_post', $id)); } function test_vb_insert_future_change_to_draft() { // insert a future post, then edit and change it to draft, and make sure cron gets it right $future_date_1 = strtotime('+1 day'); $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => strftime("%Y-%m-%d %H:%M:%S", $future_date_1), ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); // fetch the post and make sure has the correct date and status $out = get_post($id); $this->assertEquals('future', $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // check that there's a publish_future_post job scheduled at the right time $this->assertEquals($future_date_1, $this->_next_schedule_for_post('publish_future_post', $id)); // now save it again with status set to draft $post['ID'] = $id; $post['post_status'] = 'draft'; wp_update_post($post); // fetch the post again and make sure it has the new post_date $out = get_post($id); $this->assertEquals('draft', $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // and the correct date on the cron job $this->assertEquals(false, $this->_next_schedule_for_post('publish_future_post', $id)); } function test_vb_insert_future_change_status() { // insert a future post, then edit and change the status, and make sure cron gets it right $future_date_1 = strtotime('+1 day'); $statuses = array('draft', 'static', 'object', 'attachment', 'inherit', 'pending'); foreach ($statuses as $status) { $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => strftime("%Y-%m-%d %H:%M:%S", $future_date_1), ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); // fetch the post and make sure has the correct date and status $out = get_post($id); $this->assertEquals('future', $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // check that there's a publish_future_post job scheduled at the right time $this->assertEquals($future_date_1, $this->_next_schedule_for_post('publish_future_post', $id)); // now save it again with status changed $post['ID'] = $id; $post['post_status'] = $status; wp_update_post($post); // fetch the post again and make sure it has the new post_date $out = get_post($id); $this->assertEquals($status, $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // and the correct date on the cron job $this->assertEquals(false, $this->_next_schedule_for_post('publish_future_post', $id)); } } function test_vb_insert_future_private() { // insert a draft post with a future date, and make sure no cron schedule is set $future_date = strtotime('+1 day'); $post = array( 'post_author' => $this->author_id, 'post_status' => 'private', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => strftime("%Y-%m-%d %H:%M:%S", $future_date), ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); #dmp(_get_cron_array()); $this->assertTrue(is_numeric($id)); $this->assertTrue($id > 0); // fetch the post and make sure it matches $out = get_post($id); $this->assertEquals($post['post_content'], $out->post_content); $this->assertEquals($post['post_title'], $out->post_title); $this->assertEquals('private', $out->post_status); $this->assertEquals($post['post_author'], $out->post_author); $this->assertEquals($post['post_date'], $out->post_date); // there should be a publish_future_post hook scheduled on the future date $this->assertEquals(false, $this->_next_schedule_for_post('publish_future_post', $id)); } /** * @ticket 17180 */ function test_vb_insert_invalid_date() { // insert a post with an invalid date, make sure it fails $post = array( 'post_author' => $this->author_id, 'post_status' => 'public', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => '2012-02-30 00:00:00', ); // Test both return paths with or without WP_Error $insert_post = wp_insert_post( $post, true ); $this->assertTrue( is_wp_error( $insert_post ), 'Did not get a WP_Error back from wp_insert_post' ); $this->assertEquals( 'invalid_date', $insert_post->get_error_code() ); $insert_post = wp_insert_post( $post ); $this->assertEquals( 0, $insert_post ); } function test_vb_insert_future_change_to_private() { // insert a future post, then edit and change it to private, and make sure cron gets it right $future_date_1 = strtotime('+1 day'); $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => strftime("%Y-%m-%d %H:%M:%S", $future_date_1), ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); // fetch the post and make sure has the correct date and status $out = get_post($id); $this->assertEquals('future', $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // check that there's a publish_future_post job scheduled at the right time $this->assertEquals($future_date_1, $this->_next_schedule_for_post('publish_future_post', $id)); // now save it again with status set to draft $post['ID'] = $id; $post['post_status'] = 'private'; wp_update_post($post); // fetch the post again and make sure it has the new post_date $out = get_post($id); $this->assertEquals('private', $out->post_status); $this->assertEquals($post['post_date'], $out->post_date); // and the correct date on the cron job $this->assertEquals(false, $this->_next_schedule_for_post('publish_future_post', $id)); } /** * @ticket 5364 */ function test_delete_future_post_cron() { // "When I delete a future post using wp_delete_post($post->ID) it does not update the cron correctly." $future_date = strtotime('+1 day'); $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => rand_str(), 'post_date' => strftime("%Y-%m-%d %H:%M:%S", $future_date), ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); // check that there's a publish_future_post job scheduled at the right time $this->assertEquals($future_date, $this->_next_schedule_for_post('publish_future_post', $id)); // now delete the post and make sure the cron entry is removed wp_delete_post($id); $this->assertFalse($this->_next_schedule_for_post('publish_future_post', $id)); } /** * @ticket 5305 */ function test_permalink_without_title() { // bug: permalink doesn't work if post title is empty // might only fail if the post ID is greater than four characters global $wp_rewrite; $wp_rewrite->set_permalink_structure('/%year%/%monthnum%/%day%/%postname%/'); $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => '', 'post_date' => '2007-10-31 06:15:00', ); // insert a post and make sure the ID is ok $id = $this->post_ids[] = wp_insert_post($post); $plink = get_permalink($id); // permalink should include the post ID at the end $this->assertEquals(get_option('siteurl').'/2007/10/31/'.$id.'/', $plink); $wp_rewrite->set_permalink_structure(''); } /** * @ticket 21013 */ function test_wp_unique_post_slug_with_non_latin_slugs() { $inputs = array( 'Αρνάκι άσπρο και παχύ της μάνας του καμάρι, και άλλα τραγούδια', 'Предлагаем супер металлообрабатывающее оборудование', ); $outputs = array( 'αρνάκι-άσπρο-και-παχύ-της-μάνας-του-κα-2', 'предлагаем-супер-металлообрабатыва-2', ); foreach ( $inputs as $k => $post_title ) { for ( $i = 0; $i < 2; $i++ ) { $post = array( 'post_author' => $this->author_id, 'post_status' => 'publish', 'post_content' => rand_str(), 'post_title' => $post_title, ); $id = $this->post_ids[] = wp_insert_post( $post ); } $post = get_post( $id ); $this->assertEquals( $outputs[$k], urldecode( $post->post_name ) ); } } /** * @ticket 15665 */ function test_get_page_by_path_priority() { $attachment = $this->factory->post->create_and_get( array( 'post_title' => 'some-page', 'post_type' => 'attachment' ) ); $page = $this->factory->post->create_and_get( array( 'post_title' => 'some-page', 'post_type' => 'page' ) ); $other_att = $this->factory->post->create_and_get( array( 'post_title' => 'some-other-page', 'post_type' => 'attachment' ) ); $this->assertEquals( 'some-page', $attachment->post_name ); $this->assertEquals( 'some-page', $page->post_name ); // get_page_by_path() should return a post of the requested type before returning an attachment. $this->assertEquals( $page, get_page_by_path( 'some-page' ) ); // Make sure get_page_by_path() will still select an attachment when a post of the requested type doesn't exist. $this->assertEquals( $other_att, get_page_by_path( 'some-other-page' ) ); } function test_wp_publish_post() { $draft_id = $this->factory->post->create( array( 'post_status' => 'draft' ) ); $post = get_post( $draft_id ); $this->assertEquals( 'draft', $post->post_status ); wp_publish_post( $draft_id ); $post = get_post( $draft_id ); $this->assertEquals( 'publish', $post->post_status ); } /** * @ticket 22944 */ function test_wp_insert_post_and_wp_publish_post_with_future_date() { $future_date = gmdate( 'Y-m-d H:i:s', time() + 10000000 ); $post_id = $this->factory->post->create( array( 'post_status' => 'publish', 'post_date' => $future_date, ) ); $post = get_post( $post_id ); $this->assertEquals( 'future', $post->post_status ); $this->assertEquals( $future_date, $post->post_date ); wp_publish_post( $post_id ); $post = get_post( $post_id ); $this->assertEquals( 'publish', $post->post_status ); $this->assertEquals( $future_date, $post->post_date ); } /** * @ticket 22944 */ function test_publish_post_with_content_filtering() { kses_remove_filters(); $post_id = wp_insert_post( array( 'post_title' => '' ) ); $post = get_post( $post_id ); $this->assertEquals( '', $post->post_title ); $this->assertEquals( 'draft', $post->post_status ); kses_init_filters(); wp_update_post( array( 'ID' => $post->ID, 'post_status' => 'publish' ) ); $post = get_post( $post->ID ); $this->assertEquals( 'Test', $post->post_title ); kses_remove_filters(); } /** * @ticket 22944 */ function test_wp_publish_post_and_avoid_content_filtering() { kses_remove_filters(); $post_id = wp_insert_post( array( 'post_title' => '' ) ); $post = get_post( $post_id ); $this->assertEquals( '', $post->post_title ); $this->assertEquals( 'draft', $post->post_status ); kses_init_filters(); wp_publish_post( $post->ID ); $post = get_post( $post->ID ); $this->assertEquals( '', $post->post_title ); kses_remove_filters(); } /** * @ticket 22883 */ function test_get_page_uri_with_stdclass_post_object() { $post_id = $this->factory->post->create( array( 'post_name' => 'get-page-uri-post-name' ) ); // Mimick an old stdClass post object, missing the ancestors field. $post_array = (object) get_post( $post_id, ARRAY_A ); unset( $post_array->ancestors ); // Dummy assertion. If this test fails, it will actually error out on an E_WARNING. $this->assertEquals( 'get-page-uri-post-name', get_page_uri( $post_array ) ); } /** * @ticket 24491 */ function test_get_page_uri_with_nonexistent_post() { global $wpdb; $post_id = $wpdb->get_var( "SELECT MAX(ID) FROM $wpdb->posts" ) + 1; $this->assertFalse( get_page_uri( $post_id ) ); } /** * @ticket 23708 */ function test_get_post_ancestors_within_loop() { global $post; $parent_id = $this->factory->post->create(); $post = $this->factory->post->create_and_get( array( 'post_parent' => $parent_id ) ); $this->assertEquals( array( $parent_id ), get_post_ancestors( 0 ) ); } /** * @ticket 23474 */ function test_update_invalid_post_id() { $post_id = $this->factory->post->create( array( 'post_name' => 'get-page-uri-post-name' ) ); $post = get_post( $post_id, ARRAY_A ); $post['ID'] = 123456789; $this->assertEquals( 0, wp_insert_post( $post ) ); $this->assertEquals( 0, wp_update_post( $post ) ); $this->assertInstanceOf( 'WP_Error', wp_insert_post( $post, true ) ); $this->assertInstanceOf( 'WP_Error', wp_update_post( $post, true ) ); } function test_parse_post_content_single_page() { global $multipage, $pages, $numpages; $post_id = $this->factory->post->create( array( 'post_content' => 'Page 0' ) ); $post = get_post( $post_id ); setup_postdata( $post ); $this->assertEquals( 0, $multipage ); $this->assertCount( 1, $pages ); $this->assertEquals( 1, $numpages ); $this->assertEquals( array( 'Page 0' ), $pages ); } function test_parse_post_content_multi_page() { global $multipage, $pages, $numpages; $post_id = $this->factory->post->create( array( 'post_content' => 'Page 0Page 1Page 2Page 3' ) ); $post = get_post( $post_id ); setup_postdata( $post ); $this->assertEquals( 1, $multipage ); $this->assertCount( 4, $pages ); $this->assertEquals( 4, $numpages ); $this->assertEquals( array( 'Page 0', 'Page 1', 'Page 2', 'Page 3' ), $pages ); } function test_parse_post_content_remaining_single_page() { global $multipage, $pages, $numpages; $post_id = $this->factory->post->create( array( 'post_content' => 'Page 0' ) ); $post = get_post( $post_id ); setup_postdata( $post ); $this->assertEquals( 0, $multipage ); $this->assertCount( 1, $pages ); $this->assertEquals( 1, $numpages ); $this->assertEquals( array( 'Page 0' ), $pages ); } function test_parse_post_content_remaining_multi_page() { global $multipage, $pages, $numpages; $post_id = $this->factory->post->create( array( 'post_content' => 'Page 0Page 1Page 2Page 3' ) ); $post = get_post( $post_id ); setup_postdata( $post ); $this->assertEquals( 1, $multipage ); $this->assertCount( 4, $pages ); $this->assertEquals( 4, $numpages ); $this->assertEquals( array( 'Page 0', 'Page 1', 'Page 2', 'Page 3' ), $pages ); } /** * @ticket 16746 */ function test_parse_post_content_starting_with_nextpage() { global $multipage, $pages, $numpages; $post_id = $this->factory->post->create( array( 'post_content' => 'Page 0Page 1Page 2Page 3' ) ); $post = get_post( $post_id ); setup_postdata( $post ); $this->assertEquals( 1, $multipage ); $this->assertCount( 4, $pages ); $this->assertEquals( 4, $numpages ); $this->assertEquals( array( 'Page 0', 'Page 1', 'Page 2', 'Page 3' ), $pages ); } /** * @ticket 16746 */ function test_parse_post_content_starting_with_nextpage_multi() { global $multipage, $pages, $numpages; $post_id = $this->factory->post->create( array( 'post_content' => 'Page 0' ) ); $post = get_post( $post_id ); setup_postdata( $post ); $this->assertEquals( 0, $multipage ); $this->assertCount( 1, $pages ); $this->assertEquals( 1, $numpages ); $this->assertEquals( array( 'Page 0' ), $pages ); } /** * @ticket 19373 */ function test_insert_programmatic_sanitized() { $this->_unset_current_user(); register_taxonomy( 'test_tax', 'post' ); $title = rand_str(); $post_data = array( 'post_author' => $this->author_id, 'post_status' => 'public', 'post_content' => rand_str(), 'post_title' => $title, 'tax_input' => array( 'test_tax' => array( 'term', 'term2', 'term3' ) ) ); $insert_post_id = wp_insert_post( $post_data, true, true ); $this->assertTrue( ( is_int($insert_post_id) && $insert_post_id > 0 ) ); $post = get_post( $insert_post_id ); $this->assertEquals( $post->post_author, $this->author_id ); $this->assertEquals( $post->post_title, $title ); } /** * @ticket 19373 */ function test_insert_programmatic_without_current_user_success() { $this->_unset_current_user(); register_taxonomy( 'test_tax', 'post' ); $title = rand_str(); $post_data = array( 'post_author' => $this->author_id, 'post_status' => 'public', 'post_content' => rand_str(), 'post_title' => $title, 'tax_input' => array( 'test_tax' => array( 'term', 'term2', 'term3' ) ) ); // with sanitize set to false $insert_post_id = wp_insert_post( $post_data, true, false ); $post = get_post( $insert_post_id ); $this->assertEquals( $post->post_author, $this->author_id ); $this->assertEquals( $post->post_title, $title ); $terms = wp_get_object_terms( $insert_post_id, 'test_tax' ); $this->assertTrue( ( is_array( $terms ) && count( $terms ) == 3 ) ); } /** * @ticket 19373 */ function test_insert_programmatic_without_current_user_fail() { $this->_unset_current_user(); register_taxonomy( 'test_tax', 'post' ); $title = rand_str(); $post_data = array( // post_author not set 'post_status' => 'public', 'post_content' => rand_str(), 'post_title' => $title, 'tax_input' => array( 'test_tax' => array( 'term', 'term2', 'term3' ) ) ); // with sanitize set to false $insert_post_id = wp_insert_post( $post_data, true, false ); // should error because no default user exists and no post author is passed in $this->assertInstanceOf( 'WP_Error', $insert_post_id ); $this->assertEquals( 'empty_author', $insert_post_id->get_error_code() ); } /** * @ticket 24803 */ function test_wp_count_posts() { $post_type = rand_str(20); register_post_type( $post_type ); $this->factory->post->create( array( 'post_type' => $post_type, 'post_author' => $this->author_id ) ); $count = wp_count_posts( $post_type, 'readable' ); $this->assertEquals( 1, $count->publish ); _unregister_post_type( $post_type ); $this->assertEquals( new stdClass, wp_count_posts( $post_type, 'readable' ) ); } function test_wp_count_posts_filtered() { $post_type = rand_str(20); register_post_type( $post_type ); $this->factory->post->create_many( 10, array( 'post_type' => $post_type, 'post_author' => $this->author_id ) ); $count1 = wp_count_posts( $post_type, 'readable' ); $this->assertEquals( 10, $count1->publish ); add_filter( 'wp_count_posts', array( $this, 'filter_wp_count_posts' ) ); $count2 = wp_count_posts( $post_type, 'readable' ); $this->assertEquals( 7, $count2->publish ); remove_filter( 'wp_count_posts', array( $this, 'filter_wp_count_posts' ) ); } function filter_wp_count_posts( $counts ) { $counts->publish = 7; return $counts; } }