WordPress
대체 주 루프 (pre_get_posts 필터)
수색…
통사론
- add_action ( 'pre_get_posts', 'callback_function_name');
- function 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()
사용하여 범주, 태그 또는 사용자 정의 분류 아카이브 페이지를 is_category()
있습니다.
WordPress에서 사용할 수있는 조건부 태그를 사용할 수 있습니다.
하나의 카테고리에서만 소식 표시
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 개의 게시물 만 표시하도록 지정할 수 있습니다. 또는 하나의 카테고리에서만 게시물을 표시하거나 카테고리를 제외하는 등
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()
메서드를 사용하는 것뿐입니다.
여기에는 두 가지 인수가 필요합니다. 먼저 설정하려는 값과 설정할 값입니다.
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
필터를 말 그대로 모든 루프에 적용합니다. 콜백 함수에서 변경 한 모든 변경 사항이 모든 기존 루프에 적용된다는 의미입니다.
분명히 대부분의 시나리오에서 우리가 원하는 것은 아닙니다.
대부분의 경우 메인 루프 만 타겟팅하고 관리자가 아닌 화면을 대상으로합니다.
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
}