WordPress 사용자 정의 쿼리 – WP_Query 클래스 사용

게시 됨: 2021-02-06

워드프레스는 대부분의 경우 데이터베이스에서 필요한 정보를 검색할 수 있는 바로 사용할 수 있는 광범위한 기능을 제공합니다. 그러나 WordPress 웹 사이트를 개발할 때 필터 또는 작업이 원하는 결과를 얻기에 충분하지 않은 수많은 시나리오가 있습니다. 이러한 경우. WordPress는 WP_Query 클래스 형식으로 해결 방법을 제공합니다.

WP_Query 클래스를 사용하는 방법을 살펴보겠습니다!

사용자 지정 쿼리 사례

참고: 이 기사에서는 PHP 및 MySQL/MariaDB에 대한 지식이 어느 정도 있고 WordPress 작업에 익숙하다고 가정합니다.

어떤 페이지를 방문하든 워드프레스는 '메인 쿼리'를 실행하여 콘텐츠를 표시합니다. 따라서 예를 들어 카테고리 보기와 같은 페이지를 방문하면 WP_Query 객체가 뒤에서 생성되고 페이지를 표시하기 위해 데이터베이스에서 필요한 모든 데이터를 검색합니다.

WP_Query 가 기본적으로 하는 일은 SQL 쿼리를 사용하지 않고도 웹사이트의 데이터베이스에서 콘텐츠를 검색할 수 있는 기능을 제공하는 것입니다.

이를 수행하기 위해 우리가 해야 할 일은 우리의 요구에 해당하는 인수를 정의하는 것뿐이며 새 WP_Query 객체가 생성되어 SQL 쿼리로 변환됩니다.

WP_Query를 사용한 예

다른 카테고리 템플릿 내에서 특정 카테고리의 게시물을 표시하려면 새 쿼리 개체를 만들어야 합니다.

이 예의 목적을 위해 Twenty Twenty 테마를 활성화하고 '카테고리 1'이라는 범주 아래에 2개의 게시물을 만들고 '서비스'라는 범주에 2개의 게시물을 만들었습니다.

또한 '카테고리 1' 게시물에 대한 사용자 정의 카테고리 보기 템플릿을 만들었습니다. 이 카테고리의 슬러그는 'category-1'이므로 테마 폴더 아래의 파일은 category-CATEGORYSLUG.php 여야 하며 이 경우에는 category-category-1.php 입니다.

category-category-1.php 파일에 다음을 붙여넣으십시오.

 <?php /*** Custom Category 1 Template */ get_header(); ?> <main role="main"> <section class="site-content"> <div role="main"> <?php if ( have_posts() ) : ?> <header class="archive-header"> <h3 class="archive-title">Category: <?php single_cat_title( '', true ); ?></h3> </header> <?php while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; endif; ?> </div> </section> </main> <?php get_sidebar(); ?> <?php get_footer(); ?>

루프 전에 have_posts 메서드를 사용하여 루프에 더 많은 게시물이 있는지 확인합니다.

루프가 게시물을 반복하고 WordPress에 게시물 배열의 다음 게시물로 이동하도록 지시하려면 the_post() 가 필요합니다.

