Eu tenho uma pergunta sobre "o loop".
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
Código extraído da página The Loop WordPress Codex .
Por que devo colocar if
parte? Parece que se houver while
loop, funciona bem.
Em que caso o problema ocorre se não houver if
declaração?
Editar
Aceitei a resposta de @ Chip. mas honestamente dizendo que preciso apenas da última parte.
Agora sei o que queria saber da minha pergunta.
if
A instrução é apenas quando necessário, se você deseja colocar um cabeçalho ou rodapé que deve ser gravado apenas uma vez. se você não usar o "wrapper", aif
instrução não será necessária.
Respostas:
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:
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:
Nesses contextos,
if ( have_posts() )
provavelmente é desnecessário.Editar
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?
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Assim,
the_post
acionadothe_post()
, acontece muito depois que a consulta é analisada, as postagens são buscadas e o modelo é carregado.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, comif ( 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
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 consultaEdição final
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 umif
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: é umatrue
ou oufalse
, 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 oif
wrapper, sua marcação ficará assim:E se
list_of_things()
estivesse vazio, a saída renderizada seria:O que deixa a marcação desnecessária (e inválida).
Mas se você adicionar um
if
wrapper condicional, poderá fazer o seguinte: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 oif
wrapper condicional serve a um propósito totalmente diferente dowhile
loop.fonte
the_post();
porque tambémwhile
é desnecessário. +1 para a exaustividade das informações.if( have_posts() )
declaração faz sentido (é o que estou tentando descobrir), mas não use apenasthe_post()
em páginas singulares!if( have_post() )
condição antes do ciclo completo no contexto dos arquivossingle-*.php
epage-*.php
modelo?É realmente impossível melhorar a resposta de Chip, mas apenas direto ao ponto:
Use a
if
parte se quiser que algo diferente apareça quando não houver postagens . Isso é particularmente útil, por exemplo, em uma página de arquivo de data ou categoria. Se alguém navega para uma página que não possui postagens, é bom ter uma mensagem dizendo isso, em vez de simplesmente nada aparecer, porque o loop nunca é executado.fonte
Pode haver algumas considerações que não estão incluídas nas respostas até o momento. Não é recomendável omitir a instrução if.
A instrução if é comumente usada para:
no posts found
com o de indicar que a categoria em questão não possui artigos atribuídos a ela.E se um novo gancho for adicionado?
Outra possível questão de não usar a instrução if é que, se a equipe do wordpress decidir adicionar um novo gancho que seja acionado na primeira
$wp_query->have_posts()
chamada, ele será acionado na hora errada. E se isso causar um comportamento inesperado, seria sua culpa por não seguir as especificações corretamente.Outros desenvolvedores esperam ver uma estrutura específica para o loop wordpress
Suponho que outros desenvolvedores esperem ver todo o loop do wordpress. Talvez seja uma má idéia tê-los procurando por uma declaração if que não esteja lá.
fonte
Eu vejo isso como uma questão fundamental da teoria da estrutura de controle. O bloco fechado no loop while não é executado nem uma vez se a condição (have_posts ()) for avaliada como falsa na primeira vez.
Portanto, o objetivo do
if ( have_posts() )
loop do WordPress é apenas executar a função have_posts () uma vez antes da condição while ser avaliada. Sehave_posts()
não tem efeitos colaterais, entãoif ( have_posts() )
é totalmente inútil. Sehave_posts()
tiver efeitos colaterais, você pode simplificar da seguinte maneira:fonte
if
está lá por causa doelse
depois dele. Nenhuma outra razão. Se não houver postagens, é melhor exibir uma boa mensagem "sem postagens" do que não exibir nada.