web-dev-qa-db-fra.com

Post personnalisé effet du champ méta sur la performance sur le post

J'ai les messages qui ont beaucoup de champs méta définis personnalisés. Sur les posts, je les appelle sur demande en utilisant get_post_meta. Cela signifie pour 10 champs méta que je l’utilise 10 fois.

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

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

10
Akhilesh

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 temporisateur avec des informations vides pour obtenir le nombre de requêtes sans aucune donnée

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

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

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

Donc, mon premier test était 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 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 le résultat 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 maintenant accéder aux métadonnées renvoyées dans votre message de la manière suivante:

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

Qui affichera

Tom Storm

22
Pieter Goosen

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

$meta = get_post_meta( get_the_ID() );

Cela va chercher toutes les méta-valeurs de la publication donnée. Utilisez ce tableau au lieu de chercher individuellement.

0
Nilambar

Comme Pieter Goosen l'a déclaré, 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 récupère les métadonnées de toutes les publications récupérées dans une seule requête.

Dans le pire des cas, vous appelez get_post_meta pour des identifiants de publication individuels qui n'ont pas encore été récupérés par WordPress. Dans ce cas, chaque appel à get_post_meta donnera lieu à une seule requête.

Un exemple de trace d'une requête vers wp_postmeta à l'inté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 constater, l’appel provient de get_posts et récupère les métadonnées pour 2 articles, ce qui correspond au résultat du WP_Query original.

0
greenone83