Sticky Posts, firct cut. see #7457
git-svn-id: http://svn.automattic.com/wordpress/trunk@8546 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
80937742da
commit
7564143444
|
@ -117,7 +117,8 @@ if ( current_user_can('publish_posts') OR ( $post->post_status == 'publish' AND
|
|||
</p>
|
||||
|
||||
<?php if ( current_user_can( 'publish_posts' ) ) : ?>
|
||||
<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>
|
||||
<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 />
|
||||
<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>
|
||||
<?php endif; ?>
|
||||
<?php
|
||||
if ($post_ID) {
|
||||
|
|
|
@ -161,6 +161,11 @@ function edit_post() {
|
|||
|
||||
wp_set_post_lock( $post_ID, $GLOBALS['current_user']->ID );
|
||||
|
||||
if ( !empty($_POST['sticky']) )
|
||||
stick_post($post_ID);
|
||||
else
|
||||
unstick_post($post_ID);
|
||||
|
||||
return $post_ID;
|
||||
}
|
||||
|
||||
|
|
|
@ -482,6 +482,8 @@ function get_posts($args = null) {
|
|||
} elseif ( ! empty($r['exclude']) )
|
||||
$r['post__not_in'] = preg_split('/[\s,]+/',$r['exclude']);
|
||||
|
||||
$r['caller_get_posts'] = true;
|
||||
|
||||
$get_posts = new WP_Query;
|
||||
return $get_posts->query($r);
|
||||
|
||||
|
@ -749,6 +751,30 @@ function get_post_custom_values( $key = '', $post_id = 0 ) {
|
|||
return $custom[$key];
|
||||
}
|
||||
|
||||
/**
|
||||
* is_sticky() - Check if post is sticky
|
||||
*
|
||||
* {@internal Missing Long Description}}
|
||||
*
|
||||
* @package WordPress
|
||||
* @subpackage Post
|
||||
* @since 2.7
|
||||
*
|
||||
* @param int $post_id A post ID
|
||||
* @return bool
|
||||
*/
|
||||
function is_sticky($post_id) {
|
||||
$stickies = get_option('sticky_posts');
|
||||
|
||||
if ( !is_array($stickies) )
|
||||
return false;
|
||||
|
||||
if ( in_array($post_id, $stickies) )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* sanitize_post() - Sanitize every post field
|
||||
*
|
||||
|
@ -847,6 +873,58 @@ function sanitize_post_field($field, $value, $post_id, $context) {
|
|||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a post sticky
|
||||
*
|
||||
* Makes a post stick to the top of the front page
|
||||
*
|
||||
* @package WordPress
|
||||
* @subpackage Post
|
||||
* @since 2.7
|
||||
*
|
||||
* @param int $post_id A post ID
|
||||
*/
|
||||
function stick_post($post_id) {
|
||||
$stickies = get_option('sticky_posts');
|
||||
|
||||
if ( !is_array($stickies) )
|
||||
$stickies = array($post_id);
|
||||
|
||||
if ( ! in_array($post_id, $stickies) )
|
||||
$stickies[] = $post_id;
|
||||
|
||||
update_option('sticky_posts', $stickies);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unstick a post
|
||||
*
|
||||
* Unstick a post from the front page
|
||||
*
|
||||
* @package WordPress
|
||||
* @subpackage Post
|
||||
* @since 2.7
|
||||
*
|
||||
* @param int $post_id A post ID
|
||||
*/
|
||||
function unstick_post($post_id) {
|
||||
$stickies = get_option('sticky_posts');
|
||||
|
||||
if ( !is_array($stickies) )
|
||||
return;
|
||||
|
||||
if ( ! in_array($post_id, $stickies) )
|
||||
return;
|
||||
|
||||
$offset = array_search($post_id, $stickies);
|
||||
if ( false === $offset )
|
||||
return;
|
||||
|
||||
array_splice($stickies, $offset, 1);
|
||||
|
||||
update_option('sticky_posts', $stickies);
|
||||
}
|
||||
|
||||
/**
|
||||
* Count number of posts of a post type and is user has permissions to view.
|
||||
*
|
||||
|
|
|
@ -831,6 +831,9 @@ class WP_Query {
|
|||
$groupby = '';
|
||||
$post_status_join = false;
|
||||
|
||||
if ( !isset($q['caller_get_posts']) )
|
||||
$q['caller_get_posts'] = false;
|
||||
|
||||
if ( !isset($q['post_type']) ) {
|
||||
if ( $this->is_search )
|
||||
$q['post_type'] = 'any';
|
||||
|
@ -1497,6 +1500,39 @@ class WP_Query {
|
|||
}
|
||||
}
|
||||
|
||||
// Put sticky posts at the top of the posts array
|
||||
$sticky_posts = get_option('sticky_posts');
|
||||
if ( $this->is_home && $page <= 1 && !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
|
||||
$stickies__in = implode(',', array_map( 'absint', $sticky_posts ));
|
||||
$stickies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID IN ($stickies__in)" );
|
||||
// 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++;
|
||||
}
|
||||
}
|
||||
|
||||
$this->posts = apply_filters('the_posts', $this->posts);
|
||||
|
||||
update_post_caches($this->posts);
|
||||
|
|
Loading…
Reference in New Issue