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->ID
oder 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, $a
wenn 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
Mit können Sie
get_post_meta
alle Metafeldwerte gleichzeitig abrufen.Dadurch werden alle Metawerte des angegebenen Beitrags abgerufen. Verwenden Sie dieses Array, anstatt es einzeln abzurufen.
quelle
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 anrufenWP_Query
, ruft WordPress die Metadaten für alle abgerufenen Beiträge in einer einzigen Abfrage ab.Das schlimmste Szenario ist, dass Sie
get_post_meta
einzelne Post-IDs anfordern, die zuvor noch nicht von WordPress abgerufen wurden. In diesem Fall führt jeder Aufruf von zuget_post_meta
einer einzelnen Abfrage.Ein Beispiel-Trace von einer Abfrage in
wp_postmeta
einWP_Query
:Wie Sie sehen können, stammt der Anruf von innen
get_posts
und ruft Metadaten für 2 Posts ab, die das Ergebnis des Originals sindWP_Query
.quelle