Effet de champ de méta de poteau personnalisé sur les performances du poteau

10

J'ai les publications qui ont de nombreux champs méta définis par l'utilisateur. Sur les publications, je les appelle sur la demande en utilisant get_post_meta . Moyens pour 10 champs méta je l’utilise 10 fois.

Est-ce que je le fais bien? Cela signifie-t-il que la méthode ci-dessus pose un problème de performances et si oui, comment réduire le nombre d'appels.

Je connais la réponse disponible ici: Champs et performances personnalisés , ce qui explique que l'utilisation de "requête unique". Mais ce n’est pas clair et logique, alors redemander si quelqu'un sait et veut partager en détail.

    
posée Akhilesh 31.10.2014 - 10:47

3 réponses

19

Pour répondre à cette question, j’ai fait quelques tests à ce sujet, et les résultats ont été époustouflants.

Voici mon test

Pour cela, configurez-vous avec une page de test. Copiez simplement page.php, renommez-le et supprimez la boucle. Maintenant, créez simplement une nouvelle page dans le back-end. Avant de commencer, commencez par tester votre minuterie avec des informations vides pour obtenir le nombre de requêtes sans aucune donnée

J'ai créé 5 méta-champs en tout pour un test,

  • enclosure ,
  • First name ,
  • Last name ,
  • packages et
  • post_views_count

Ma publication de test avait un ID de 530 . Dans une publication, vous pouvez simplement utiliser $post->ID ou get_the_ID() pour définir l'ID de publication

Mon premier test a donc été le suivant:

<?php               
       timer_start();       

       $a = get_post_meta(530, 'enclosure', true);
       $b = get_post_meta(530, 'First name', true);
       $c = get_post_meta(530, 'Last name', true);
       $d = get_post_meta(530, 'packages', true);
       $e = get_post_meta(530, 'post_views_count', true);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

qui m'a donné les résultats suivants

  

1 requêtes en 0.00195 secondes.

Mon deuxième test était le suivant:

<?php               
       timer_start();       

       $a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

qui, étonnamment, a donné le même résultat

  

1 requêtes en 0.00195 secondes.

Si vous consultez le code source Pour get_post_meta() , vous verrez que get_post_meta() est simplement un wrapper pour get_metadata() . C'est donc là que vous devez regarder. Le code source pour get_metadata() , vous verrez que les métadonnées sont mises en cache.

Donc, sur votre question concernant l'utilisation et les performances, la réponse sera, c'est vous qui décidez. Vous avez vu la preuve dans les résultats

À mon avis, si vous devez récupérer 10 métadonnées, (ou dans mon cas 5), utilisez la deuxième approche dans ma réponse.

$a = get_post_meta(530);

Il est non seulement plus rapide d’écrire, mais vous ne devez pas non plus répéter le code. Un autre point à noter ici, la seconde approche contient tous les méta-champs d’un tableau facilement accessible et récupérable

À titre d’exemple, voici ma sortie de $a si je fais un var_dump( $a );

array(9) {
  ["_edit_lock"]=>
  array(1) {
    [0]=>
    string(12) "1414838328:1"
  }
  ["_edit_last"]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  ["_custom_sidebar_per_page"]=>
  array(1) {
    [0]=>
    string(7) "default"
  }
  ["post_views_count"]=>
  array(1) {
    [0]=>
    string(1) "0"
  }
  ["packages"]=>
  array(1) {
    [0]=>
    string(1) "0"
  }
  ["repeatable_names"]=>
  array(1) {
    [0]=>
    string(79) "a:1:{i:0;a:3:{s:4:"role";s:4:"fool";s:4:"name";s:6:"Pieter";s:3:"url";s:0:"";}}"
  }
  ["enclosure"]=>
  array(1) {
    [0]=>
    string(105) "http://localhost/wordpress/wp-content/uploads/2014/09/Nissan-Navara-Tough-City.avi
13218974
video/avi
"
  }
  ["First name"]=>
  array(1) {
    [0]=>
    string(3) "Tom"
  }
  ["Last name"]=>
  array(1) {
    [0]=>
    string(5) "Storm"
  }
}

Vous pouvez désormais accéder aux métadonnées renvoyées dans votre message comme suit:

echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>";

Ce qui affichera

  

Tom Storm

    
réponse donnée Pieter Goosen 01.11.2014 - 11:44
0

Vous pouvez utiliser get_post_meta pour extraire toutes les valeurs de champs méta à la fois.

$meta = get_post_meta( get_the_ID() );

Ceci récupérera toutes les méta-valeurs de la publication donnée. Utilisez ce tableau au lieu de chercher individuellement.

    
réponse donnée Nilambar 31.10.2014 - 10:58
0

Comme l'a dit Pieter Goosen, toutes les métadonnées d'une publication sont mises en cache lorsque vous demandez des métadonnées pour la première fois.

Ceci est également vrai pour tous les appels à WP_Query . Dès que vous appelez WP_Query , WordPress extrait les métadonnées de toutes les publications récupérées en une seule requête.

Le pire des cas est que vous appeliez get_post_meta pour les identifiants de publication individuels qui n’avaient pas été récupérés auparavant par WordPress. Dans ce cas, chaque appel à get_post_meta donnera lieu à une seule requête.

Exemple de trace d'une requête sur wp_postmeta dans un WP_Query :

SELECT post_id, meta_key, meta_value 
    FROM wp_postmeta 
    WHERE post_id IN (491,347) 
    ORDER BY meta_id ASC

#0 /wp-includes/wp-db.php(1567): wpdb->_do_query('SELECT post_id,...')
#1 /wp-includes/wp-db.php(1958): wpdb->query('SELECT post_id,...')
#2 /wp-includes/meta.php(814): wpdb->get_results('SELECT post_id,...', 'ARRAY_A')
#3 /wp-includes/post.php(5546): update_meta_cache('post', Array)
#4 /wp-includes/post.php(5529): update_postmeta_cache(Array)
#5 /wp-includes/query.php(3614): update_post_caches(Array, 'post', true, true)
#6 /wp-includes/query.php(3836): WP_Query->get_posts()
#7 /wp-includes/query.php(3946): WP_Query->query(Array)
#8 /wp-content/plugins/***/***.php(134): WP_Query->__construct(Array)

Comme vous pouvez le constater, l'appel provient de get_posts et récupère les métadonnées pour 2 publications, ce qui correspond au résultat original de WP_Query .

    
réponse donnée greenone83 11.02.2015 - 22:22

Lire d'autres questions sur les étiquettes