Benutzerdefinierter Post-Meta-Feldeffekt auf die performance des Posts

Ich habe die Beiträge, die viele benutzerdefinierte Metafelder haben. Auf Posts rufe ich sie auf Anforderung mit get_post_meta . Mittel für 10 Meta-Felder Ich verwende es 10 mal.

Mache ich das richtig? Bedeutet, gibt es irgendein performancesproblem mit der oben genannten Methode und wenn ja dann, wie man die Anzahl von Anrufen verringert.

Ich bin mir der Antwort bewusst, die hier verfügbar ist: Benutzerdefinierte Felder und performance, die erklärt, dass die Verwendung von “Single Query”. Aber es ist nicht klar und klingt so fragend, ob jemand es weiß und im Detail teilen will.

Solutions Collecting From Web of "Benutzerdefinierter Post-Meta-Feldeffekt auf die performance des Posts"

Um dies zu beantworten, habe ich einige Tests durchgeführt und die Ergebnisse waren wirklich überwältigend.

Hier ist mein Test

Stellen Sie sich dazu eine Testseite vor. Kopieren Sie einfach page.php, benennen Sie es um und löschen Sie die Schleife. Jetzt erstellen Sie einfach eine neue Seite im Backend. Bevor Sie beginnen, testen Sie zunächst Ihren Timer mit leeren Informationen, um die Anzahl der Abfragen ohne Daten zu erhalten

Ich habe insgesamt 5 Meta-Felder für einen Test-Post erstellt,

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

Mein Testposten hatte eine ID von 530 . Innerhalb eines get_the_ID() können Sie einfach $post->ID oder get_the_ID() , um die Post ID zu setzen

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

< ?php echo get_num_queries(); ?> queries in < ?php timer_stop(1, 5); ?> seconds.

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

< ?php echo get_num_queries(); ?> queries in < ?php timer_stop(1, 5); ?> seconds.

was überraschenderweise zu dem gleichen Ergebnis führte

1 Abfragen in 0,00195 Sekunden.

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

Also auf Ihre Frage, welche zu verwenden und über performance, die Antwort wird sein, es liegt an Ihnen. Sie haben den Beweis in den Ergebnissen gesehen

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

 $a = get_post_meta(530); 

Es ist nicht nur schneller zu schreiben, aber Sie sollten auch nicht Code wiederholen. Ein weiterer Punkt, der hier zu beachten ist, der zweite Ansatz enthält alle Meta-Felder in einem Array, auf die sehr leicht zugegriffen werden kann und die abgerufen werden können

Nur als Beispiel, hier ist meine Ausgabe von $a wenn ich eine 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" } } 

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

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

Welches wird angezeigt

Tom Sturm

Sie können get_post_meta , um alle Meta- get_post_meta abzurufen.

 $meta = get_post_meta( get_the_ID() ); 

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

Wie Pieter Goosen ausgeführt hat, werden alle Metadaten für einen Post zwischengespeichert, wenn Sie zum ersten Mal Metadaten anfordern.

Dies gilt auch für alle Aufrufe von WP_Query . Sobald Sie WP_Query aufrufen, WP_Query WordPress die Metadaten für alle abgerufenen Posts in einer einzigen Abfrage ab.

Im schlimmsten Fall rufen Sie get_post_meta für einzelne Post-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.

Eine Beispielablaufverfolgung von einer Abfrage nach wp_postmeta in einer 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, was das Ergebnis der ursprünglichen WP_Query .