Aby odpowiedzieć na to pytanie, poszedłem i przeprowadziłem kilka testów, a wyniki były naprawdę oszałamiające.
Oto mój test
Aby to zrobić, skonfiguruj się ze stroną testową. Wystarczy skopiować page.php, zmienić jego nazwę i usunąć pętlę. Teraz po prostu utwórz nową stronę w zapleczu. Zanim zaczniesz, najpierw przetestuj licznik czasu z pustymi informacjami, aby uzyskać liczbę zapytań bez żadnych danych
Utworzyłem łącznie 5 pól meta dla stanowiska testowego,
enclosure
,
First name
,
Last name
,
packages
i
post_views_count
Mój post testowy miał identyfikator 530
. Wewnątrz posta możesz po prostu użyć $post->ID
lub get_the_ID()
ustawić identyfikator posta
Mój pierwszy test był następujący:
<?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>
co dało mi następujące wyniki
1 zapytań w 0,00195 sekund.
Mój drugi test był następujący:
<?php
timer_start();
$a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>
co zaskakująco dało ten sam wynik
1 zapytań w 0,00195 sekund.
Jeśli spojrzeć na kod źródłowy dla get_post_meta()
zobaczysz, że get_post_meta()
jest po prostu tylko dla wrapper get_metadata()
. Więc to jest to, gdzie musisz spojrzeć. Kod źródłowy dla get_metadata()
zobaczysz, że metadane uzyskać buforowane.
Więc na twoje pytanie dotyczące tego, którego użyć i na temat wydajności, odpowiedź brzmi: to zależy od ciebie. Widziałeś dowód w wynikach
Moim osobistym zdaniem, jeśli chcesz pobrać 10 pól metadanych (lub w moim przypadku 5), zastosuj drugie podejście w mojej odpowiedzi.
$a = get_post_meta(530);
Pisanie jest nie tylko szybsze, ale również nie powinieneś powtarzać kodu. Należy również zwrócić uwagę na to, że drugie podejście zawiera wszystkie pola meta w tablicy, do których można bardzo łatwo uzyskać dostęp
Na przykład, oto mój wynik z, $a
jeśli zrobię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"
}
}
Możesz teraz uzyskać dostęp do dowolnych zwróconych metadanych w swoim poście w następujący sposób:
echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>";
Który wyświetli się
Tom Storm
Możesz użyć,
get_post_meta
aby pobrać wszystkie wartości pól meta naraz.Spowoduje to pobranie wszystkich meta wartości danego postu. Użyj tej tablicy zamiast pobierania pojedynczo.
źródło
Jak stwierdził Pieter Goosen, wszystkie metadane dla jednego postu są buforowane, gdy żądasz metadanych po raz pierwszy.
Dotyczy to również wszelkich połączeń z
WP_Query
. Jak tylko zadzwoniszWP_Query
, WordPress pobiera metadane dla wszystkich pobranych postów w jednym zapytaniu.Najgorszym scenariuszem jest to, że dzwonisz
get_post_meta
po indywidualne identyfikatory postów, które nie były wcześniej pobierane przez WordPress. W takim przypadku każde wywołanie doget_post_meta
spowoduje pojedyncze zapytanie.Przykładowy ślad z zapytania do
wp_postmeta
wewnątrzWP_Query
:Jak widać, połączenie pochodzi z wewnątrz
get_posts
i pobiera metadane dla 2 postów, co jest wynikiem oryginałuWP_Query
.źródło