Ticket #21879: 21879.2.diff
File 21879.2.diff, 3.9 KB (added by , 11 years ago) |
---|
-
src/wp-includes/post.php
2077 2077 } 2078 2078 2079 2079 /** 2080 * Return the cache key for wp_count_posts() based on the passed arguments 2081 * 2082 * @since 3.9.0 2083 * 2084 * @param string $type Optional. Post type to retrieve count 2085 * @param string $perm Optional. 'readable' or empty. 2086 * @return string The cache key. 2087 */ 2088 function _count_posts_cache_key( $type = 'post', $perm = '' ) { 2089 $cache_key = 'posts-' . $type; 2090 if ( 'readable' == $perm && is_user_logged_in() ) { 2091 $post_type_object = get_post_type_object( $type ); 2092 if ( ! current_user_can( $post_type_object->cap->read_private_posts ) ) { 2093 $cache_key .= '_' . $perm . '_' . get_current_user_id(); 2094 } 2095 } 2096 return $cache_key; 2097 } 2098 2099 /** 2080 2100 * Count number of posts of a post type and if user has permissions to view. 2081 2101 * 2082 2102 * This function provides an efficient method of finding the amount of post's … … 2101 2121 if ( ! post_type_exists( $type ) ) 2102 2122 return new stdClass; 2103 2123 2104 $ user = wp_get_current_user();2124 $cache_key = _count_posts_cache_key( $type, $perm ); 2105 2125 2106 $cache_key = 'posts-' . $type;2107 2108 2126 $query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s"; 2109 2127 if ( 'readable' == $perm && is_user_logged_in() ) { 2110 2128 $post_type_object = get_post_type_object($type); 2111 if ( !current_user_can( $post_type_object->cap->read_private_posts ) ) { 2112 $cache_key .= '_' . $perm . '_' . $user->ID; 2113 $query .= " AND (post_status != 'private' OR ( post_author = '$user->ID' AND post_status = 'private' ))"; 2129 if ( ! current_user_can( $post_type_object->cap->read_private_posts ) ) { 2130 $query .= $wpdb->prepare( " AND (post_status != 'private' OR ( post_author = %d AND post_status = 'private' ))", 2131 get_current_user_id() 2132 ); 2114 2133 } 2115 2134 } 2116 2135 $query .= ' GROUP BY post_status'; … … 4885 4904 } 4886 4905 } 4887 4906 4907 if ( $new_status !== $old_status ) { 4908 wp_cache_delete( _count_posts_cache_key( $post->post_type ), 'counts' ); 4909 wp_cache_delete( _count_posts_cache_key( $post->post_type, 'readable' ), 'counts' ); 4910 } 4911 4888 4912 // Always clears the hook in case the post status bounced from future to draft. 4889 4913 wp_clear_scheduled_hook('publish_future_post', array( $post->ID ) ); 4890 4914 } -
tests/phpunit/tests/post.php
829 829 $counts->publish = 7; 830 830 return $counts; 831 831 } 832 833 function test_wp_count_posts_insert_invalidation() { 834 $post_ids = $this->factory->post->create_many( 10 ); 835 $initial_counts = wp_count_posts(); 836 837 $key = array_rand( $post_ids ); 838 $_post = get_post( $post_ids[$key], ARRAY_A ); 839 $_post['post_status'] = 'draft'; 840 wp_insert_post( $_post ); 841 $post = get_post( $post_ids[$key] ); 842 $this->assertEquals( 'draft', $post->post_status ); 843 $this->assertNotEquals( 'publish', $post->post_status ); 844 845 $after_draft_counts = wp_count_posts(); 846 $this->assertEquals( 1, $after_draft_counts->draft ); 847 $this->assertEquals( 9, $after_draft_counts->publish ); 848 $this->assertNotEquals( $initial_counts->publish, $after_draft_counts->publish ); 849 } 850 851 function test_wp_count_posts_trash_invalidation() { 852 $post_ids = $this->factory->post->create_many( 10 ); 853 $initial_counts = wp_count_posts(); 854 855 $key = array_rand( $post_ids ); 856 857 wp_trash_post( $post_ids[$key] ); 858 859 $post = get_post( $post_ids[$key] ); 860 $this->assertEquals( 'trash', $post->post_status ); 861 $this->assertNotEquals( 'publish', $post->post_status ); 862 863 $after_trash_counts = wp_count_posts(); 864 $this->assertEquals( 1, $after_trash_counts->trash ); 865 $this->assertEquals( 9, $after_trash_counts->publish ); 866 $this->assertNotEquals( $initial_counts->publish, $after_trash_counts->publish ); 867 } 832 868 }