Le chargeur de modèles WordPress inclura le fichier de modèle contextuel approprié dans de nombreuses circonstances, même si la requête pour ce contexte ne renvoie aucun message. Par exemple:
- Index des principaux articles du blog
- Index des archives de catégorie (la catégorie existe, mais n'a pas de messages)
- Index d'archivage des balises (la balise existe, mais n'a pas de publication)
- Index des archives des auteurs (l'auteur existe, mais n'a aucun message)
- Index des résultats de recherche
Ainsi, dans ces cas, le fichier de modèle approprié sera chargé, mais aucune publication ne sera générée, car la requête ne renvoie aucune publication.
Exemples de validation de principe:
Ainsi, dans ces contextes, il est utile que le fichier modèle inclue le if ( have_posts() )
conditionnel.
Dans d'autres contextes, le fichier de modèle ne sera jamais chargé si la requête ne renvoie aucune publication. Par exemple:
- Article de blog unique
- Page statique
Dans ces contextes, if ( have_posts() )
est probablement inutile.
modifier
Je comprends que la requête est invoquée par the_post (), non? Et si while (have_posts ()) existe, la requête ne se produit jamais s'il n'y a pas de publication.
Pour comprendre ce qui se passe, vous devez regarder l'ordre des actions WordPress . Commençant par wp_loaded
(et en omettant certains pour plus de clarté):
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
Alors, que se passe-t-il et dans quel ordre?
- La requête est invoquée:
parse_query
pre_get_posts
wp
- Le modèle est sélectionné:
- Le modèle est chargé / sorti. Les actions suivantes sont déclenchées par le modèle :
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Ainsi, the_post
déclenché par the_post()
, se produit longtemps après l'analyse de la requête, la récupération des publications et le chargement du modèle.
Je suis très reconnaissant que vous donniez beaucoup d'informations que je ne connaissais pas, mais ce n'est pas ce que j'ai demandé.
Oh, mais je crois que c'est exactement ce que vous avez demandé.
La vraie question est: qu'est-ce qu'un retour de requête valide ? Pour des contextes tels que l'index d'archive de catégorie, la requête est valide et le modèle de catégorie est chargé, si l'ID de catégorie interrogé existe, même si aucune publication n'est affectée à cette catégorie .
Pourquoi? Parce que la requête en cours d'analyse est (IIRC) &cat={ID}
- qui est une requête valide même s'il n'y a pas de messages affectés à cette catégorie , et n'entraîne donc pas de 404 lors de l'analyse.
Dans ce cas, vous obtenez une requête valide et un fichier de modèle chargé, mais pas de publications . Ainsi if ( have_posts() )
, est, en fait pertinent. Encore une fois, voici un exemple: la catégorie existe, mais aucun poste n'est affecté. Le fichier de modèle de catégorie est chargé, avec if ( have_posts() )
retourfalse
.
Cela ne sera pas vrai pour les requêtes qui incluent une variable de publication ( &p={ID}
) telles que les publications de blog uniques et les pages statiques, car la publication n'existe pas réellement et lorsqu'elle est analysée, la requête ne renvoie pas d'objet valide.
Modifier 2
Si je comprends à juste titre s'il n'y a pas de if (have_posts ()) dans un modèle de catégorie et que la catégorie n'a pas de publication, alors il renvoie 404.php, même s'il doit renvoyer category-sample.php sans publication. Est-ce correct?
N'oubliez pas: le modèle est sélectionné à template_redirect
. Donc, si la requête est valide, le fichier de modèle approprié est chargé. Si la requête n'est pas valide, le modèle 404 est chargé.
Ainsi, une fois qu'un modèle est chargé - par exemple le modèle de catégorie - une fois la boucle sortie, le modèle ne change pas .
Regardez à nouveau l'ordre des actions:
parse_query
pre_get_posts
wp
template_redirect
- le modèle est choisi et chargé ici. Il s'agit du modèle de point de non-retour . Le modèle ne peut pas changer après ce point.
- ...
the_post
- postdata est configuré ici, dans le cadre de l'appel de boucle. Ceci est appelé à l'intérieur du modèle et le modèle ne change pas en fonction des données disponibles dans l'objet de requête
Édition finale
Et je prétends que tout en vérifiant l'existence de messages, pourquoi devrais-je exécuter le même test deux fois. C'est ma question du premier point que je ne posais qu'à ce sujet.
Et avec cela, je comprends enfin: tout au long, votre question n'a rien à voir avec WordPress , ou la boucle WordPress . Vous demandez comment encapsuler une while
boucle PHP arbitraire dans une if
condition qui vérifie la même condition.
Cette question sort du cadre du WPSE, mais je vais expliquer brièvement:
Un if
conditionnel est une évaluation binaire: c'est soit true
ou false
, et ce qui se passe à l' intérieur de ce conditionnel est exécuté une fois .
Un while
conditionnel est une boucle : il reste vrai pour une période discrète, basé sur une sorte de compteur; et ce qui se passe à l' intérieur de ce conditionnel est exécuté plusieurs fois - une fois pour chaque itération du compteur.
Supposons donc que vous souhaitiez générer une liste de choses non ordonnée, si la liste de choses est remplie. Si vous utilisez une while
boucle et omettez l' if
encapsuleur, votre balisage ressemblera à ceci:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
Et s'il list_of_things()
était vide, la sortie rendue serait:
<ul>
</ul>
Ce qui laisse un balisage inutile (et invalide).
Mais si vous ajoutez un if
wrapper conditionnel, vous pouvez le faire:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
Et s'il list_of_things()
était vide, aucun balisage ne serait généré.
Ce n'est qu'un exemple. Il existe de nombreuses utilisations pour ce if
wrapper conditionnel, et le if
wrapper conditionnel sert un objectif entièrement différent de la while
boucle.