WordPressには特定の記事を先頭に固定表示させる機能があるのですが、カスタム投稿タイプを利用する場合はこの機能を使うことができません。
そこで今回はSticky Custom Post Typesというプラグインを使って、カスタム投稿タイプの記事でも先頭に記事を固定表示させる方法を紹介させていただきます。
※プラグインの設定だけでなく、functions.phpも編集する必要がありますので、その当たりも合わせて紹介させていただきます。
Sticky Custom Post Types のインストール
管理画面のプラグイン新規追加よりSticky Custom Post Typesを検索するか、以下のページからプラグインファイルをダウンロードします。Sticky Custom Post Types
Sticky Custom Post Types の設定と固定表示
Sticky Custom Post Typesプラグインを有効にしたら、管理画面左メニューの「設定」より「表示設定」へ進み、表示設定ページ下部の「Sticky Custom Post Types」欄で、固定表示機能を使いたいポストタイプにチェックを入れます。
※上記図の「sample」というのが、このブログで利用している「サンプル」という名前のカスタム投稿タイプです。
これで、カスタム投稿タイプの記事詳細(編集)ページに戻ると「先頭に固定表示」ウィンドウが現れますので、「Stick this to the front page」にチェックを入れます。
ブログのカスタム投稿タイプ記事一覧ページで固定表示を反映
ここまでの設定で、管理画面上では「先頭に固定表示」と記載されているのですが、ブログのカスタム投稿タイプの記事一覧ページでは、Stick this to the front page にチェックを入れただけでは固定表示が反映されないため、以下のコードをご利用のテーマファイルのfunctions.phpへ追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
<?php /** * Put sticky posts to top at custom post archives * * WordPress doesn't do any processing for sticky posts in custom post type archives. * It process sticky posts in homepage only (is_home()). This function processes * sticky posts at custom post archive page and puts them to the top of list. * * @author Tareq Hasan (http://tareq.weDevs.com) * * @param array $posts array of queried posts * @return array */ function wedevs_cpt_sticky_at_top( $posts ) { // apply the magic on post archive 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; // loop through the post array and find the sticky post 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] ); } } // Fetch sticky posts that weren't in the query results 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', 'wedevs_cpt_sticky_at_top' ); ?> |
コメント