이 시점에서 카테고리( https://mycompanyname.com/category/category-1/ )의 프런트엔드 보기는 다음과 같습니다.

이 코드를 사용하여 많은 게시물 정보를 포함하는 것을 무시했다는 것을 알고 있지만 이 예에서는 간단하게 유지하고 게시물 제목만 표시하는 것이 좋습니다.

WordPress가 이 보기에 대해 만든 쿼리 개체 속성을 보려면 코드에서 endif; 성명.

 var_dump ( $wp_query->query_vars );

이제 페이지를 새로 고치면 게시물 목록 아래에 다음 정보가 표시됩니다.

 array(63) { ["category_name"]=> string(10) "category-1" ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["tag"]=> string(0) "" ["cat"]=> int(16) ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(0) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["post_type"]=> string(0) "" ["posts_per_page"]=> int(10) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" }

위에서 설명한 게시물 아래에 '서비스' 카테고리에 속하는 게시물 목록을 표시하고 싶다고 가정해 봅시다. 페이지가 이미 현재 범주에 대한 쿼리 개체를 생성했으므로 기존 기본 쿼리 인수를 조작하여 이 문제를 해결해야 합니다.

WordPress를 통해 이를 달성할 수 있는 방법을 살펴보겠습니다.

query_posts 함수

query_posts() 함수는 WordPress가 게시물을 표시하는 데 사용하는 기본 쿼리를 변경하는 방법입니다. 메인 쿼리를 한쪽에 놓고 새 쿼리로 대체하여 이를 수행합니다. 소개된 wp-includes/query.php 파일에서 이를 직접 확인할 수 있습니다.

 function &query_posts($query) { unset($GLOBALS['wp_query']); $GLOBALS['wp_query'] =& new WP_Query(); return $GLOBALS['wp_query']->query($query); }

endwhile; 현재 표준 루프의.

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

그리고 당신은 간다:

그러나 이 방법에는 단점이 있습니다. 쿼리 개체에 포함된 범주를 인쇄하려고 하면 변경되었음을 알 수 있습니다.

var_dump ( $wp_query->query_vars["category_name"] ); 서비스 쿼리 후 페이지를 새로 고칩니다. 다음 결과가 표시되어야 합니다.

 string(8) "services"

쿼리가 변경되었지만 되돌려지지 않았기 때문에 발생한 문제입니다. 이 접근 방식은 쿼리를 따르는 콘텐츠에 많은 문제를 일으킬 수 있습니다.

이러한 충돌을 피하고 query_posts 를 호출한 후 정리하려면 wp_reset_query() 를 호출하면 원래 기본 쿼리가 복원됩니다. 따라서 코드는 다음과 같아야 합니다.

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

페이지를 새로 고치면 이제 초기 페이지 범주가 쿼리에 다시 포함된 것을 볼 수 있습니다.

 string(10) "category-1"

마지막으로 query_posts 는 실제로 기본 쿼리를 다시 실행하게 하므로 쿼리에 오버헤드를 추가하므로 피해야 합니다.

get_posts() 함수

주어진 기준과 일치하는 게시물 배열을 검색하기 위해 get_posts() 함수를 사용하여 동일한 결과를 얻을 수 있습니다.

아래 표시된 서비스 루프를 교체하십시오…

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

... 이것으로:

 $my_query = get_posts( array ( 'category' => 17 ) ); foreach($my_query as $post) : setup_postdata($post); the_title( '<h4 class="example"></h4>' ); endforeach; var_dump ( $wp_query->query_vars["category_name"] );

이번에는 워드프레스에서 정의한 get_posts() 인수에 따라 카테고리 이름 대신 카테고리 ID로 작업해야 했습니다.

여기서 주목해야 할 또 다른 중요한 점은 쿼리를 재설정하지 않았음에도 쿼리 범주의 var_dump 출력이 그대로 유지되고 'services'로 변경되지 않았다는 것입니다. get_posts() 자체가 기본 쿼리를 변경하지 않기 때문입니다. 새 변수 ' $my_query '를 사용하여 교체하지 않고 쿼리 개체의 새 인스턴스를 생성했습니다.

get_posts() 함수는 query_posts() 와 동일한 매개변수를 사용하며 안전하고 사용하기 쉽기 때문에 템플릿의 아무 곳에나 정적 사용자 정의 루프를 추가하려는 경우에 사용하는 것이 좋습니다.

새 WP_Query 개체 만들기

$wp_queryWP_Query 클래스의 객체이며 현재 페이지에 필요한 데이터베이스 콘텐츠를 검색합니다. 이 클래스를 재정의하는 것은 결과를 사용자 정의하고 다른 콘텐츠를 표시하는 방법입니다.

이것은 우리가 사용할 코드입니다:

 $services_query = new WP_Query( 'category_name=services' ); if ( $services_query->have_posts() ) { while ( $services_query->have_posts() ) : $services_query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; } wp_reset_postdata(); var_dump ( $wp_query->query_vars["category_name"] );

'category_name' 인수를 사용하여 게시물을 표시하려는 카테고리의 슬러그를 정의했습니다.

새 객체를 저장했습니다. new WP_Query( 'category_name=services' ); $services_query 변수에서.

그런 다음 while 루프를 사용하여 내용을 표시한 후 wp_reset_postdata(); 메인 쿼리의 원래 데이터로 복원하기 위해.

WP_Query WordPress 클래스의 다른 인수를 실험하고 싶다면 WordPress Codex 페이지에서 전체 목록을 찾을 수 있습니다.