How to Add Sticky Posts in WordPress Custom Post Type Archives
Recently one of our users asked us if it was possible to add sticky posts to custom post type archives. By default, WordPress has the sticky functionality available for posts, but not for other post types. In this article we will show you how to add sticky posts in WordPress custom post type archives. Before we move forward, you would probably want to learn how to create custom post types in WordPress.
Adding Sticky Posts in Custom Post Types
First thing you need to do is install and activate the Sticky Custom Post Types plugin. After activating the plugin, go to Settings » Reading and scroll down to the section Sticky Custom Post Types. Next, you need to choose the custom post types where you want Stick This option to be enabled.
Now what we have done here is that we have added sticky posts feature to our custom post types. Sticky posts in custom post types will be displayed on the front page just like regular sticky posts.
The problem is that by default WordPress only shows sticky posts on the home page. It does not show sticky posts on archive pages.
Displaying Sticky Posts in Custom Post Type Archives
Lets assume that you have a custom post type for Movie Reviews with sticky posts enabled using the plugin we have mentioned above. Now you want your sticky posts in movie reviews post types to be displayed differently and on top of non-sticky regular movie reviews. Like this:
To achieve this goal, first thing you need is an archive template for your custom post type like this: archive-post-type.php
. Learn how to create custom post type archive page. For example, if you have a custom post type movie-reviews
then your archive page template should be archive-movie-reviews.php
. If you do not have a template, create one. Simply copy the contents of archive.php in your theme’s directory and paste them into a new file archive-your-post-type.php
.
The next step is to add this code in your theme’s functions.php
file:
function wpb_cpt_sticky_at_top( $posts ) { // apply it on the archives only if ( is_main_query() && is_post_type_archive() ) { global $wp_query; $sticky_posts = get_option( 'sticky_posts' ); $num_posts = count( $posts ); $sticky_offset = 0; // Find the sticky posts for ($i = 0; $i < $num_posts; $i++) { // Put sticky posts at the top of the posts array if ( in_array( $posts[$i]->ID, $sticky_posts ) ) { $sticky_post = $posts[$i]; // Remove sticky from current position array_splice( $posts, $i, 1 ); // Move to front, after other stickies array_splice( $posts, $sticky_offset, 0, array($sticky_post) ); $sticky_offset++; // Remove post from sticky posts array $offset = array_search($sticky_post->ID, $sticky_posts); unset( $sticky_posts[$offset] ); } } // Look for more sticky posts if needed if ( !empty( $sticky_posts) ) { $stickies = get_posts( array( 'post__in' => $sticky_posts, 'post_type' => $wp_query->query_vars['post_type'], 'post_status' => 'publish', 'nopaging' => true ) ); foreach ( $stickies as $sticky_post ) { array_splice( $posts, $sticky_offset, 0, array( $sticky_post ) ); $sticky_offset++; } } } return $posts; } add_filter( 'the_posts', 'wpb_cpt_sticky_at_top' ); // Add sticky class in article title to style sticky posts differently function cpt_sticky_class($classes) { if ( is_sticky() ) : $classes[] = 'sticky'; return $classes; endif; return $classes; } add_filter('post_class', 'cpt_sticky_class');
The above code would move your sticky posts to the top, and if your theme is using post_class()
function, then it would add sticky in the post class.
You can style your sticky posts by using .sticky
class in your stylesheet. Example:
.sticky { background-color:#ededed; background-image:url('https://example.com/wp-content/uploads/featured.png'); background-repeat:no-repeat; background-position:right top; }
We hope this article helped you add sticky posts in custom post type archives. For questions and feedback please leave a comment below.
Source: Tareq Hasan