Efek kolom meta pos kustom pada kinerja pada postingan

10

Saya memiliki posting yang memiliki banyak bidang meta khusus yang ditentukan. Pada posting saya memanggil mereka menggunakan persyaratan get_post_meta. Berarti untuk 10 bidang meta saya menggunakannya 10 kali.

Apakah saya melakukannya dengan benar? Berarti, apakah ada masalah kinerja dengan metode di atas dan jika ya maka bagaimana cara mengurangi jumlah panggilan.

Saya mengetahui jawaban yang tersedia di sini: Bidang Kustom dan kinerja yang menjelaskan penggunaan 'permintaan tunggal'. Namun tidak jelas dan terdengar jadi bertanya lagi apakah ada yang tahu dan ingin berbagi secara detail.

Akhilesh
sumber

Jawaban:

25

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->IDatau 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 $ajika 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

Pieter Goosen
sumber
4
Ini disebut 'Walk the Talk'. Jawaban yang bagus
Akhilesh
1
Kesenangan saya, senang itu berhasil untuk Anda. Selamat menikmati :-)
Pieter Goosen
1
Ini sangat bagus. Saya ingin melihat pengujian serupa yang berfokus pada meta pengguna kustom sebagai gantinya.
Christine Cooper
1
Pasti layak dilakukan ;-). Akan melihat apa yang dapat saya lakukan dalam beberapa hari ke depan, memiliki beberapa hari yang sibuk di depan sekarang @ ChristineCooper
Pieter Goosen
1
Bagus! Harap beri tag saya di utas ini dengan tautan jika Anda akhirnya melakukannya!
Christine Cooper
0

Anda bisa menggunakan get_post_metauntuk mengambil semua nilai bidang meta sekaligus.

$meta = get_post_meta( get_the_ID() );

Ini akan mengambil semua nilai meta dari posting yang diberikan. Gunakan array itu alih-alih mengambil satu per satu.

Nilambar Sharma
sumber
0

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 menelepon WP_Query, WordPress mengambil meta data untuk semua posting yang diambil dalam satu permintaan.

Skenario kasus terburuk adalah bahwa Anda meminta get_post_metaID pos individu yang belum diambil oleh WordPress sebelumnya. Dalam hal ini, setiap panggilan ke get_post_metaakan menghasilkan satu permintaan.

Jejak sampel dari kueri ke wp_postmetadalam 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)

Seperti yang Anda lihat, panggilan berasal dari dalam get_postsdan mengambil data meta untuk 2 posting, yang merupakan hasil dari aslinya WP_Query.

greenone83
sumber