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

10

J'ai les messages qui ont de nombreux champs méta personnalisés. Sur les messages, je les appelle sur demande en utilisant get_post_meta. Moyens pour 10 champs méta Je l'utilise 10 fois.

Suis-je en train de bien faire? Signifie, y a-t-il un problème de performances avec la méthode ci-dessus et si oui, alors comment réduire le nombre d'appels.

Je connais la réponse disponible ici: les champs personnalisés et les performances qui expliquent que l'utilisation de «requête unique». Mais ce n'est pas clair et sonore, alors demandez à nouveau si quelqu'un sait et veut partager en détail.

Akhilesh
la source

Réponses:

24

Pour répondre à cela, je suis allé faire quelques tests à ce sujet, et les résultats étaient en fait hallucinants.

Voici mon test

Pour cela vous-même, 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, testez d'abord votre minuteur avec des informations vides pour obtenir le nombre de requêtes sans aucune donnée

J'ai créé 5 champs méta au total pour un poste de test,

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

Mon poste de test avait un ID de 530. Dans un article, vous pouvez simplement utiliser $post->IDou get_the_ID()pour définir l'ID de l'article

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>

ce 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 regardez le code source de get_post_meta(), vous verrez que get_post_meta()c'est simplement un wrapper pour get_metadata(). C'est donc là que vous devez regarder. Le code source de get_metadata(), vous verrez que les métadonnées sont mises en cache.

Donc, pour votre question sur l'utilisation et les performances, la réponse sera, c'est à vous de décider. Vous en avez vu la preuve dans les résultats

À mon avis, si vous avez besoin de récupérer 10 champs de 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 à écrire, mais vous ne devez pas non plus répéter le code. Un autre point à noter ici, la deuxième approche contient tous les méta-champs dans un tableau qui peut être très facilement accessible et récupéré

Juste à titre d'exemple, voici ma sortie de $asi je fais unvar_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 maintenant accéder à n'importe laquelle des métadonnées renvoyées dans votre message comme suit:

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

Qui affichera

Tom Storm

Pieter Goosen
la source
4
C'est ce qu'on appelle «Walk the Talk». Magnifique réponse.
Akhilesh
1
Mon plaisir, heureux que cela ait fonctionné pour vous. Profitez-en :-)
Pieter Goosen
1
C'est très gentil. J'adorerais voir un test similaire se concentrer sur les méta utilisateur personnalisé à la place.
Christine Cooper
1
Ça vaut vraiment le coup ;-). Je verrai ce que je peux faire dans les prochains jours, j'ai encore quelques jours à venir @ChristineCooper
Pieter Goosen
1
Agréable! Veuillez me taguer sur ce fil avec un lien au cas où vous finiriez par le faire!
Christine Cooper
0

Vous pouvez utiliser get_post_metapour récupérer toutes les valeurs de méta-champ à la fois.

$meta = get_post_meta( get_the_ID() );

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

Nilambar Sharma
la source
0

Comme l'a déclaré 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.

Cela est également vrai pour tous les appels à WP_Query. Dès que vous appelez WP_Query, WordPress récupère les métadonnées de tous les articles récupérés dans une seule requête.

Le pire des cas est que vous appeliez get_post_metades ID de publication individuels qui n'ont pas été récupérés par WordPress auparavant. Dans ce cas, chaque appel à get_post_metaentraînera une seule requête.

Un exemple de trace d'une requête à l' wp_postmetaintérieur d'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 voir, l'appel provient de l'intérieur get_postset récupère les métadonnées de 2 publications, qui sont le résultat de l'original WP_Query.

greenone83
la source