「先頭に固定表示」をすると総数がずれてしまう時の対処法

コーポレートサイトのトップページで「お知らせ」を表示していますが、「先頭に固定表示」を使いたいというお話がきたので手を入れました。

最新記事から4件を表示していましたが、ずっと掲載したいものがあるということです。

 

この場合「先頭に固定表示」を単に有効にするだけだと、書き方によって以下のような問題が発生してしまう可能性があります。(実際にやってから気付きました。)

表示したい合計記事数が増えてしまう…(例:「先頭に固定」2+最新4で表示数が6)

同じ記事がダブって表示される…(「先頭に固定」した記事が最新3記事内だと同じ記事がダブって表示される)

 

とりあえず本件のコード

<h2>お知らせ</h2>
<ul>
<!--「先頭に固定」する記事のみを取得-->
<?php $parm_b = array(
'posts_per_page' => -1,
'category_name' => 'news',
'post_type' => 'post',
'post__in' => get_option( 'sticky_posts' )
);
$the_query = new WP_Query( $parm_b );?>
<?php $posts = get_posts( $parm_b );?>
<?php if ( $posts ) :?>
<?php
foreach ( $posts as $post ) :
setup_postdata( $post ); ?>
<!--「先頭に固定」の数を格納-->
<?php $sentou=count($posts);?>
<li>
<?php if(has_post_thumbnail()): ?>
<a href="<?php the_permalink(); ?>">
<div><?php the_post_thumbnail('medium'); ?></div>
<?php else: ?>
<a href="<?php the_permalink(); ?>">
<div><img src="<?php echo get_template_directory_uri(); ?>/img/news.png">
</div>
<?php endif;?>
<dl>
<dt><?php the_time('Y/m/d') ;?></dt>
<dd><?php the_title(); ?></dd>
</dl>
</a>
</li>
<?php endforeach; endif;?>
<!--「先頭に固定」分を表示したい合計数(ここでは4)から引く-->
<?php $list_count = 4-$sentou;?>
<!--上で取得した数分だけ最新記事を取得する-->
<?php
$parm = array (
'posts_per_page' => $list_count,
'order' => 'DESC',
'category_name' => 'news',
//最新記事の配列から「先頭に固定」にした分を除外する
'post__not_in' => get_option( 'sticky_posts' )
);?>
<?php $posts = get_posts( $parm ); ?>
<?php if ( $posts ) :?>
<?php
foreach ( $posts as $post ) :
setup_postdata( $post ); ?>
<li>
<?php if(has_post_thumbnail()): ?>
<a href="<?php the_permalink(); ?>">
<div><?php the_post_thumbnail('medium'); ?></div>
<?php else: ?>
<a href="<?php the_permalink(); ?>">
<div><img src="<?php echo get_template_directory_uri(); ?>/img/news.png">
</div>
<?php endif; ?>
<dl>
<dt><?php the_time('Y/m/d') ;?></dt>
<dd><?php the_title(); ?></dd>
</dl>
</a>
</li>
<?php endforeach; endif;?>
</ul>

もともとは<?php  $parm = array (……以降のソースでした。

シンプルに「先頭に固定表示」するliの取得を先に行ない、同じパターンを二回繰り返すような形です。

考え方と手順

1.まずは先頭固定記事のみを取得する
‘post__in’=> get_option( ‘sticky_posts’ )

2.「先頭に固定表示」以外のnewsカテゴリの記事を取得する。これをつけないとダブって同じものが表示されるケースがあるから。
‘post__not_in’ => get_option( ‘sticky_posts’ )

3.設定が4記事表示なので’posts_per_page’=4だが
このままだと「先頭固定記事」分だけ数が増えてしまうので引き算する

引き算の方法
①countを使って「先頭固定記事」の数($posts)を取ってくる
$fixed=count($posts)
②表示したい合計数(4)から引く
$list_count = 4-$fixed
③結果を固定以外のnewsカテゴリの記事の配列に入れる
‘posts_per_page’ => $list_count

 

ちなみに参考にさせていただいたサイトは以下です。

先頭に固定表示をトップページ以外で利用する - Qiita
```php <div class="subLoop"> <ul class="list vertical"> <?php $list_count = 5...
サイドバーなどの記事一覧で先頭固定を有効にする | o-84.com
WordPressでサイドバーなどのメインループと関係ない部分の一覧で先頭固定を有効にする方法をご紹介します。 WordPress 2.7から実装された記事の先頭固定表示ですが、メインのインデック...

コメント