WordPress 사용자 정의 쿼리 – 다중 루프

게시 됨: 2021-01-29

대부분의 경우 WordPress로 웹 사이트를 구축할 때 설정 > 읽기 아래의 관리 옵션에서 정적 페이지를 표시하도록 선택하지 않는 한 활성화한 테마는 기본적으로 최근 게시물을 나열하는 첫 페이지를 표시합니다. 하지만 정적 페이지도 아니고 최신 게시물도 아닌 다른 범위의 콘텐츠를 표시하려면 어떻게 해야 할까요? 다행히 이것은 WordPress Multiple Loops를 사용하여 가능합니다.

이것이 어떻게 달성될 수 있는지 봅시다!

WordPress 홈페이지에서 다중 루프 사용

시작하기 전에 테마의 템플릿 파일을 편집할 것이기 때문에 하위 테마를 사용하여 자신의 웹사이트에 이러한 수정을 수행해야 한다는 점에 유의해야 합니다. 이렇게 하지 않으면 다음에 테마를 업데이트할 때 수정한 내용을 잃게 됩니다. 여기에서 하위 테마에 대해 자세히 알아볼 수 있습니다.

사용하는 테마에 관계없이 홈페이지에 해당하는 PHP 파일에는 일부 게시물(대부분의 경우 최근에 게시된 게시물)을 표시하는 표준 루프가 포함됩니다. 예를 들어 Twenty Twenty 테마에서 79행 주위의 index.php 파일 내에서 이것을 제어하는 ​​코드를 찾을 수 있습니다.

 if ( have_posts() ) { $i = 0; while ( have_posts() ) { $i++; if ( $i > 1 ) { echo '<hr class="post-separator styled-separator is-style-wide section-inner" aria-hidden="true" />'; } the_post(); get_template_part( 'template-parts/content', get_post_type() ); } }

이와 같은 표준 루프에서는 두 가지 중요한 전역 변수가 사용됩니다.

  • WP_Query 클래스 객체로 WP 데이터베이스 쿼리 결과를 담고 있는 $wp_query
  • 현재 WP_Post 클래스 객체인 $post .

위의 코드에서 먼저 have_posts() 전역 함수로 표시할 게시물이 있는지 확인하고, 그렇다면 while 루프 내에서 이러한 게시물을 반복합니다. the_post() 전역 함수는 WordPress에 다음 게시물로 이동하도록 지시하는 게시물을 반복하는 함수입니다.

이러한 함수와 클래스를 자세히 보려면 wp-includes/class-wp-query.php 파일에서 찾을 수 있습니다.

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

일을 쉽게 유지하기 위해 게시물 제목 목록만 표시하여 루프 코드를 가능한 한 단순하게 유지합니다.

 if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h3 class="entry-title">', '</h3>' ); } }

이것은 우리 홈페이지에서 다음과 같은 것을 볼 수 있음을 의미합니다.

홈페이지 출력 사용자 정의 시작하기

위의 스크린샷에서 보았듯이 '프론트 페이지'를 방문하면 할당된 카테고리에 관계없이 가장 최근 게시물 10개를 볼 수 있습니다.

이제 사용자 정의 출력을 포함할 사용자 정의 홈페이지 템플릿을 계속 생성하겠습니다.

이렇게 하려면 custom-homepage.php 라는 파일을 만들고 테마 폴더에 저장합니다. 이 페이지에 다음 코드를 추가합니다.

 <?php /* * Template Name: My custom homepage template */ get_header(); if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h4 class="example"></h4>' ); } } get_footer();

그런 다음 WordPress 관리자로 이동하여 '내 홈페이지'라는 페이지를 만들고 템플릿 드롭다운 메뉴에서 '내 맞춤 홈페이지 템플릿'을 템플릿으로 선택합니다.

그런 다음 이것을 기본 홈페이지로 만들려면 설정 메뉴(설정 > 읽기 > 정적 페이지)에서 이것을 선택해야 합니다.

이 시점에서 홈페이지를 보면 웹사이트의 프론트 엔드에서 볼 때 페이지 제목만 표시되어야 합니다.

이제 설정이 완료되었으므로 '내 사용자 정의 홈페이지 템플릿' 템플릿에 몇 가지 쿼리를 추가해 보겠습니다.

사용자 정의 쿼리 추가

이 예에서 우리의 목표는 모든 카테고리의 최신 게시물 중 일부를 표시하는 것입니다. 이 아래에는 '책'이라는 사용자 정의 게시물 유형의 게시물이 표시됩니다. 사용자 정의 게시물 유형을 설정하는 방법을 모르는 경우 '수동으로 WordPress 사용자 정의 게시물 유형 만들기' 문서를 확인하세요. 물론 사용자 정의 게시물 유형을 포함하는 것은 전적으로 선택 사항입니다. 이 작업을 수행하지 않으려면 이 게시물 유형을 참조하는 단계를 건너뛰십시오.

