WordPressのループで呼んでないのにいつも来る記事の原因と対処法
WPでおなじみWP_query($args)
で$args
になんやかんや指定して一覧を表示する処理を書いていたところ、どんなクエリにしても必ず現れる記事があってハマりました。post_type
に別の投稿タイプを指定してるのに…。
全然お呼びじゃあないのにいつも現れるこいつ。こいつの正体を暴いたのでシェアします。
いつも取得してしまう記事の正体は「先頭固定表示」だった
お恥ずかしながら今回はじめて知った機能、それが 「投稿の先頭固定表示」 。
WPデフォルトの投稿のみで使用可能な機能で、記事編集画面の文書タブにあるオプション。これにチェックを入れると、次の新しい固定表示投稿が公開されるまでの間、その投稿を必ず一番上に表示することができます。
言い換えれば、WP_query()
で記事を取ってくるときに必ず取得されるということ。
例えば、以下のように投稿タイプが「お知らせ」にあたる記事のみを持ってきたいのに、デフォルトの先頭固定表示記事が一番上に表示されてしまいます。
$args = array(
'post_type' => array('news'),
'posts_per_page' => 20,
);
$the_query = new WP_Query($args);
// →取得結果が「固定表示記事,お知らせ1,お知らせ2,...」のようになる
「先頭固定表示」の記事を除外する方法
この記事を除外するためには、ソースコードに以下の一行を追加すればOKでした。
$args = array(
'post_type' => array('news'),
'posts_per_page' => 20,
+ 'ignore_sticky_posts' => 1,
);
$the_query = new WP_Query($args);
このignore_sticky_posts
は、先頭固定表示の投稿を無視するためのパラメータで、デフォルトではfalseになっています。これをtrueにしてあげれば無事に消えてくれました。
ちなみに、このパラメータを指定しても、先頭に出てくるのを無視するだけであり、本来その記事があるべき場所にはちゃんと出てくるみたいですのでそこはご安心を。
先頭固定表示の運用面での問題
この機能、テーマを実装する側のいまの率直な感想としては、「使わないでほしい」 です…。
今回の僕のように、運営者と実装者が異なる場合、特に問題があると思っていて、運営サイドからすれば 「固定ツイートみたいで便利じゃん!」 と思うかもしれません。
でも実装サイドからすれば 「どの記事でもクエリで取れるから言ってくれェ…」 だと思います。
そもそもデフォルトの投稿タイプ(post_type = 'post')でしか使えない機能ってなんなの…ですし、他の投稿タイプと同じように扱うためにも「先頭固定表示」は極力使わない運用にするのがいいのかなという感想でしたっ。
Discussion