web-dev-qa-db-fra.com

Get_posts () est-il plus efficace que The Loop?

Dans category.php, je souhaite obtenir la liste des publications de cette catégorie.

J'ai trouvé deux méthodes: en utilisant get_posts($args) et The Loop.

get_posts () façon

$args = array (
  "category" => ID );
$posts = get_posts($args);
// then use foreach to loop the $posts

La boucle

<?php if (have_posts() ): ?>
  <?php while (have_posts() ): the_post(); ?>
    ...
  <?php endwhile; ?>
<?php endif; ?>

Alors lequel est le plus efficace?

get_posts() est un modèle personnalisé, alors que The Loop est utilisé dans le modèle qui suit la convention de dénomination Wordpress.

Je préfère get_posts() mais s'il y a beaucoup de frais généraux par rapport à The Loop, je devrais le repenser.

1
hrsetyono

Lorsque WordPress inclut le category.php (comme tout autre modèle), la requête principale (c'est-à-dire la requête déclenchée par l'URL) est déjà : cela signifie qu'un La requête sur la base de données a déjà été déclenchée et c'est la raison pour laquelle, dans un modèle, vous pouvez exécuter la boucle sans appeler de requête.

Si vous appelez get_posts, vous avez exécuté une autre requête dans la base de données, ce qui signifie que est totalement inutile une fois identique à celle déjà utilisée. couru par WordPress.

Notez également que get_posts est simplement un wrapper pour WP_Query, de sorte que la différence par rapport à l'utilisation de la boucle et de la syntaxe foreach ne tient pas compte de la requête elle-même, mais de la manière dont vous utilisez le résultat.

Si vous préférez foreach à while (la boucle est juste une boucle while), vous pouvez l'utiliser également en appelant directement WP_Query:

$q = new WP_Query( $args ); // or $q = get_posts( $args );

foreach ( $q->posts as $post ) {
  // here your code e.g.
  $title = $post->title;
  $content = $post->content;
}

Alors pourquoi normalement les gens utilisent la boucle au lieu de ce type de boucle? pour 2 raisons au moins:

  1. Configuration de l’objet global $post. Lorsque vous appelez the_post() dans la boucle, cette fonction permet de globaliser la variable $post contenant l'objet de publication en cours. Beaucoup de fonctions de base et de plugins dépendent de cette variale, il est donc souvent important de les configurer. Cependant, il peut être configuré aussi en utilisant une boucle foreach, en utilisant la fonction setup_postdata, le code précédent devient:

    global $post;
    foreach ( $q->posts as $post ) {
      setup_postdata($post);
      // here your code e.g.
      $title = $post->title;
      $content = $post->content;
    }
    
  2. La deuxième raison concerne les balises de modèle, par rapport à l'accès direct aux propriétés de l'objet post: lorsque vous appelez the_title ou the_content (ou d'autres balises de modèle), les filtres sont activés avant la sortie de la propriété, et si vous ne les appelez pas, la sortie peut ne pas être la vous pouvez vous y attendre manuellement dans notre boucle foreach:

    $q = new WP_Query( $args );
    global $post;
    foreach ( $q->posts as $post ) {
      setup_postdata($post);
      // here your code e.g.
      $title = apply_filters('the_title', $post->title);
      $content = apply_filters('the_content', $post->content);
    }
    

Le dernier bloc de code peut être considéré presque comme identique à la boucle.

J'ai dit presque car il y a une autre chose qui diffère: 2 crochets d'action, loop_start et loop_end, déclenchés par la boucle. Certains plugins peuvent les utiliser, donc pour une meilleure compatibilité, vous devriez faire quelque chose comme:

$q = new WP_Query( $args );

global $post;
do_action_ref_array('loop_start', array(&$q));
foreach ( $q->posts as $post ) {
  setup_postdata($post);
  // here your code e.g.
  $title = apply_filters('the_title', $post->title);
  $content = apply_filters('the_content', $post->content);
}
do_action_ref_array('loop_end', array(&$q));

Comme cela a déjà été dit, cela est mieux utilisé pour les boucles personnalisées, mais en ce qui concerne la requête principale, appeler un autre WP_Query est mauvais pour la performance et inutile. Toutefois, la requête principale est simplement une instance de WP_Query, enregistrée dans la variable globale $wp_query. Par conséquent, si vous utilisez un modèle similaire à celui-ci:

global $wp_query, $post;
do_action_ref_array('loop_start', array(&$wp_query));
foreach ( $wp_query->posts as $post ) {
  setup_postdata($post);
  // here your code e.g.
  $title = apply_filters('the_title', $post->title);
  $content = apply_filters('the_content', $post->content);
}
do_action_ref_array('loop_end', array(&$wp_query));

vous faites quelque chose de très similaire (pratiquement identique) à la boucle, mais beaucoup plus verbeux, mais si vous détestez les boucles while ...

En conclusion, en ce qui concerne la requête principale, pour des raisons de compatibilité, il est conseillé (mais pas obligatoire) d'utiliser la boucle: si vous ne déclenchez pas les actions et les filtres de filtrage, il y a des chances que si vous installez des plugins, certains ne fonctionneront pas ...

Mais pour les boucles personnalisées, parfois, vous n'avez pas besoin (ou vous ne voulez pas) de déclencher des actions et des points de filtrage, et la syntaxe foreach peut être préférable dans ce cas.

5
gmazzap