Make WordPress Core

Ticket #12702: Enable sticky post checkbox for custom post type - patch-2.patch

File Enable sticky post checkbox for custom post type - patch-2.patch, 12.1 KB (added by azizur, 14 years ago)

Patch 2: Enable sticky post checkbox for custom post type

  • wp-admin/includes/meta-boxes.php

     
    116116} elseif ( !empty( $post->post_password ) ) {
    117117        $visibility = 'password';
    118118        $visibility_trans = __('Password protected');
    119 } elseif ( $post_type == 'post' && is_sticky( $post->ID ) ) {
     119} elseif ( post_type_supports( $post_type, 'sticky') && is_sticky( $post->ID ) ) {
    120120        $visibility = 'public';
    121121        $visibility_trans = __('Public, Sticky');
    122122} else {
     
    130130
    131131<div id="post-visibility-select" class="hide-if-js">
    132132<input type="hidden" name="hidden_post_password" id="hidden-post-password" value="<?php echo esc_attr($post->post_password); ?>" />
    133 <?php if ($post_type == 'post'): ?>
     133<?php if ( post_type_supports( $post_type, 'sticky') ): ?>
    134134<input type="checkbox" style="display:none" name="hidden_post_sticky" id="hidden-post-sticky" value="sticky" <?php checked(is_sticky($post->ID)); ?> />
    135135<?php endif; ?>
    136136<input type="hidden" name="hidden_post_visibility" id="hidden-post-visibility" value="<?php echo esc_attr( $visibility ); ?>" />
    137137
    138138
    139139<input type="radio" name="visibility" id="visibility-radio-public" value="public" <?php checked( $visibility, 'public' ); ?> /> <label for="visibility-radio-public" class="selectit"><?php _e('Public'); ?></label><br />
    140 <?php if ($post_type == 'post'): ?>
    141 <span id="sticky-span"><input id="sticky" name="sticky" type="checkbox" value="sticky" <?php checked(is_sticky($post->ID)); ?> tabindex="4" /> <label for="sticky" class="selectit"><?php _e('Stick this post to the front page') ?></label><br /></span>
     140<?php if ( post_type_supports( $post_type, 'sticky') ): ?>
     141<span id="sticky-span"><input id="sticky" name="sticky" type="checkbox" value="sticky" <?php checked(is_sticky($post->ID)); ?> tabindex="4" /> <label for="sticky" class="selectit"><?php _e('Stick this to the front page') ?></label><br /></span>
    142142<?php endif; ?>
    143143<input type="radio" name="visibility" id="visibility-radio-password" value="password" <?php checked( $visibility, 'password' ); ?> /> <label for="visibility-radio-password" class="selectit"><?php _e('Password protected'); ?></label><br />
    144144<span id="password-span"><label for="post_password"><?php _e('Password:'); ?></label> <input type="text" name="post_password" id="post_password" value="<?php echo esc_attr($post->post_password); ?>" /><br /></span>
  • wp-admin/includes/template.php

     
    11111111                                </select>
    11121112                        </label>
    11131113
    1114 <?php if ( 'post' == $screen->post_type && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?>
     1114<?php if ( post_type_supports($screen->post_type, 'sticky') && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?>
    11151115
    11161116<?php   if ( $bulk ) : ?>
    11171117
     
    11281128
    11291129                        <label class="alignleft">
    11301130                                <input type="checkbox" name="sticky" value="sticky" />
    1131                                 <span class="checkbox-title"><?php _e( 'Make this post sticky' ); ?></span>
     1131                                <span class="checkbox-title"><?php _e( 'Make this sticky' ); ?></span>
    11321132                        </label>
    11331133
    11341134<?php   endif; // $bulk ?>
  • wp-includes/post.php

     
    2323                'hierarchical' => false,
    2424                'rewrite' => false,
    2525                'query_var' => false,
    26                 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
     26                'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'sticky' ),
    2727        ) );
    2828
    2929        register_post_type( 'page', array(
     
    13381338        global $id;
    13391339
    13401340        $post_id = absint($post_id);
     1341        $sticky_post_type = get_post_type($post_id);
    13411342
    13421343        if ( !$post_id )
    13431344                $post_id = absint($id);
    13441345
    1345         $stickies = get_option('sticky_posts');
     1346        if('post' == $sticky_post_type) {
     1347            $stickies = get_option('sticky_posts');
     1348        } else {
     1349            $stickies = get_option('sticky_' . $sticky_post_type);
     1350        }
    13461351
    13471352        if ( !is_array($stickies) )
    13481353                return false;
     
    14891494 * @param int $post_id Post ID.
    14901495 */
    14911496function stick_post($post_id) {
     1497    $sticky_post_type = get_post_type($post_id);
     1498
     1499    if('post' == $sticky_post_type){
    14921500        $stickies = get_option('sticky_posts');
     1501    } else {
     1502        $stickies = get_option('sticky_' . $sticky_post_type);
     1503    }
    14931504
    14941505        if ( !is_array($stickies) )
    14951506                $stickies = array($post_id);
     
    14971508        if ( ! in_array($post_id, $stickies) )
    14981509                $stickies[] = $post_id;
    14991510
     1511
     1512    if('post' == $sticky_post_type){
    15001513        update_option('sticky_posts', $stickies);
     1514    } else {
     1515        update_option('sticky_'. $sticky_post_type, $stickies);
     1516    }
    15011517}
    15021518
    15031519/**
     
    15101526 * @param int $post_id Post ID.
    15111527 */
    15121528function unstick_post($post_id) {
     1529    $sticky_post_type = get_post_type($post_id);
     1530    if('post' == get_post_type($post_id)) {
    15131531        $stickies = get_option('sticky_posts');
     1532    } else {
     1533        $stickies = get_option('sticky_' . $sticky_post_type);
     1534    }
    15141535
    15151536        if ( !is_array($stickies) )
    15161537                return;
     
    15231544                return;
    15241545
    15251546        array_splice($stickies, $offset, 1);
    1526 
     1547    if('post' == $sticky_post_type){
    15271548        update_option('sticky_posts', $stickies);
     1549    } else {
     1550        update_option('sticky_'. $sticky_post_type, $stickies);
     1551    }
    15281552}
    15291553
    15301554/**
  • wp-includes/query.php

     
    24712471                }
    24722472
    24732473                // Put sticky posts at the top of the posts array
    2474                 $sticky_posts = get_option('sticky_posts');
    2475                 if ( $this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['caller_get_posts'] ) {
    2476                         $num_posts = count($this->posts);
    2477                         $sticky_offset = 0;
    2478                         // Loop over posts and relocate stickies to the front.
    2479                         for ( $i = 0; $i < $num_posts; $i++ ) {
    2480                                 if ( in_array($this->posts[$i]->ID, $sticky_posts) ) {
    2481                                         $sticky_post = $this->posts[$i];
    2482                                         // Remove sticky from current position
    2483                                         array_splice($this->posts, $i, 1);
    2484                                         // Move to front, after other stickies
    2485                                         array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
    2486                                         // Increment the sticky offset.  The next sticky will be placed at this offset.
    2487                                         $sticky_offset++;
    2488                                         // Remove post from sticky posts array
    2489                                         $offset = array_search($sticky_post->ID, $sticky_posts);
    2490                                         unset( $sticky_posts[$offset] );
    2491                                 }
    2492                         }
     2474                foreach(get_post_types() as $sticky_post_type) {
     2475                    if( !post_type_supports( $sticky_post_type, 'sticky') ) {
     2476                        continue;
     2477                    }
     2478                   
     2479                    if( 'post' == $sticky_post_type) {
     2480                        // get the core post stickies
     2481                        $sticky_posts = get_option('sticky_posts');
     2482                    } else { // TODO: Need a conditional here to see if stickies to be combined?
     2483                        continue;
     2484                        // get the custom_post_type stickies
     2485                        // $sticky_posts = get_option('sticky_'.$sticky_post_type);
     2486                    }
     2487                    if ( $this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['caller_get_posts'] ) {
     2488                            $num_posts = count($this->posts);
     2489                            $sticky_offset = 0;
     2490                            // Loop over posts and relocate stickies to the front.
     2491                            for ( $i = 0; $i < $num_posts; $i++ ) {
     2492                                    if ( in_array($this->posts[$i]->ID, $sticky_posts) ) {
     2493                                            $sticky_post = $this->posts[$i];
     2494                                            // Remove sticky from current position
     2495                                            array_splice($this->posts, $i, 1);
     2496                                            // Move to front, after other stickies
     2497                                            array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
     2498                                            // Increment the sticky offset.  The next sticky will be placed at this offset.
     2499                                            $sticky_offset++;
     2500                                            // Remove post from sticky posts array
     2501                                            $offset = array_search($sticky_post->ID, $sticky_posts);
     2502                                            unset( $sticky_posts[$offset] );
     2503                                    }
     2504                            }
    24932505
    2494                         // If any posts have been excluded specifically, Ignore those that are sticky.
    2495                         if ( !empty($sticky_posts) && !empty($q['post__not_in']) )
    2496                                 $sticky_posts = array_diff($sticky_posts, $q['post__not_in']);
     2506                            // If any posts have been excluded specifically, Ignore those that are sticky.
     2507                            if ( !empty($sticky_posts) && !empty($q['post__not_in']) )
     2508                                    $sticky_posts = array_diff($sticky_posts, $q['post__not_in']);
    24972509
    2498                         // Fetch sticky posts that weren't in the query results
    2499                         if ( !empty($sticky_posts) ) {
    2500                                 $stickies__in = implode(',', array_map( 'absint', $sticky_posts ));
    2501                                 // honor post type(s) if not set to any
    2502                                 $stickies_where = '';
    2503                                 if ( 'any' != $post_type && '' != $post_type ) {
    2504                                         if ( is_array( $post_type ) ) {
    2505                                                 $post_types = join( "', '", $post_type );
    2506                                         } else {
    2507                                                 $post_types = $post_type;
    2508                                         }
    2509                                         $stickies_where = "AND $wpdb->posts.post_type IN ('" . $post_types . "')";
    2510                                 }
     2510                            // Fetch sticky posts that weren't in the query results
     2511                            if ( !empty($sticky_posts) ) {
     2512                                    $stickies__in = implode(',', array_map( 'absint', $sticky_posts ));
     2513                                    // honor post type(s) if not set to any
     2514                                    $stickies_where = '';
     2515                                    if ( 'any' != $post_type && '' != $post_type ) {
     2516                                            if ( is_array( $post_type ) ) {
     2517                                                    $post_types = join( "', '", $post_type );
     2518                                            } else {
     2519                                                    $post_types = $post_type;
     2520                                            }
     2521                                            $stickies_where = "AND $wpdb->posts.post_type IN ('" . $post_types . "')";
     2522                                    }
    25112523
    2512                                 $stickies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID IN ($stickies__in) $stickies_where" );
    2513                                 foreach ( $stickies as $sticky_post ) {
    2514                                         // Ignore sticky posts the current user cannot read or are not published.
    2515                                         if ( 'publish' != $sticky_post->post_status )
    2516                                                 continue;
    2517                                         array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
    2518                                         $sticky_offset++;
    2519                                 }
    2520                         }
    2521                 }
     2524                                    $stickies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID IN ($stickies__in) $stickies_where" );
     2525                                    foreach ( $stickies as $sticky_post ) {
     2526                                            // Ignore sticky posts the current user cannot read or are not published.
     2527                                            if ( 'publish' != $sticky_post->post_status )
     2528                                                    continue;
     2529                                            array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
     2530                                            $sticky_offset++;
     2531                                    }
     2532                            }
     2533                    }
     2534                }
    25222535
    25232536                if ( !$q['suppress_filters'] )
    25242537                        $this->posts = apply_filters_ref_array('the_posts', array( $this->posts, &$this ) );