WordPress.org

Make WordPress Core

Ticket #30250: 30250.diff

File 30250.diff, 3.0 KB (added by iworks, 6 years ago)

Show correct numbers of posts.

  • wp-includes/post.php

     
    23442344        if ( ! post_type_exists( $type ) )
    23452345                return new stdClass;
    23462346
     2347        $filters = array();
     2348        if ( isset($_GET['m']) && preg_match('/^\d{6}$/', $_GET['m'])) {
     2349                $filters['date']['start'] = date('Y-m-d H:i:s', mktime( 0, 0, 0, substr($_GET['m'], 4, 2), 1, substr($_GET['m'], 0, 4)));
     2350                $filters['date']['end'] = date('Y-m-d H:i:s', strtotime("+1 month", strtotime($filters['date']['start'])));
     2351        }
     2352
     2353        if ( isset($_GET['cat']) && absint($_GET['cat']) ) {
     2354                $filters['cat'] = absint($_GET['cat']);
     2355        }
     2356
     2357        if ( isset($_GET['show_sticky']) && $_GET['show_sticky'] && $sticky_posts = get_option( 'sticky_posts' ) ) {
     2358                $filters['show_sticky'] = array_map( 'absint', (array) $sticky_posts );
     2359        }
     2360
    23472361        $cache_key = _count_posts_cache_key( $type, $perm );
    23482362
    2349         $query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s";
     2363        $query = "SELECT p.post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} p ";
     2364
     2365        if (isset($filters['cat']) && absint($filters['cat'])) {
     2366                $query .= "LEFT JOIN {$wpdb->term_relationships} AS tr ON tr.object_id = p.ID ";
     2367                $query .= "LEFT JOIN {$wpdb->term_taxonomy} AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id ";
     2368        }
     2369
     2370        $query .= "WHERE p.post_type = %s";
    23502371        if ( 'readable' == $perm && is_user_logged_in() ) {
    23512372                $post_type_object = get_post_type_object($type);
    23522373                if ( ! current_user_can( $post_type_object->cap->read_private_posts ) ) {
    2353                         $query .= $wpdb->prepare( " AND (post_status != 'private' OR ( post_author = %d AND post_status = 'private' ))",
     2374                        $query .= $wpdb->prepare( " AND (p.post_status != 'private' OR ( p.post_author = %d AND p.post_status = 'private' ))",
    23542375                                get_current_user_id()
    23552376                        );
    23562377                }
    23572378        }
    2358         $query .= ' GROUP BY post_status';
     2379        if (isset($filters['show_sticky']) && count($filters['show_sticky'])) {
     2380                $query .= $wpdb->prepare(' AND p.ID in (%s)', implode( ', ', $filters['show_sticky']) );
     2381        }
     2382        if (isset($filters['cat']) && count($filters['cat'])) {
     2383                $query .= $wpdb->prepare(' AND tt.term_id = %d',$filters['cat']);
     2384        }
     2385        if ( isset($filters['date']) && isset($filters['date']['start']) && isset($filters['date']['end']) ) {
     2386                $query .= $wpdb->prepare(
     2387                        ' AND p.post_date >= %s and p.post_date < %s',
     2388                        $filters['date']['start'],
     2389                        $filters['date']['end']
     2390                );
     2391        }
    23592392
    2360         $counts = wp_cache_get( $cache_key, 'counts' );
     2393        $query .= ' GROUP BY p.post_status';
     2394
     2395        $counts = false;
     2396        if ( !count($filters) ) {
     2397                $counts = wp_cache_get( $cache_key, 'counts' );
     2398        }
    23612399        if ( false === $counts ) {
    23622400                $results = (array) $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A );
    23632401                $counts = array_fill_keys( get_post_stati(), 0 );
     
    23662404                        $counts[ $row['post_status'] ] = $row['num_posts'];
    23672405
    23682406                $counts = (object) $counts;
    2369                 wp_cache_set( $cache_key, $counts, 'counts' );
     2407                if ( !count($filters) ) {
     2408                        wp_cache_set( $cache_key, $counts, 'counts' );
     2409                }
    23702410        }
    23712411
    23722412        /**