WP で固定ページも一覧する方法 pre_get_posts を使う
トップページやアーカイブページなどで複数のページを取得して一覧するとき、固定ページも含めたい場合があります。 pre_get_posts アクションにフックして、WordPress が一覧するページを取得する条件を変更することで、固定ページを一覧に含めることができます。
pre_get_posts にフックする具体的な方法
ここでは、未分類カテゴリを除いた投稿・固定ページを取得するように設定します。
具体的には次のようなコードになります。解説は後述します。
add_action('pre_get_posts', 'custom_pre_get_posts');
function custom_pre_get_posts($query)
{
if(is_admin() || !($query -> is_main_query()))
{
return;
}
if(is_home() || is_archive())
{
$query -> set('post_type', array('page', 'post'));
}
}
管理画面でも pre_get_posts は呼び出されるので注意する
is_admin
は管理画面などで情報を取得する場合に true を返します。is_admin
のチェックは重要です。
特殊な会員制サービスなどでない限り、管理画面にはすべての投稿が表示されるべきです。
pre_get_posts 関数(アクション)は、ログインユーザが見る管理画面でも呼び出されています。 例えば投稿ページの一覧などです。
管理画面では特別な設定を抜きに、標準の設定のまま一覧されてほしいので、 管理画面であるか、あるいは管理画面で発生したクエリであるときには、何も処理しません。
クエリとは
Wordpress におけるクエリ (query) とは、データベースから必要な情報を取得するための命令です。
Wordpress はデータベースに「Xの情報をください」とクエリ(命令)を送り、 データベースから送られてきた情報を処理してページに出力します。クエリの詳細については公式の資料を参照してください。
- query_posts - WordPress.org
- http://codex.wordpress.org/Template_Tags/query_posts
メインクエリ / サブクエリ
is_main_query
はクエリがメインクエリであるときに true を返します。
メインクエリとは Wordpress 本体が(自動的に)発行したクエリです。
一方で、サブクエリは任意に発行されたクエリです。 ここではサブクエリの場合には、未分類カテゴリも対象に含めるようにしています。
固定ページを含める
Wordpress の既定の設定では、投稿ページのみが取得されます。 パラメータ post_type に page (固定ページ) を追加して、固定ページも取得対象に含めます。