Ticket #7457: 7457.2.diff

File 7457.2.diff, 5.1 KB (added by ryan, 4 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) {