O carregador de modelos do WordPress incluirá o arquivo de modelo contextual apropriado em várias circunstâncias, mesmo se a consulta para esse contexto não retornar postagens. Por exemplo:
- O principal índice de postagens do blog
- Índice do arquivo de categorias (a categoria existe, mas não possui postagens)
- Índice de archive de tags (a tag existe, mas não possui postagens)
- Índice do arquivo de autor (o autor existe, mas não possui postagens)
- Índice de Resultados da Pesquisa
Portanto, nesses casos, o arquivo de modelo apropriado será carregado, mas nenhuma postagem será exibida, porque a consulta não retornará nenhuma postagem.
Exemplos de prova de conceito:
Portanto, nesses contextos, é útil que o arquivo de modelo inclua a if ( have_posts() )
condicional.
Em outros contextos, o arquivo de modelo nunca será carregado se a consulta não retornar postagens. Por exemplo:
- Postagem em blog único
- Página estática
Nesses contextos, if ( have_posts() )
provavelmente é desnecessário.
Editar
Entendo que a consulta é invocada pelo the_post (), certo? E se while (have_posts ()) existir, a consulta nunca ocorrerá se não houver postagem.
Para entender o que está acontecendo, você deve observar a ordem das ações do WordPress . Começando com wp_loaded
(e omitindo alguns para maior clareza):
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
Então, o que está acontecendo e em que ordem?
- A consulta é invocada:
parse_query
pre_get_posts
wp
- O modelo está selecionado:
- O modelo é carregado / produzido. As seguintes ações são disparadas pelo modelo :
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Assim, the_post
acionado the_post()
, acontece muito depois que a consulta é analisada, as postagens são buscadas e o modelo é carregado.
Sou muito grato por você ter fornecido muitas informações que eu não sabia, mas não foi isso que pedi.
Ah, mas acredito que é exatamente o que você pediu.
A verdadeira questão é: o que é um retorno de consulta válido ? Para contextos como o índice de arquivamento de categoria, a consulta é válida e o modelo de categoria é carregado, se o ID da categoria consultada existir, mesmo se não houver postagens atribuídas a essa categoria .
Por quê? Como a consulta que está sendo analisada é (IIRC) &cat={ID}
- que é uma consulta válida mesmo que não haja postagens atribuídas a essa categoria e, portanto, não resulta em 404 na análise.
Nesse caso, você obtém uma consulta válida e um arquivo de modelo carregado, mas nenhuma postagem . Assim, if ( have_posts() )
, é, de fato relevante. Novamente, aqui está um exemplo: a categoria existe, mas não possui postagens atribuídas. O arquivo de modelo de categoria é carregado, com if ( have_posts() )
retornofalse
.
Isso não será verdadeiro para consultas que incluem uma variável de postagem ( &p={ID}
), como postagens de blog únicas e páginas estáticas, porque a postagem realmente não existe e, quando analisada, a consulta não retornará um objeto válido.
Editar 2
Se eu entendi corretamente se não há if (have_posts ()) em um modelo de categoria e a categoria não possui post, ele retorna 404.php, mesmo que deva retornar category-sample.php sem post. Isso esta certo?
Não. Lembre-se: o modelo está selecionado em template_redirect
. Portanto, se a consulta for válida, o arquivo de modelo apropriado será carregado. Se a consulta não for válida, o modelo 404 será carregado.
Assim, uma vez que um modelo é carregado - por exemplo, o modelo de categoria - depois que o loop é gerado, o modelo não muda .
Veja novamente a ordem das ações:
parse_query
pre_get_posts
wp
template_redirect
- o modelo é escolhido e carregado aqui. Este é o ponto do modelo sem retorno . O modelo não pode ser alterado após esse ponto.
- ...
the_post
- postdata é configurado aqui, como parte da chamada de loop. Isso é chamado dentro do modelo e o modelo não muda com base nos dados disponíveis no objeto de consulta
Edição final
E estou alegando que, embora verifique a existência de postagens, por que devo executar o mesmo teste duas vezes. Essa é a minha pergunta desde o primeiro ponto que venho perguntando apenas sobre isso.
E com isso, finalmente entendo: o tempo todo, sua pergunta não teve nada a ver com o WordPress , ou o Loop do WordPress . Você está perguntando sobre agrupar qualquer while
loop PHP arbitrário dentro de um if
condicional que verifica a mesma condição.
Essa pergunta está fora do escopo da WPSE, mas vou explicar brevemente:
Uma if
condicional é uma avaliação binária: é uma true
ou ou false
, e o que acontece dentro dessa condicional é executado uma vez .
Um while
condicional é um loop : permanece verdadeiro por um período discreto, com base em algum tipo de contador; e o que acontece dentro desse condicional é executado várias vezes - uma vez para cada iteração do contador.
Então, digamos que você queira gerar uma lista não ordenada de itens, se a lista de itens estiver preenchida. Se você usar um while
loop e omitir o if
wrapper, sua marcação ficará assim:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
E se list_of_things()
estivesse vazio, a saída renderizada seria:
<ul>
</ul>
O que deixa a marcação desnecessária (e inválida).
Mas se você adicionar um if
wrapper condicional, poderá fazer o seguinte:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
E se list_of_things()
estivesse vazio, nenhuma marcação seria emitida.
Esse é apenas um exemplo. Existem muitos usos para esse if
wrapper condicional, e o if
wrapper condicional serve a um propósito totalmente diferente do while
loop.