상현
개발 덕후

워드프레스 쿼리 기능을 이해하기

( 업데이트: )

query_posts()

쿼리의 새 인스턴스로 대체하여 페이지의 기본 쿼리를 수정하는 방법으로 지나치게 단순하고 문제가 있는 방법중 하나입니다.

비효율적이며(SQL 쿼리를 다시 실행) 일부 상황에서는 완전히 실패합니다(특히 포스트 페이지 매김을 처리할 때 자주 발생). 모든 최신 wordpress 코드는 pre_get_posts이를 후크 사용하는 방법보다 안정적인 방법을 사용해야합니다.

TLDR; query_posts() 사용하지 않아야 합니다.

예상하는 시나리오

  • 기본 쿼리 루프를 재설정합니다.
  • 메인 포스트 전역을 재설정합니다.

하지만 실제작동

  • 설정한 매개변수를 사용하여 새 WP_Query 객체를 만듭니다.
  • 기존 기본 쿼리 루프를 새 루프로 바꿉니다(더 이상 기본 쿼리가 아님).

그렇다보니 PHP에서 $wp_query$post 전역을 채웠습니다.

“메인 루프” 3개는 전역으로 구성되어있으며 그 중 2개는 실제로 중요한 역할을 합니다.

  • $wp_the_query(상관없음)
  • $wp_query(문제)
  • $post(문제)

$wp_the_query가 중요하지 않은 이유는 직접 접근하거나 시도하지도 않기 때문입니다. $wp_query$post 전역이 얼마나 오염되었는지에 관계없이 기본쿼리가 되도록 설계되어있습니다.

get_posts()

사용법이 매우 유사하고 동일한 인수(다른 기본값과 같은 약간의 뉘앙스가 있음)를 허용하지만 게시물 배열을 반환하고 전역 변수를 수정하지 않으며 어디에서나 사용하기에 안전합니다.

WP_Query

배후에서 두 가지를 모두 지원하는 클래스이지만 자체 인스턴스를 만들고 작업 할 수도 있습니다. 조금 더 복잡하고 제한이 적으며 어디서나 안전하게 사용할 수 있습니다.