인프런 커뮤니티 질문&답변

INFLEARINGMACHINE님의 프로필 이미지
INFLEARINGMACHINE

작성한 질문수

워드프레스 제대로 개발하기 - 클라이언트 편

Loop

wp_reset_postdata();

작성

·

284

0

new WP_Query를 통해서 새로운 $wp_query객체를 얻을 때, 글로벌 $post에도 변화가 있기 때문에 loop가 끝나고 나면 wp_reset_postdata()를 실행해주는 것으로 이해했는데, 맞다면 글로벌 $post에 어떤 변화가 일어나는 것인가요? 

 

답변 1

1

워드프레스 개발님의 프로필 이미지
워드프레스 개발
지식공유자

안녕하세요. INFLEARINGMACHINE님.

주중에 제가 일이 많아서 답을 이제야 드리게 됐습니다.

사실 질문해 주신 부분에 대해서는 Loop 강의 다음다음 강의인 "Loop 내 주요 함수 뜯어 보기"에서 상세하게 다루고 있습니다. 그래서 아마도 의문이 해결되셨을 지도 모르겠습니다.

그래도 해결되지 않은 의문이 있다면 추가로 질문을 남겨 주시면 감사하겠습니다.

다만 한 가지 도움을 드릴 만한 것은 있는 것 같습니다.

"new WP_Query를 통해서 새로운 $wp_query객체를 얻을 때"라고 말씀해 주셨는데요, 워드프레스에서 변수 이름이 매우 중요하다는 점을 한 번 더 설명드릴 수 있을 것 같아요.

new WP_Query로 WP_Query 클래스의 새로운 인스턴스를 얻을 때 변수명을 $wp_query로 하는 것을 권장하지 않습니다. 원 페이지의 동작을 변경하게 되기 때문입니다.

예컨대 example.com/?p=1234 주소로 접속을 했다고 가정해 볼 게요. 그러면 1234번 포스트를 가져오게 됩니다. 이 동작은 $wp_query 라는 글로벌 인스턴스에 기록이 돼 있습니다.

그런데 이런 상황에서 $wp_query를 다른 조건으로 덮어쓰게 되면, 문제가 발생할 수 있습니다. 예컨대, 이전 포스트나 다음 포스트를 1234번 포스트 제목이 나오기 전에 표시를 하기 위해서 $wp_query = new WP_Query를 실행했다고 가정해 볼 게요. 그러면 문제가 발생하게 됩니다. 글로벌 변수인 $wp_query를 덮어썼기 때문입니다.

그래서 중요한 것은 새로운 $wp_query 객체를 얻으면 안 된다는 것이고, WP_Query의 새 인스턴스를 만들 때는 $wp_query라는 이름을 피하고 다른 이름을 지으시라는 것입니다. $my_query 같은 이름을 사용하라는 것이죠. 

wp_reset_postdata()는 이런 커스텀 이름의 WP_Query 클래스 객체를 사용한 뒤 실행해 주는 것입니다. 예컨대 $my_query에서 불러온 포스트를 글로벌 $post 변수에 할당하고 작업을 했다고 가정을 해 보죠. 그렇다면 작업이 끝난 뒤에는 다시 $wp_query의 맥락으로 돌아와야 할 거예요. 이 때 wp_reset_postdata()를 실행해서 $wp_query의 포스트를 글로벌 $post 변수로 되돌려 주는 작업을 하는 것입니다.

이게, 화면으로 보여 드리면 편한 것을 줄글로 쓰니까 어려운 점이 있네요. 혹시 의문이 다 해소되지 않았다면 어떤 부분이 추가로 궁금하신지 자세히 써 주시면 감사하겠습니다. 그러면 최대한 이해가 가도록 설명을 다시 한 번 드려 보겠습니다.

감사합니다.

 

INFLEARINGMACHINE님의 프로필 이미지
INFLEARINGMACHINE

작성한 질문수

질문하기