El cargador de plantillas de WordPress incluirá el archivo de plantilla contextual apropiado en muchas circunstancias, incluso si la consulta para ese contexto no devuelve publicaciones. Por ejemplo:
- El índice principal de publicaciones de blog
- Índice de archivo de categoría (la categoría existe, pero no tiene publicaciones)
- Índice de archivo de etiquetas (la etiqueta existe, pero no tiene publicaciones)
- Índice de archivo de autor (El autor existe, pero no tiene publicaciones)
- Índice de resultados de búsqueda
Por lo tanto, en estos casos, se cargará el archivo de plantilla apropiado, pero no se generarán publicaciones, ya que la consulta no devuelve publicaciones.
Ejemplos de prueba de concepto:
Entonces, en estos contextos, es útil que el archivo de plantilla incluya el if ( have_posts() )
condicional.
En otros contextos, el archivo de plantilla nunca se cargará si la consulta no devuelve publicaciones. Por ejemplo:
- Publicación de blog individual
- Página estática
En estos contextos, if ( have_posts() )
es probablemente innecesario.
Editar
Entiendo que the_post () invoca la consulta, ¿verdad? Y si mientras existe (have_posts ()), la consulta nunca se produce si no hay publicación.
Para entender lo que está sucediendo, debes mirar el orden de las acciones de WordPress . Comenzando con wp_loaded
(y omitiendo algunos para mayor claridad):
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
Entonces, ¿qué está pasando y en qué orden?
- Se invoca la consulta:
parse_query
pre_get_posts
wp
- La plantilla está seleccionada:
- La plantilla está cargada / salida. La plantilla realiza las siguientes acciones :
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Entonces, the_post
disparado por the_post()
, sucede mucho después de que se analiza la consulta, se obtienen las publicaciones y se carga la plantilla.
Estoy muy agradecido de que brindes mucha información que no conocía, pero esto no es lo que te pedí.
Oh, pero creo que es exactamente lo que preguntaste.
La verdadera pregunta es: ¿qué es una devolución de consulta válida ? Para contextos como el índice de archivo de categoría, la consulta es válida y la plantilla de categoría se carga, si existe la ID de categoría consultada, incluso si no hay publicaciones asignadas a esa categoría .
¿Por qué? Porque la consulta que se analiza es (IIRC) &cat={ID}
, que es una consulta válida incluso si no hay publicaciones asignadas a esa categoría y, por lo tanto, no da como resultado un 404 al analizar.
En ese caso, obtienes una consulta válida y un archivo de plantilla cargado, pero no hay publicaciones . Por lo tanto, if ( have_posts() )
, es, de hecho relevante. Nuevamente, aquí hay un ejemplo: la categoría existe, pero no tiene publicaciones asignadas. Se carga el archivo de plantilla de categoría, con if ( have_posts() )
retornofalse
.
Esto no será válido para las consultas que incluyen una variable de publicación ( &p={ID}
) como publicaciones de blog individuales y páginas estáticas, porque la publicación no existirá realmente y, cuando se analice, la consulta no devolverá un objeto válido.
Editar 2
Si entiendo correctamente si no hay if (have_posts ()) en una plantilla de categoría y la categoría no tiene publicación, entonces devuelve 404.php, a pesar de que debería devolver category-sample.php sin publicación. ¿Está bien?
No. Recuerde: la plantilla se selecciona en template_redirect
. Entonces, si la consulta es válida, se carga el archivo de plantilla apropiado. Si la consulta no es válida, se carga la plantilla 404.
Entonces, una vez que se carga una plantilla, por ejemplo, la plantilla de categoría, una vez que se emite el bucle, la plantilla no cambia .
Mire nuevamente el orden de las acciones:
parse_query
pre_get_posts
wp
template_redirect
- la plantilla se elige y se carga aquí. Este es el punto de plantilla sin retorno . La plantilla no puede cambiar después de este punto.
- ...
the_post
- postdata se configura aquí, como parte de la llamada de bucle. Esto se llama dentro de la plantilla , y la plantilla no cambia según los datos disponibles en el objeto de consulta
Edición final
Y afirmo que, si bien verifica la existencia de publicaciones, ¿por qué debería ejecutar la misma prueba dos veces? Esa es mi pregunta desde el primer punto que he estado preguntando solo sobre eso.
Y con eso, finalmente entiendo: todo el tiempo, su pregunta no tuvo nada que ver con WordPress , o el bucle de WordPress . Estás preguntando si puedes envolver cualquier while
bucle PHP arbitrario dentro de un if
condicional que verifique la misma condición.
Esa pregunta está fuera del alcance de WPSE, pero explicaré brevemente:
Un if
condicional es una evaluación binaria: es uno true
o false
, y lo que sucede dentro de ese condicional se ejecuta una vez .
Un while
condicional es un ciclo : sigue siendo cierto durante un período discreto, basado en algún tipo de contador; y lo que sucede dentro de ese condicional se ejecuta varias veces , una vez por cada iteración del contador.
Entonces, supongamos que desea generar una lista de cosas sin ordenar, si la lista de cosas está llena. Si usa un while
bucle y omite el if
contenedor, su marcado se vería así:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
Y si list_of_things()
estuviera vacío, la salida representada sería:
<ul>
</ul>
Lo que deja un marcado innecesario (e inválido).
Pero si agrega un if
contenedor condicional, puede hacer esto:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
Y si list_of_things()
estaba vacío, no se generaría ningún marcado.
Ese es solo un ejemplo. Hay muchos usos para ese if
contenedor condicional, y el if
contenedor condicional tiene un propósito completamente diferente al del while
bucle.