自作の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_postdata();
else:?>
記事がないとき
<?php endif;?>
ほぼ同じなのに、先頭固定表示の心配が無いなら、こちらを使う方がいいですね。
追記
WP_Query()を使っても「先頭に固定表示」ができないケースを発見しました。
こちらの記事も参考にしてください。