Untuk menjawab ini, saya telah pergi dan melakukan beberapa tes tentang ini, dan hasilnya benar-benar mengejutkan.
Ini tes saya
Untuk ini sendiri, siapkan diri Anda dengan halaman uji. Cukup salin page.php, ganti nama dan hapus loop. Sekarang cukup buat halaman baru di bagian belakang. Sebelum Anda mulai, uji dulu timer Anda dengan info kosong untuk mendapatkan jumlah pertanyaan tanpa data
Saya telah membuat 5 bidang meta sekaligus untuk pos tes,
enclosure
,
First name
,
Last name
,
packages
dan
post_views_count
Pos pengujian saya memiliki ID dari 530
. Di dalam pos Anda cukup menggunakan $post->ID
atau get_the_ID()
untuk mengatur ID pos
Jadi tes pertama saya adalah sebagai berikut:
<?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>
yang memberi saya hasil berikut
1 kueri dalam 0,00195 detik.
Tes kedua saya adalah sebagai berikut:
<?php
timer_start();
$a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>
yang, secara mengejutkan memberikan hasil yang sama
1 kueri dalam 0,00195 detik.
Jika Anda melihat kode sumber untuk get_post_meta()
, Anda akan melihat bahwa get_post_meta()
hanya hanya bungkus untuk get_metadata()
. Jadi ini yang perlu Anda perhatikan. The kode sumber untuk get_metadata()
, Anda akan melihat bahwa metadata mendapatkan cache.
Jadi pada pertanyaan Anda tentang mana yang harus digunakan dan tentang kinerja, jawabannya adalah, terserah Anda. Anda telah melihat buktinya dalam hasil
Menurut pendapat pribadi saya, jika Anda perlu mengambil 10 bidang data meta, (atau dalam kasus saya 5), gunakan pendekatan kedua dalam jawaban saya.
$a = get_post_meta(530);
Ini tidak hanya lebih cepat untuk menulis, tetapi Anda juga tidak boleh mengulangi kode. Poin lain yang perlu diperhatikan di sini, pendekatan kedua menampung semua bidang meta dalam array yang dapat dengan mudah diakses dan diambil
Seperti contohnya, ini adalah output saya $a
jika saya melakukanvar_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"
}
}
Sekarang Anda dapat mengakses data meta yang dikembalikan di pos Anda sebagai berikut:
echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>";
Yang akan ditampilkan
Tom Storm
Anda bisa menggunakan
get_post_meta
untuk mengambil semua nilai bidang meta sekaligus.Ini akan mengambil semua nilai meta dari posting yang diberikan. Gunakan array itu alih-alih mengambil satu per satu.
sumber
Seperti yang dikatakan Pieter Goosen, semua data meta untuk satu posting di-cache ketika Anda meminta meta-data untuk pertama kalinya.
Ini juga berlaku untuk semua panggilan
WP_Query
. Segera setelah Anda meneleponWP_Query
, WordPress mengambil meta data untuk semua posting yang diambil dalam satu permintaan.Skenario kasus terburuk adalah bahwa Anda meminta
get_post_meta
ID pos individu yang belum diambil oleh WordPress sebelumnya. Dalam hal ini, setiap panggilan keget_post_meta
akan menghasilkan satu permintaan.Jejak sampel dari kueri ke
wp_postmeta
dalamWP_Query
:Seperti yang Anda lihat, panggilan berasal dari dalam
get_posts
dan mengambil data meta untuk 2 posting, yang merupakan hasil dari aslinyaWP_Query
.sumber