해당 컨텍스트에 대한 쿼리가 게시물을 반환하지 않더라도 WordPress 템플릿 로더에는 여러 상황에서 적절한 컨텍스트 템플릿 파일이 포함됩니다. 예를 들면 다음과 같습니다.
- 주요 블로그 게시물 색인
- 카테고리 아카이브 색인 (카테고리는 존재하지만 게시물이 없습니다)
- 태그 아카이브 색인 (태그는 있지만 게시물이 없습니다)
- 저자 아카이브 색인 (저자 존재하지만 게시물이 없음)
- 검색 결과 색인
따라서 이러한 경우 적절한 템플리트 파일이로드되지만 조회는 게시물을 리턴하지 않으므로 게시물이 출력되지 않습니다.
개념 증명 예 :
따라서 이러한 컨텍스트에서 템플릿 파일이 if ( have_posts() )
조건부 를 포함하는 것이 유용 합니다.
다른 컨텍스트에서 쿼리가 게시물을 반환하지 않으면 템플릿 파일이로드되지 않습니다. 예를 들면 다음과 같습니다.
이러한 맥락에서, if ( have_posts() )
아마도 불필요 할 것입니다.
편집하다
쿼리가 the_post ()에 의해 호출되었음을 이해합니다. while (have_posts ())가 존재하면 게시물이 없으면 쿼리가 발생하지 않습니다.
무슨 일이 일어나고 있는지 이해하려면 워드 프레스 작업의 순서를 살펴 봐야합니다 . 시작하기 wp_loaded
(명확성을 위해 일부 생략) :
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
그래서 무슨 일이 일어나고 있고 어떤 순서로?
- 쿼리가 호출됩니다.
parse_query
pre_get_posts
wp
- 템플릿이 선택되었습니다.
- 템플릿이로드 / 출력됩니다. 템플릿 은 다음 작업 을 시작합니다 .
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
따라서에 the_post
의해 실행 되는 쿼리는 구문 분석되고 게시물을 가져오고 템플릿이로드 된 후에도the_post()
발생합니다 .
나는 당신이 내가 모르는 많은 정보를 제공하는 것에 대해 매우 감사하지만, 이것은 내가 요구 한 것이 아닙니다.
아, 그러나 나는 그것이 당신이 요구 한 그대로 라고 생각합니다 .
실제 질문은 : 유효한 쿼리 반환은 무엇입니까? 카테고리 아카이브 색인과 같은 컨텍스트의 경우, 조회 된 카테고리 ID가 존재하는 경우 해당 카테고리에 지정된 게시물이없는 경우에도 조회가 유효하며 카테고리 템플리트가로드됩니다 .
왜? 구문 분석되는 쿼리는 (IIRC)입니다 &cat={ID}
. 이는 해당 카테고리에 지정된 게시물이 없어도 유효한 쿼리 이므로 구문 분석시 404가되지 않습니다.
이 경우 유효한 쿼리가 있고 템플릿 파일이로드 되었지만 게시물은 없습니다 . 따라서 if ( have_posts() )
, 사실입니다 관련. 다시 한 번, 예는 다음과 같습니다. 카테고리가 있지만 게시물이 할당되지 않았습니다. 카테고리 템플릿 파일이로드 if ( have_posts() )
되고을 반환false
합니다.
게시물이 실제로 존재하지 않기 때문에 단일 블로그 게시물 및 정적 페이지와 같은 게시물 변수 ( &p={ID}
) 를 포함하는 쿼리에는 적용 되지 않으며 구문 분석시 쿼리는 유효한 객체를 반환하지 않습니다.
편집 2
카테고리 템플릿에 if (have_posts ())가없고 카테고리에 게시물이 없는지 올바르게 이해하면 게시하지 않고 category-sample.php를 반환해야하지만 404.php를 반환합니다. 맞습니까?
기억하십시오 : 템플릿은에서 선택됩니다 template_redirect
. 따라서 쿼리가 유효하면 적절한 템플릿 파일이로드됩니다. 쿼리가 유효하지 않으면 404 템플릿이로드됩니다.
따라서 일단 템플릿이로드되면 (예 : 카테고리 템플릿) 루프가 출력되면 템플릿은 변경되지 않습니다 .
동작 순서를 다시 살펴보십시오.
parse_query
pre_get_posts
wp
template_redirect
- 템플릿이 선택되어 여기에로드됩니다. 이것은 리턴 포인트의 템플릿 포인트입니다 . 이 시점 이후에는 템플릿을 변경할 수 없습니다.
- ...
the_post
- POSTDATA는 설정은 루프 호출의 일부로서, 여기에있다. 이 호출됩니다 템플릿 내부 및 템플릿은 변경되지 않습니다 질의 객체의 데이터를 기반
최종 편집
그리고 게시물의 존재를 확인하면서 왜 같은 테스트를 두 번 실행해야한다고 주장합니다. 그것은 내가 그것에 대해 묻고있는 첫 번째 요점으로부터의 나의 질문입니다.
그리고 결국, 나는 이해합니다 : 당신의 질문은 WordPress 또는 WordPress Loop 와 아무 관련이 없습니다 . 동일한 조건을 확인 while
하는 if
조건부 내에 임의의 PHP 루프를 래핑하는 방법을 묻습니다 .
이 질문은 WPSE의 범위를 벗어 났지만 간단히 설명하겠습니다.
if
조건은 바이너리 평가이다 : 그것은 하나의 true
나 false
, 그리고 무슨 일 안에 그 조건으로하는 실행 하면 .
while
조건은입니다 루프 : 그것은 카운터의 어떤 종류에 따라, 일부 이산 기간 동안 진정한 남아있다; 그리고 그 조건부 안에서 일어나는 일은 카운터의 각 반복마다 한 번씩 여러 번 실행 됩니다.
사물 목록이 채워지면 정렬되지 않은 사물 목록을 출력한다고 가정 해 봅시다. while
루프 를 사용 하고 if
랩퍼를 생략하면 마크 업은 다음과 같습니다.
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
그리고 list_of_things()
비어 있으면 렌더링 된 출력은 다음과 같습니다.
<ul>
</ul>
불필요하고 잘못된 마크 업이 남습니다.
그러나 if
조건부 래퍼 를 추가 하면 다음을 수행 할 수 있습니다.
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
그리고 list_of_things()
비어 있으면 마크 업이 전혀 출력되지 않습니다.
한 가지 예일뿐입니다. 거기를 사용하는 많은있다 if
조건 래퍼 및 if
조건 래퍼는 역할을 완전히 다른 목적을 댄 while
루프를.