WordPress.org

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, 4 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 ) );