J'utilise le code suivant pour récupérer des messages:
<?php
$featuredPosts = new WP_Query();
$featuredPosts->query('showposts=5&cat=3');
while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?>
<h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
<div class="meta">
By <?php the_author() ?>
</div>
<div class="storycontent">
<?php the_excerpt(); ?>
</div>
<?php endwhile; ?>
Dois-je utiliser wp_reset_query()
? Si je le fais, où devrais-je le placer?
Bonjour @janoChen:
Réponse simple: non.
Ce qui suit est ce que le code PHP de la fonction wp_reset_query()
à partir de /wp-includes/query.php
dans WordPRess v3.0.4 ainsi que les fonctions appelées ultérieurement. Vous pouvez voir qu'il s'agit principalement de modifier des variables globales.
Lorsque vous utilisez new WP_Query($args)
, vous affecterez la valeur de retour de valeurs à une variable locale. Ainsi, à moins que vous ne fassiez quelque chose de si complexe que vous connaissiez déjà la réponse à cette question, vous n'avez pas besoin d'appeler wp_reset_query()
:
function wp_reset_query() {
unset($GLOBALS['wp_query']);
$GLOBALS['wp_query'] =& $GLOBALS['wp_the_query'];
wp_reset_postdata();
}
function wp_reset_postdata() {
global $wp_query;
if ( !empty($wp_query->post) ) {
$GLOBALS['post'] = $wp_query->post;
setup_postdata($wp_query->post);
}
}
function setup_postdata($post) {
global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;
$id = (int) $post->ID;
$authordata = get_userdata($post->post_author);
$day = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);
$numpages = 1;
$page = get_query_var('page');
if ( !$page )
$page = 1;
if ( is_single() || is_page() || is_feed() )
$more = 1;
$content = $post->post_content;
if ( strpos( $content, '<!--nextpage-->' ) ) {
if ( $page > 1 )
$more = 1;
$multipage = 1;
$content = str_replace("\n<!--nextpage-->\n", '<!--nextpage-->', $content);
$content = str_replace("\n<!--nextpage-->", '<!--nextpage-->', $content);
$content = str_replace("<!--nextpage-->\n", '<!--nextpage-->', $content);
$pages = explode('<!--nextpage-->', $content);
$numpages = count($pages);
} else {
$pages = array( $post->post_content );
$multipage = 0;
}
do_action_ref_array('the_post', array(&$post));
return true;
}
-Mike
Il n'est pas nécessaire pour WP_Query
par lui-même, mais il est nécessaire (ou au moins une bonne chose à faire) si vous utilisez des fonctions/méthodes associées (telles que the_post()
ou setup_postdata()
) pour remplir des variables globales avec vos données .
Fondamentalement, créer un nouvel objet WP_Query
consiste simplement à récupérer des données, mais son utilisation pour exécuter une boucle active et rendre les données accessibles aux balises de modèle modifie l'environnement et il est bon de tout réinitialiser par la suite.
Dans l'ensemble, ce n'est pas une pénalité de performance significative de l'appeler, il est donc plus facile de toujours l'appeler que de décider si vous devriez ou de l'oublier et d'avoir quelque chose de mystérieusement cassé.
Mise à jour
wp_reset_postdata()
function semble être un choix plus approprié. wp_reset_query()
réinitialise les variables globales $wp_query
(que l’objet WP_Query
personnalisé n’affecte pas) et $post
(qu’il pourrait être comme ci-dessus). wp_reset_postdata()
ne restaure que $post
, ce qui devrait suffire.
Non. Si vous instanciez votre propre objet WP_Query, vous pouvez le faire avec ce que vous voulez. Cependant, si vous manipulez la variable global $wp_query
, eh bien, votre espace de nom global affecte le script de quiconque utilise cette variable simultanément. Et si vous faites quelque chose pour changer les données qu'il contient, vous devez également le réinitialiser après l'avoir utilisé.
Si vous utilisez une requête personnalisée comme celle-ci
$cat = new WP_query();
$cat->query("cat=19,20,-23&showposts=5&orderby=Rand");
while ($cat->have_posts()) : $cat->the_post();
$data = get_post_meta( $post->ID, 'key', true );
$img_arrays []= $data['productimage'];
$lnk_arrays[] =get_permalink($post_ID);
endwhile;
wp_reset_query();
Ensuite, vous ne rencontrerez pas de problèmes. Sinon, s'il y a une autre boucle sur la même page, vous obtiendrez des résultats inattendus. Je n'ai pas utilisé wp_reset_query () dans le code ci-dessus (qui a été placé dans mon fichier header.php. Puis, lorsque je suis entré dans single.php, la plupart du temps, j'ai eu les pages de détail des autres J'ai oublié de réinitialiser la requête en haut de la page.