+
+ if ( $this->is_preview && current_user_can( "edit_{$post_type_cap}", $this->posts[0]->ID ) )
+ $this->posts[0] = apply_filters('the_preview', $this->posts[0]);
+ }
+
+ // Put sticky posts at the top of the posts array
+ $sticky_posts = get_option('sticky_posts');
+ if ( $this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['caller_get_posts'] ) {
+ $num_posts = count($this->posts);
+ $sticky_offset = 0;
+ // Loop over posts and relocate stickies to the front.
+ for ( $i = 0; $i < $num_posts; $i++ ) {
+ if ( in_array($this->posts[$i]->ID, $sticky_posts) ) {
+ $sticky_post = $this->posts[$i];
+ // Remove sticky from current position
+ array_splice($this->posts, $i, 1);
+ // Move to front, after other stickies
+ array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
+ // Increment the sticky offset. The next sticky will be placed at this offset.
+ $sticky_offset++;
+ // Remove post from sticky posts array
+ $offset = array_search($sticky_post->ID, $sticky_posts);
+ array_splice($sticky_posts, $offset, 1);
+ }
+ }
+
+ // Fetch sticky posts that weren't in the query results
+ if ( !empty($sticky_posts) ) {
+ $stickies__in = implode(',', array_map( 'absint', $sticky_posts ));
+ // honor post type(s) if not set to any
+ $stickies_where = '';
+ if ( 'any' != $post_type && '' != $post_type ) {
+ if ( is_array( $post_type ) ) {
+ $post_types = join( "', '", $post_type );
+ } else {
+ $post_types = $post_type;
+ }
+ $stickies_where = "AND $wpdb->posts.post_type IN ('" . $post_types . "')";
+ }
+ $stickies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID IN ($stickies__in) $stickies_where" );
+ /** @todo Make sure post is published or viewable by the current user */
+ foreach ( $stickies as $sticky_post ) {
+ if ( 'publish' != $sticky_post->post_status )
+ continue;
+ array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
+ $sticky_offset++;
+ }
+ }