Benutzerdefinierter Post-Meta-Feldeffekt auf die Leistung des Posts

10

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

Mache ich das richtig? Bedeutet, gibt es Leistungsprobleme mit der oben genannten Methode und wenn ja, wie kann die Anzahl der Anrufe reduziert werden?

Mir ist die hier verfügbare Antwort bekannt: Benutzerdefinierte Felder und Leistung , die die Verwendung von "Einzelabfrage" erklären. Aber es ist nicht klar und vernünftig, also fragen Sie noch einmal, ob jemand es weiß und im Detail teilen möchte.

Akhilesh
quelle

Antworten:

24

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

Hier ist mein Test

Richten Sie sich dazu selbst eine Testseite ein. Kopieren Sie einfach page.php, benennen Sie es um und löschen Sie die Schleife. Erstellen Sie jetzt 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 einen Ausweis von 530. Innerhalb eines Posts können Sie einfach die Post-ID verwenden $post->IDoder get_the_ID()festlegen

Mein erster Test war also 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 die folgenden 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 man sich die aussehen Quellcode für get_post_meta(), sehen Sie , dass get_post_meta()ist einfach nur ein Wrapper für get_metadata(). Hier müssen Sie also suchen. Im Quellcode für sehen get_metadata()Sie, dass die Metadaten zwischengespeichert werden.

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

Wenn Sie meiner persönlichen 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 Punkt, den Sie hier beachten sollten: Der zweite Ansatz enthält alle Metafelder in einem Array, auf das sehr einfach zugegriffen und abgerufen werden kann

Nur als Beispiel, hier ist meine Ausgabe von, $awenn ich a machevar_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 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

Pieter Goosen
quelle
4
Dies wird als "Walk the Talk" bezeichnet. Wunderbare Antwort.
Akhilesh
1
Es war mir ein Vergnügen, froh, dass es für Sie geklappt hat. Viel Spaß :-)
Pieter Goosen
1
Das ist sehr nett. Ich würde gerne einen ähnlichen Test sehen, der sich stattdessen auf benutzerdefinierte Benutzer-Metas konzentriert.
Christine Cooper
1
Auf jeden Fall einen Besuch wert ;-). Werde sehen, was ich in den nächsten Tagen tun kann, habe jetzt ein paar hektische Tage vor mir @ChristineCooper
Pieter Goosen
1
Nett! Bitte kennzeichnen Sie mich in diesem Thread mit einem Link, falls Sie es am Ende tun!
Christine Cooper
0

Mit können Sie get_post_metaalle Metafeldwerte gleichzeitig abrufen.

$meta = get_post_meta( get_the_ID() );

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

Nilambar Sharma
quelle
0

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

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

Das schlimmste Szenario ist, dass Sie get_post_metaeinzelne Post-IDs anfordern, die zuvor noch nicht von WordPress abgerufen wurden. In diesem Fall führt jeder Aufruf von zu get_post_metaeiner einzelnen Abfrage.

Ein Beispiel-Trace von einer Abfrage in wp_postmetaein 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 können, stammt der Anruf von innen get_postsund ruft Metadaten für 2 Posts ab, die das Ergebnis des Originals sind WP_Query.

greenone83
quelle