WordPress.org

Make WordPress Core

Ticket #7457: 7457.2.diff

File 7457.2.diff, 5.1 KB (added by ryan, 13 years ago)

Now with UI and one query to fetch the stickies

  • wp-includes/post.php

     
    482482        } elseif ( ! empty($r['exclude']) )
    483483                $r['post__not_in'] = preg_split('/[\s,]+/',$r['exclude']);
    484484
     485        $r['caller_get_posts'] = true;
     486
    485487        $get_posts = new WP_Query;
    486488        return $get_posts->query($r);
    487489
     
    750752}
    751753
    752754/**
     755 * is_sticky() - Check if post is sticky
     756 *
     757 * {@internal Missing Long Description}}
     758 *
     759 * @package WordPress
     760 * @subpackage Post
     761 * @since 2.7
     762 *
     763 * @param int $post_id A post ID
     764 * @return bool
     765 */
     766function is_sticky($post_id) {
     767        $stickies = get_option('sticky_posts');
     768
     769        if ( !is_array($stickies) )
     770                return false;
     771
     772        if ( in_array($post_id, $stickies) )
     773                return true;
     774
     775        return false;
     776}
     777
     778/**
    753779 * sanitize_post() - Sanitize every post field
    754780 *
    755781 * {@internal Missing Long Description}}
     
    847873        return $value;
    848874}
    849875
     876function stick_post($post_id) {
     877        $stickies = get_option('sticky_posts');
     878
     879        if ( !is_array($stickies) )
     880                $stickies = array($post_id);
     881
     882        if ( ! in_array($post_id, $stickies) )
     883                $stickies[] = $post_id;
     884
     885        update_option('sticky_posts', $stickies);
     886}
     887
     888function unstick_post($post_id) {
     889        $stickies = get_option('sticky_posts');
     890
     891        if ( !is_array($stickies) )
     892                return;
     893
     894        if ( ! in_array($post_id, $stickies) )
     895                return;
     896
     897        $offset = array_search($post_id, $stickies);
     898        if ( false === $offset )
     899                return;
     900
     901        array_splice($stickies, $offset, 1);
     902       
     903        update_option('sticky_posts', $stickies);
     904}
     905
    850906/**
    851907 * Count number of posts of a post type and is user has permissions to view.
    852908 *
  • wp-includes/query.php

     
    831831                $groupby = '';
    832832                $post_status_join = false;
    833833
     834                if ( !isset($q['caller_get_posts']) )
     835                        $q['caller_get_posts'] = false;
     836
    834837                if ( !isset($q['post_type']) ) {
    835838                        if ( $this->is_search )
    836839                                $q['post_type'] = 'any';
     
    14971500                        }
    14981501                }
    14991502
     1503                // Put sticky posts at the top of the posts array
     1504                $sticky_posts = get_option('sticky_posts');
     1505                if ( $this->is_home && $page <= 1 && !empty($sticky_posts) && !$q['caller_get_posts'] ) {
     1506                        $num_posts = count($this->posts);
     1507                        $post_ids = array();
     1508                        $sticky_offset = 0;
     1509                        // Loop over posts and relocate stickies to the front.
     1510                        for ( $i = 0; $i < $num_posts; $i++ ) {
     1511                                if ( in_array($this->posts[$i]->ID, $sticky_posts) ) {
     1512                                        $sticky_post = $this->posts[$i];
     1513                                        // Remove sticky from current position
     1514                                        array_splice($this->posts, $i, 1);
     1515                                        // Move to front, after other stickies
     1516                                        array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
     1517                                        //Increment the sticky offset.  The next sticky goes here.
     1518                                        $sticky_offset++;
     1519                                        // Remove post from sticky posts array
     1520                                        $offset = array_search($sticky_post->ID, $sticky_posts);
     1521                                        array_splice($sticky_posts, $offset, 1);
     1522                                }
     1523                        }
     1524
     1525                        // Fetch sticky posts that weren't in the query results
     1526                        $stickies__in = implode(',', array_map( 'absint', $sticky_posts ));
     1527                        $stickies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID IN ($stickies__in)" );
     1528                        // TODO Make sure post is published or viewable by the current user
     1529                        foreach ( $stickies as $sticky_post ) {
     1530                                if ( 'publish' != $sticky_post->post_status )
     1531                                        continue;
     1532                                array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
     1533                                $sticky_offset++;
     1534                        }
     1535                }
     1536
    15001537                $this->posts = apply_filters('the_posts', $this->posts);
    15011538
    15021539                update_post_caches($this->posts);
  • wp-admin/includes/post.php

     
    161161
    162162        wp_set_post_lock( $post_ID, $GLOBALS['current_user']->ID );
    163163
     164        if ( !empty($_POST['sticky']) )
     165                stick_post($post_ID);
     166        else
     167                unstick_post($post_ID);
     168
    164169        return $post_ID;
    165170}
    166171
  • wp-admin/edit-form-advanced.php

     
    117117</p>
    118118
    119119<?php if ( current_user_can( 'publish_posts' ) ) : ?>
    120 <p><label for="post_status_private" class="selectit"><input id="post_status_private" name="post_status" type="checkbox" value="private" <?php checked($post->post_status, 'private'); ?> tabindex="4" /> <?php _e('Keep this post private') ?></label></p>
     120<p><label for="post_status_private" class="selectit"><input id="post_status_private" name="post_status" type="checkbox" value="private" <?php checked($post->post_status, 'private'); ?> tabindex="4" /> <?php _e('Keep this post private') ?></label><br />
     121<label for="sticky" class="selectit"><input id="sticky" name="sticky" type="checkbox" value="sticky" <?php checked(is_sticky($post->ID), true); ?> tabindex="4" /> <?php _e('Stick this post to the front page') ?></label></p>
    121122<?php endif; ?>
    122123<?php
    123124if ($post_ID) {