WordPressで「先頭に固定表示」が効かない!?解決法を調べたよ

自作のWordPressテーマで「先頭に固定表示」ができなくて、ちょっと慌てたお話です。
自作のテーマでトップページ(front-page.php)に最新の投稿を5件くらい表示させたりするじゃないですか。
そこに、投稿が「先頭に固定表示」されなくて…。
でも、index.phpとかarchive.phpではちゃんと固定表示されているんですよ。
調べてみたら、意外とカンタンに解決しました。

原因は「get_posts()」

get_posts()」を使うと「先頭に固定表示」が無効になるらしいです。
代わりに「WP_Query()」を使えば、すぐに直ります。
今まで投稿の一覧系取得には「get_posts()」を使ってきてたんですが、こんな落とし穴があったとは…。
これからは「WP_Query」を使う方が無難かなぁと思っています。

「WP_Query()」を使う書き方

「WP_Query()」と「get_posts()」とでは少し書き方が変わります。
表示させたい箇所に下記のコード書きます。

$arg = array(
  'post_type' => 'post', //postは通常の投稿の場合(省略可)、カスタム投稿の時は投稿タイプのスラッグ名を指定する
 'posts_per_page' => 5, //表示記事件数(-1で全件表示)
 'category' => 10, //カテゴリーIDが10の記事にしぼりこみたいとき
 'orderby' => 'date', //並び順
 'order' => 'DESC' //降順(日付の新しい順)
);
$posts = new WP_Query($arg);

これで$postsの中に条件が満たされた記事が取得されました。
取得するまでの流れは「get_posts()」と同じです。

表示させる時に「get_posts()」では「foreach」を使ってループ処理していましたが「WP_Query」では「while」を使います。

<?php if($posts->have_posts()):
 while($posts->have_posts()):$posts->the_post();?>
  ここにループ内容
<?php endwhile;
 wp_reset_query();
else:?>
 記事がないとき
<?php endif;?>

ほぼ同じなのに、先頭固定表示の心配が無いなら、こちらを使う方がいいですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です