記事最終更新日:2017年09月06日
記事投稿日:2017年06月14日
閲覧数:6964 views
pre_get_postsの使い方メモ -【WordPress&PHP】
はじめに
今回のD.M.C.【デベメモドットコム】の記事は「pre_get_postsの使い方メモ」という事で、WordPressのpre_get_postsアクションフックの使い方を出来るだけ詳しくメモ(解説)していきます。
はじめにpre_get_postsフックで何ができるのかというと、WordPressで使用するメインクエリをカスタマイズする事ができます。
メインクエリ・メインループについて
基本的にWordPressはパーマリンクの設定にもよりますがリライトを行い、ページ毎にパラメータをつけデータベースに問い合わせをします。
そして問い合わせ結果を$wp_queryオブジェクトに格納します、そしてこれをメインクエリ呼びます。
ページ毎に適切なクエリがセットされ、下記のようにメインループを使用する事でテンプレートに基づいた情報が処理出来るようになっています。
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php // 処理 ?>
<?php endwhile; ?>
<?php endif; ?>
サブループについて
カスタマイズしていくと、メインループだと融通がきかなったりして使用せずに下記のようにサブループを使用しすぎてデータベースへの問い合わせが多くなると事があると思います。
<?php
$params = array(
'key' => 'value',
'key' => 'value',
'key' => 'value',
);
$query = new WP_Query($params);
?>
<?php if ($query->have_posts()) : ?>
<?php while ($query->have_posts()) : $query->the_post(); ?>
<?php // ループ処理 ?>
<?php the_title(); ?>
<a href="<?php the_permalink(); ?>">
<h2><?php the_title(); ?></h2>
<time><?php the_time('Y年m月d日'); ?></time>
<?php if (has_post_thumbnail()) : ?>
<?php the_post_thumbnail(); ?>
<?php else : ?>
<?php // 画像がない時 ?>
<?php endif; ?>
>/a<
<?php the_content; ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
pre_get_postsの基本的な使い方
メインクエリはページ毎に自動的にセットされる為、細かなクエリを変更したい場合は今まではquery_posts関数を使用していたのですが、この関数は非推奨になったことにより最近ではアクションフックのpre_get_postsを使用してメインクエリをカスタマイズする方法が主流になっています。
基本的にメインループ自体の書き方は始めに紹介したメインループの書き方でよく、どうメインクエリをカスタマイズするのかというと、functions.phpにadd_actionでpre_get_postsをフックしてこちらで定義したコールバック関数のcustom_mein_query関数に処理を書いていきます。
まず始めに何をしているのかというと、is_admin()関数で管理画面かをチェックし、否定演算子の!とis_main_query()関数でメインクエリかどうかをチェックしています。
もし管理画面かメインクエリではない場合は直ちにreturn分が実行されて関数を抜けます。
<?php
function custo_main_query($query)
{
if (is_admin() || !$query->is_main_query()) {
return;
}
}
add_action('pre_get_posts', 'custom_main_query');
メインクエリのカスタマイズ
実際のカスタマイズとしてはよくあるのがページごとの表示件数の変更で、今回はトップページの表示件数を変更してみたいと思います。
下記の内容は、まずif文とis_homeのページ分岐でトップページかどうかの判定を行いTRUEの場合はオブジェクトのsetメソッドでプロパティと値を設定しています。
posts_per_pageを10に設定する事によって表示件数を10件にしています。
<?php
function custo_main_query($query)
{
if (is_admin() || !$query->is_main_query()) {
return;
}
if ($query->is_home()) {
$query->set('posts_per_page', 10);
return;
}
}
add_action('pre_get_posts', 'custom_main_query');
他にもいろいろな事ができると思いますが、基本的にはページごとの条件分岐を行いsetメソッドを使用してメインクエリをカスタマイズしていくという流れが主流だと思います。
主な条件分岐は下記になっています。
<?php
function custo_main_query($query)
{
if (is_admin() || !$query->is_main_query()) {
return;
}
// トップページ
if ($query->is_home()) {
// 処理内容
return;
}
// 固定ページ
if ($query->is_page()) {
// 処理内容
return;
}
// アーカイブページ
if ($query->is_archive()) {
// 処理内容
return;
}
// カスタム投稿タイプアーカイブページ
if ($query->is_post_type_archive('post_type')) {
// 処理内容
return;
}
// 日付アーカイブページ
if ($query->is_date()) {
// 処理内容
return;
}
// 年別アーカイブページ
if ($query->is_year()) {
// 処理内容
return;
}
// 月別アーカイブページ
if ($query->is_month()) {
// 処理内容
return;
}
// 制作者アーカイブページ
if ($query->is_author()) {
// 処理内容
return;
}
// カテゴリーページ
if ($query->is_category()) {
// 処理内容
return;
}
// タグページ
if ($query->is_tag()) {
// 処理内容
return;
}
// タクソノミーページ
if ($query->is_tax()) {
// 処理内容
return;
}
//詳細ページ
if ($query->is_single()) {
// 処理内容
return;
}
// 検索結果ページ
if ($query->is_search()) {
// 処理内容
return;
}
// フィードページ
if ($query->is_feed()) {
// 処理内容
return;
}
// 404ページ
if ($query->is_404()) {
// 処理内容
return;
}
}
add_action('pre_get_posts', 'custom_main_query');
WordPress Codex 条件分岐タグの詳しい詳細はこちら
WordPress Codex pre_get_postsの詳細はこちら
感想
今までメインクエリをカスタマイズする際は非推奨のquery_postsを使用していましたが、pre_get_postsフックを使う事で使用方法は違いますがページ毎にメインクエリのカスタマイズができるので紹介できてよかったと思います。
では最後まで読んでいただき、ありがとうございました。
About / ブログについて
D.M.C.【デベメモドットコム】はWEB制作に関することを中心に、
その他、関連する事まで出来るだけわかりやすく備忘録としてメモを残していくブログです。
このブログを通して少しでも為になる情報を発信して皆さんと共有できればとても嬉しいです。