WordPress
交互のメインループ(pre_get_postsフィルタ)
サーチ…
構文
- add_action( 'pre_get_posts'、 'callback_function_name');
- 関数callback_function_name($ query){}
- // PHP 5.3.0以上の場合
- add_action( 'pre_get_posts'、function($ query){});
パラメーター
パラメータ | 詳細 |
---|---|
$ query | (WP_Query)ループオブジェクト |
備考
PHP 5.3.0以上を使用している場合は、クロージャ( 匿名関数 )を使用して、
add_action( 'pre_get_posts', function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
});
より具体的なループターゲティング
メインループを変更したいとしましょう。具体的なタクソノミーや投稿タイプの場合のみです。
book
ポストタイプのアーカイブページのメインループのみを対象としています。
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
if( !is_post_type_archive( 'book' ) ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
// - and we are on 'book' post type archive page
}
また、使用して、カテゴリ、タグやカスタム分類のアーカイブページを確認することができis_category()
is_tag()
とis_tax()
。
WordPressで利用可能な任意の条件タグを使用することができます。
1つのカテゴリからの投稿を表示する
add_action( 'pre_get_posts', 'single_category' );
function single_category( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '1' );
return;
}
事前に投稿のフィルタの基本的な使用法を取得する
時にはメインのWordPressのクエリを変更したいと思うことがあります。
フィルタpre_get_posts
は、行く方法です。
たとえば、 pre_get_posts
を使用すると、 メインループに5つの投稿のみが表示されます。または、1つのカテゴリからの投稿のみを表示したり、カテゴリを除外するなど
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
// here goes logic of your filter
}
ご覧のとおり、 メインループのクエリーオブジェクトをコールバック関数の引数に渡しています。
ここで重要な点は、引数として引数を渡すことです。つまり、クエリを返す必要はなく、すべてのグローバルを設定する必要はありません。 $query
はメインクエリオブジェクトへの参照であるため、オブジェクトに対して行ったすべての変更はメインループオブジェクトに直ちに反映されます。
投稿リストの編集共有からカテゴリを除外
add_action( 'pre_get_posts', 'single_category_exclude' );
function single_category_exclude( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '-1' );
return;
}
メインループのposts_per_pageを変更する
$query
オブジェクトのset()
メソッドを使うだけです。
最初に設定したい値と設定する値の2つの引数をとります。
add_action( 'pre_get_posts', 'change_posts_per_page' );
function change_posts_per_page( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'posts_per_page', 5 );
return;
}
メインのWordPressループのみを対象とする
WordPressは、それが生成するすべてのループにpre_get_posts
フィルタをpre_get_posts
適用しています。これは、コールバック関数で行っているすべての変更がすべての既存のループに適用されることを意味します。
明らかに、それはほとんどのシナリオで私たちが望むものではありません。
ほとんどの場合、 メインループのみを対象とし、非管理画面のみを対象としたいと考えています。
is_main_query()
メソッドとis_admin()
グローバル関数を使用して、適切な場所にいるかどうかを調べることができます。
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
}