diff --git src/wp-includes/user.php src/wp-includes/user.php
index 3c0f917bbc..c2d8970567 100644
|
|
function count_user_posts( $userid, $post_type = 'post', $public_only = false ) |
556 | 556 | |
557 | 557 | $where = get_posts_by_author_sql( $post_type, true, $userid, $public_only ); |
558 | 558 | |
559 | | $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); |
| 559 | $post_type_label = $post_type; |
| 560 | if ( is_array( $post_type ) ) { |
| 561 | $post_type_label = implode( '_', $post_type ); |
| 562 | } |
| 563 | $cache_key = "count_user_{$post_type_label}_{$userid}"; |
| 564 | |
| 565 | if ( $public_only ) { |
| 566 | $cache_group = 'user_posts_count_public'; |
| 567 | } else { |
| 568 | $cache_group = 'user_posts_count'; |
| 569 | } |
| 570 | |
| 571 | $count = wp_cache_get( $cache_key, $cache_group ); |
| 572 | |
| 573 | if ( false === $count ) { |
| 574 | $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); |
| 575 | wp_cache_add( $cache_key, $count, $cache_group ); |
| 576 | } |
560 | 577 | |
561 | 578 | /** |
562 | 579 | * Filters the number of posts a user has written. |
… |
… |
function count_many_users_posts( $users, $post_type = 'post', $public_only = fal |
593 | 610 | return $count; |
594 | 611 | } |
595 | 612 | |
596 | | $userlist = implode( ',', array_map( 'absint', $users ) ); |
597 | | $where = get_posts_by_author_sql( $post_type, true, null, $public_only ); |
598 | | |
599 | | $result = $wpdb->get_results( "SELECT post_author, COUNT(*) FROM $wpdb->posts $where AND post_author IN ($userlist) GROUP BY post_author", ARRAY_N ); |
600 | | foreach ( $result as $row ) { |
601 | | $count[ $row[0] ] = $row[1]; |
| 613 | foreach ( $users as $user_id ) { |
| 614 | $count[ $user_id ] = count_user_posts( $user_id, $post_type, $public_only ); |
602 | 615 | } |
603 | 616 | |
604 | 617 | foreach ( $users as $id ) { |
diff --git tests/phpunit/tests/user/countUserPosts.php tests/phpunit/tests/user/countUserPosts.php
index a4244e2814..991edc3b4f 100644
|
|
class Tests_User_CountUserPosts extends WP_UnitTestCase { |
89 | 89 | public function test_count_user_posts_should_ignore_non_existent_post_types() { |
90 | 90 | $this->assertEquals( 4, count_user_posts( self::$user_id, array( 'foo', 'post' ) ) ); |
91 | 91 | } |
| 92 | |
| 93 | /** |
| 94 | * Test the count_user_posts cache. |
| 95 | * |
| 96 | * @ticket 39242 |
| 97 | * |
| 98 | * @dataProvider data_count_user_posts_cache |
| 99 | * |
| 100 | * Primarily, this tests that the cache is created when count_user_posts() is called. |
| 101 | * Additionally, this tests using both a single post type string and an array of post types as a parameter. |
| 102 | * |
| 103 | * This ticket adds a cache key string to the function so we check that it is generated as exptected. |
| 104 | * |
| 105 | * @param string|array $post_type Used to test the first param in count_user_posts(). |
| 106 | * @param string $cache_key_lable Provides the expected cache key. |
| 107 | */ |
| 108 | public function test_count_user_posts_cache( $post_type, $cache_key_label) { |
| 109 | // Validate the cache is empty. |
| 110 | $cache = wp_cache_get( 'count_user_' . $cache_key_label . '_' . self::$user_id, 'user_posts_count' ); |
| 111 | $this->assertFalse( $cache ); |
| 112 | |
| 113 | // Call the function. |
| 114 | $count = count_user_posts( self::$user_id, $post_type ); |
| 115 | |
| 116 | // Validate the cache is populated. |
| 117 | $cache = wp_cache_get( 'count_user_' . $cache_key_label . '_' . self::$user_id, 'user_posts_count' ); |
| 118 | $this->assertEquals( $count, $cache ); |
| 119 | } |
| 120 | |
| 121 | /** |
| 122 | * @ticket 39242 |
| 123 | */ |
| 124 | public function data_count_user_posts_cache() { |
| 125 | return array ( |
| 126 | array( |
| 127 | 'post', |
| 128 | 'post' |
| 129 | ), |
| 130 | array( |
| 131 | array( |
| 132 | 'post', |
| 133 | 'wptests_pt', |
| 134 | ), |
| 135 | 'post_wptests_pt', |
| 136 | ), |
| 137 | ); |
| 138 | } |
92 | 139 | } |