작성
·
284
답변 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 변수로 되돌려 주는 작업을 하는 것입니다.
이게, 화면으로 보여 드리면 편한 것을 줄글로 쓰니까 어려운 점이 있네요. 혹시 의문이 다 해소되지 않았다면 어떤 부분이 추가로 궁금하신지 자세히 써 주시면 감사하겠습니다. 그러면 최대한 이해가 가도록 설명을 다시 한 번 드려 보겠습니다.
감사합니다.