현재 루프(79번째 줄에 index.php 에 있음)를 다음 루프로 교체하는 것으로 시작하겠습니다.

 $args = array( 'posts_per_page' => 8, 'orderby', 'date', 'order', 'DESC' ); $query = new WP_Query( $args ); while ( $query->have_posts() ) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

이 루프는 이제 홈페이지에 8개의 가장 최근 게시물이 표시됨을 의미합니다(아래 참조).

그런 다음 사용자 지정 게시물 유형 '책'(또는 해당 문제에 대한 다른 사용자 지정 게시물 유형)을 포함하려면 다음과 같이 첫 번째 루프 바로 아래에 책 게시물에 대한 두 번째 루프를 추가합니다.

 echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', 'posts_per_page' => 8 ); $query = new WP_Query( $args ); while ($query->have_posts()) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

웹 사이트의 프런트 엔드로 이동하고 페이지를 새로고침하여 모든 것이 예상대로 작동하는지 확인합니다.

사용자 지정 쿼리를 부분적으로 나누기

사용자 지정 쿼리를 여러 부분으로 나누는 것이 유용할 수 있습니다. 이렇게 하는 이유는 초기 루프를 다시 시작하기 전에 다른 카테고리나 게시물 유형의 게시물을 표시하여 첫 번째 쿼리를 '중단'하려는 경우입니다. 예를 들어 카테고리의 최신 게시물을 표시한 다음 다른 콘텐츠를 표시한 다음 마지막으로 더 많은 '최신 게시물'로 마무리하여 페이지를 마무리하려는 경우에 유용합니다.

이것으로 뛰어 들어 봅시다. 시작하려면 이전에 사용한 custom-homepage.php 파일의 내용을 삭제하고 아래 코드를 추가합니다.

 <?php /* * Template Name: My custom homepage template */ get_header(); //////////// // Services Posts loop echo '<h4>Services</h4>'; $args = array( 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Books Posts in between echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', ); $books = new WP_Query( $args ); while ( $books->have_posts() ) : $books->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Resume Services Posts loop echo '<h4>More Services</h4>'; $args = array( 'offset' => '3', 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; //////////// get_footer();

첫 번째 루프에서는 서비스 범주에서 3개의 게시물을 검색합니다. 중복을 피하면서 서비스 카테고리 게시물을 세 번째 루프에서 재개하기 위해 offset => 3 을 정의합니다. 이는 다음을 볼 수 있음을 의미합니다.

물론 오프셋 값을 원하는 숫자로 변경할 수 있습니다.

최신 게시물 쿼리에 맞춤 게시물 추가

홈페이지 최신 게시물에 도서 게시물을 포함하려면 어떻게 해야 합니까? 기본 루프는 기본적으로 사용자 정의 게시물을 포함하지 않습니다. 이 문제를 해결하는 방법은 다음과 같습니다.

이 섹션에서는 홈페이지의 읽기 설정을 '최근 게시물'로 설정합니다.

여기에서 따라야 할 경로는 pre_get_posts 후크를 사용하는 것입니다. 이 후크는 wp-includes/class-wp-query.php 파일에 도입되었으며 $query 객체와 기본 WordPress 루프를 원하는 대로 사용자 정의하는 데 사용됩니다. 쿼리 변수 개체가 생성된 후 실제 쿼리가 실행되기 전에 실행됩니다.

활성 테마의 functions.php 파일을 열고 끝에 다음 코드를 삽입하세요.

 function homepage_add_cpt( $query ) { if ( $query->is_main_query() && is_home() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } add_action( 'pre_get_posts', 'homepage_add_cpt' );

이 코드가 if 조건에서 하는 일은 메인 쿼리가 실행되는 동안에만 수정 사항이 홈페이지에 적용되도록 하는 것입니다.

이제 홈페이지를 방문하면 최신 게시물에 맞춤 '책' 게시물도 포함되어 있음을 알 수 있습니다.

결론

거의 예외 없이 WordPress 홈페이지의 콘텐츠 측면에서 달성해야 하는 것은 무엇이든 가능합니다. 여기에 표시된 것처럼 WordPress 다중 루프를 사용하는 것은 홈페이지에 표시되는 출력을 사용자 정의하는 강력한 방법입니다. 여기에서 우리의 접근 방식은 많은 것 중 하나일 뿐입니다. WordPress는 사이트에 표시되는 출력에 대해 놀라운 수준의 제어를 제공합니다. 그들이 제공하는 도구로 실험하여 원하는 것을 달성하십시오!