カスタム投稿タイプで最新◯件目までを表示し残りは開閉式にする:メモ

WordPress
WordPress

調べて半ば無理矢理できたのでメモ的に。「もっとスマートなのがあるよ!」という場合はお教えいただけますと幸いです。
なお、そもそもこういう作り方がどうなのという部分もあるかと思いますが、そのあたりの背景説明はご勘弁を。

カスタム投稿タイプで最新◯件目までを表示し残りは開閉式にする

タイトルだけだとなんだか分かりにくいですが、箇条書きにすると以下のような感じです。

  • サイドバーにカスタム投稿タイプの一覧を表示
  • 特定の記事数に達したらそれ以降は開閉式にする

ネックになったは、サイト公開時は該当のカスタム投稿タイプに属する記事が1つしかなく、今後100件まではいかずともそれなりに増えるという見通しがある点です。

1件しかないのに開閉式にしても意味はありませんし、特定に件数になった時に作業を行うのもあんまりなので自動的になんとかしたい、という次第でした。

作成したコード


<div class="side-nav">
  <ul>
<?php
$names = get_post_types( array( 'public'  => true, '_builtin' => false ) );
$posts = get_posts( array( 'post_type' => 'カスタム投稿タイプの名称','posts_per_page' => '20' ) ); //最新20件まで表示

foreach( $posts as $post ) {
  setup_postdata( $post );
  ?><li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li><?php
}
wp_reset_query();
?>
</ul>

<?php $counts = wp_count_posts( 'カスタム投稿タイプの名称', 'publish' ); if( ($counts->publish) >= 21 ): ?> 

<p id="toggle用のID">すべてを表示</p>

<ul>
<?php
$names = get_post_types( array( 'public'  => true, '_builtin' => false ) );
$posts = get_posts( array( 'post_type' => 'カスタム投稿タイプの名称','offset' => '20' ) ); 
foreach( $posts as $post ) {
  setup_postdata( $post );
  ?><li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li><?php
}
wp_reset_query();
?>
</ul>

<?php endif; ?>

  </div>

だいたいこんな感じです。以下詳細。

カスタム投稿タイプの表示件数


  <ul>
<?php
$names = get_post_types( array( 'public'  => true, '_builtin' => false ) );
$posts = get_posts( array( 'post_type' => 'カスタム投稿タイプの名称','posts_per_page' => '20' ) );

foreach( $posts as $post ) {
  setup_postdata( $post );
  ?><li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li><?php
}
wp_reset_query();
?>
</ul>

今回は仮に20件を境目にします。ので、まずは上の部分で20件まで表示の指定をしています。具体的に以下の設定です。


'posts_per_page' => '20'

カスタム投稿タイプ◯件投稿時に分岐

今回悩んだのがこの「カスタム投稿タイプ◯件投稿時に分岐させる」という部分です。投稿件数を分岐条件にしたことがなかったので、難儀しました。
ですが、探せばあるもので投稿数を取得するWordPressのテンプレートタグがありました。それが「wp_count_posts」です。詳細はCodexでどうぞ。

組み込んだのが以下の部分です。


<?php $counts = wp_count_posts( 'カスタム投稿タイプの名称', 'publish' ); if( ($counts->publish) >= 21 ): ?> 
※21件以上が公開されたら表示される内容
<?php endif; ?>

なお、分岐としては「存在する記事が21件以上」ではなく「公開された記事が21件以上」としたかったのでパラメータのstatus には「publish」を使っています。他にも「下書き」や「非公開」などがあります。詳細は下記のリンク先をどうぞ。

◯件目以降を表示

jQueryのtoggleを使ったアコーディンオンの実装はいろいろな所で解説されてますので省きまして。

後は21件名以降を表示させる部分です。これには「offset」を使います。


<ul>
<?php
$names = get_post_types( array( 'public'  => true, '_builtin' => false ) );
$posts = get_posts( array( 'post_type' => 'カスタム投稿タイプの名称','offset' => '20' ) ); 
foreach( $posts as $post ) {
  setup_postdata( $post );
  ?><li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li><?php
}
wp_reset_query();
?>
</ul>

offsetで指定する数字は「そこまでを省く」ということになりますので、21件目を表示させたい時は以下のようになります。


'offset' => '20' 

結び

書いていてなんですが、ほかではこの通りに使うことはまずないでしょうね…。
とはいえ、部分的には他に応用の効く部分もあるかと思います。多分。

3人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