수색…


통사론

  • 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
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow