it-swarm.com.de

Effekt eines benutzerdefinierten Post-Metafelds auf die Leistung des Posts

Ich habe die Beiträge, die viele benutzerdefinierte Metafelder haben. Auf Posts rufe ich sie bei Bedarf mit get_post_meta an. Bedeutet für 10 Metafelder, ich benutze es 10 Mal.

Mache ich das richtig? Bedeutet, gibt es Leistungsprobleme mit der obigen Methode und wenn ja, wie kann man die Anzahl der Anrufe reduzieren?.

Mir ist die Antwort hier bekannt: Benutzerdefinierte Felder und Leistung was erklärt, dass die Verwendung von "Einzelabfrage". Aber es ist nicht klar und klingt so, dass man erneut fragt, ob jemand es weiß und es im Detail teilen möchte.

10
Akhilesh

Um dies zu beantworten, habe ich einige Tests durchgeführt und die Ergebnisse waren umwerfend.

Hier ist mein Test

Um dies selbst, sich mit einer Testseite einzurichten. Kopiere einfach page.php, benenne es um und lösche die Schleife. Jetzt erstelle einfach eine neue Seite im Backend. Bevor Sie beginnen, testen Sie zuerst Ihren Timer mit leeren Informationen, um die Anzahl der Abfragen ohne Daten zu erhalten

Ich habe insgesamt 5 Metafelder für einen Testbeitrag erstellt.

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

Mein Testpost hatte die ID 530. Innerhalb eines Beitrags können Sie einfach $post->ID oder get_the_ID() verwenden, um die Beitrags-ID festzulegen

Also mein erster Test war wie folgt:

<?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>

das gab mir folgende ergebnisse

1 Abfragen in 0.00195 Sekunden.

Mein zweiter Test war wie folgt:

<?php               
       timer_start();       

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

was überraschenderweise das gleiche Ergebnis ergab

1 Abfragen in 0.00195 Sekunden.

Wenn Sie sich den Quellcode für get_post_meta() ansehen, werden Sie feststellen, dass get_post_meta() nur ein Wrapper für get_metadata() ist. Das ist also, wo Sie suchen müssen. Im Quellcode für get_metadata() sehen Sie, dass die Metadaten zwischengespeichert werden.

Die Antwort auf Ihre Frage zur Verwendung und Leistung liegt bei Ihnen. Sie haben den Beweis in den Ergebnissen gesehen

Wenn Sie meiner Meinung nach 10 Metadatenfelder abrufen müssen (oder in meinem Fall 5), verwenden Sie in meiner Antwort den zweiten Ansatz.

$a = get_post_meta(530);

Es ist nicht nur schneller zu schreiben, sondern Sie sollten auch keinen Code wiederholen. Ein weiterer zu beachtender Punkt ist, dass der zweite Ansatz alle Metafelder in einem Array enthält, auf die sehr einfach zugegriffen und abgerufen werden kann

Nur als Beispiel, hier ist meine Ausgabe von $a, wenn ich eine var_dump( $a ); mache

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"
  }
}

Sie können jetzt wie folgt auf alle zurückgegebenen Metadaten in Ihrem Beitrag zugreifen:

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

Welches wird angezeigt

Tom Storm

22
Pieter Goosen

Sie können get_post_meta verwenden, um alle Metafeldwerte gleichzeitig abzurufen.

$meta = get_post_meta( get_the_ID() );

Dadurch werden alle Meta-Werte des angegebenen Posts abgerufen. Verwenden Sie dieses Array, anstatt es einzeln abzurufen.

0
Nilambar

Wie Pieter Goosen sagte, werden alle Metadaten für einen Beitrag zwischengespeichert, wenn Sie zum ersten Mal Metadaten anfordern.

Dies gilt auch für alle Anrufe an WP_Query. Sobald Sie WP_Query aufrufen, ruft WordPress die Metadaten für alle abgerufenen Beiträge in einer einzigen Abfrage ab.

Im schlimmsten Fall rufen Sie get_post_meta für einzelne Beitrags-IDs auf, die zuvor noch nicht von WordPress abgerufen wurden. In diesem Fall führt jeder Aufruf von get_post_meta zu einer einzelnen Abfrage.

Ein Beispieltrace von einer Abfrage zu wp_postmeta in einem 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)

Wie Sie sehen, stammt der Aufruf aus get_posts und ruft Metadaten für 2 Posts ab, die das Ergebnis des ursprünglichen WP_Query sind.

0
greenone83