WordPress.org

Make WordPress Core

Ticket #17040: 17040.diff

File 17040.diff, 2.6 KB (added by scribu, 4 years ago)
  • wp-includes/class-wp.php

     
    2525         * @since 2.0.0 
    2626         * @var array 
    2727         */ 
    28         var $private_query_vars = array('offset', 'posts_per_page', 'posts_per_archive_page', 'showposts', 'nopaging', 'post_type', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm', 'comments_per_page', 'post__in', 'post__not_in'); 
     28        var $private_query_vars = array('offset', 'posts_per_page', 'posts_per_archive_page', 'showposts', 'nopaging', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm', 'comments_per_page', 'post__in', 'post__not_in'); 
    2929 
    3030        /** 
    3131         * Extra query variables set by the user. 
     
    277277                        if ( $t->query_var && isset( $this->query_vars[$t->query_var] ) ) 
    278278                                $this->query_vars[$t->query_var] = str_replace( ' ', '+', $this->query_vars[$t->query_var] ); 
    279279 
    280                 // Limit publicly queried post_types to those that are publicly_queryable 
    281                 if ( isset( $this->query_vars['post_type']) ) { 
    282                         $queryable_post_types = get_post_types( array('publicly_queryable' => true) ); 
    283                         if ( ! is_array( $this->query_vars['post_type'] ) ) { 
    284                                 if ( ! in_array( $this->query_vars['post_type'], $queryable_post_types ) ) 
    285                                         unset( $this->query_vars['post_type'] ); 
    286                         } else { 
    287                                 $this->query_vars['post_type'] = array_intersect( $this->query_vars['post_type'], $queryable_post_types ); 
     280                if ( isset( $this->query_vars['post_type'] ) ) { 
     281                        // Limit publicly queried post_types to those that are publicly_queryable 
     282                        $queried_post_types = array_intersect( 
     283                                (array) $this->query_vars['post_type'], 
     284                                get_post_types( array( 'publicly_queryable' => true ) ) 
     285                        ); 
     286 
     287                        // Limit post type archives to those with has_archive 
     288                        if ( !is_admin() && !empty( $queried_post_types ) && !isset( $this->query_vars['name'] ) ) { 
     289                                $valid_ptypes = array(); 
     290                                foreach( $queried_post_types as $ptype ) { 
     291                                        if ( get_post_type_object( $ptype )->has_archive ) 
     292                                                $valid_ptypes[] = $ptype; 
     293                                } 
     294                                $queried_post_types = $valid_ptypes; 
    288295                        } 
     296 
     297                        if ( empty( $queried_post_types ) ) 
     298                                unset( $this->query_vars['post_type'] ); 
     299                        elseif ( is_array( $this->query_vars['post_type'] ) ) 
     300                                $this->query_vars['post_type'] = $queried_post_types; 
     301                        else 
     302                                $this->query_vars['post_type'] = $queried_post_types[0]; 
    289303                } 
    290304 
    291305                foreach ( (array) $this->private_query_vars as $var) {