Tengo una pregunta sobre "el bucle".
<?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 tomado de la página de The Loop WordPress Codex .
¿Por qué debería poner if
parte? Parece que si hay un while
bucle, funciona bien.
¿En qué caso se produce un problema si no hay una if
declaración?
Editar
Acepté la respuesta de @ Chip. pero honestamente diciendo que solo necesito la última parte.
Ahora sé lo que quería saber de mi pregunta.
if
La declaración es solo cuando es necesario, si desea poner un encabezado o pie de página que debe escribirse solo una vez. Si no utiliza el "contenedor", laif
declaración no es necesaria.
Respuestas:
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:
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:
En estos contextos,
if ( have_posts() )
es probablemente innecesario.Editar
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?
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Entonces,
the_post
disparado porthe_post()
, sucede mucho después de que se analiza la consulta, se obtienen las publicaciones y se carga la plantilla.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, conif ( 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
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 consultaEdición final
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 unif
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 unotrue
ofalse
, 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 elif
contenedor, su marcado se vería así:Y si
list_of_things()
estuviera vacío, la salida representada sería:Lo que deja un marcado innecesario (e inválido).
Pero si agrega un
if
contenedor condicional, puede hacer esto: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 elif
contenedor condicional tiene un propósito completamente diferente al delwhile
bucle.fuente
the_post();
porque tambiénwhile
es innecesario. +1 para la integridad de las informaciones.if( have_posts() )
declaración tiene sentido (eso es lo que estoy tratando de descubrir), ¡pero no lo use solothe_post()
en páginas singulares!if( have_post() )
condición antes de la vuelta completa en el contexto desingle-*.php
ypage-*.php
archivos de plantilla?Es realmente imposible mejorar la respuesta de Chip, pero solo para ir al grano:
Use la
if
parte si desea que aparezca algo diferente cuando no hay publicaciones . Esto es particularmente útil, por ejemplo, en una página de archivo de fecha o categoría. Si alguien navega a una página que no tiene publicaciones, es bueno tener un mensaje que lo diga, en lugar de que no aparezca nada, porque el bucle nunca se ejecuta.fuente
Puede haber algunas consideraciones que no están incluidas en las respuestas hasta ahora. No se recomienda omitir la instrucción if.
La declaración if se usa comúnmente para:
no posts found
indicar que la categoría en cuestión no tiene artículos asignados.¿Qué pasa si se agrega un nuevo gancho?
Otro posible problema de no usar la instrucción if es que si el equipo de wordpress alguna vez decide agregar un nuevo enlace que
$wp_query->have_posts()
se active en la primera llamada, se activaría en el momento equivocado. Y si eso causa un comportamiento inesperado, sería su culpa por no seguir las especificaciones correctamente.Otros desarrolladores esperan ver una estructura específica para el ciclo de WordPress
Supongo que otros desarrolladores esperan ver el ciclo completo de WordPress. Entonces, tal vez sea una mala idea hacer que busquen una declaración if que no esté allí.
fuente
Veo esto como una cuestión fundamental de la teoría de la estructura de control. El bloque encerrado dentro del ciclo while no se ejecuta ni una sola vez si la condición (have_posts ()) se evalúa como falsa la primera vez.
Por lo tanto, el propósito de
if ( have_posts() )
en el bucle de WordPress es solo ejecutar la función have_posts () una vez antes de evaluar la condición while. Sihave_posts()
no tiene efectos secundarios, entoncesif ( have_posts() )
es totalmente inútil. Sihave_posts()
tiene efectos secundarios, puede simplificarlo de la siguiente manera:fuente
if
está allí por elelse
después. No hay otro motivo. Si no hay publicaciones, es mejor mostrar un buen mensaje "sin publicaciones" que no mostrar nada.