Gönderi üzerindeki performansa özel gönderi meta alanı etkisi


10

Birçok özel tanımlı meta alanları olan gönderileri var. Yazılarda kullanma gereksinimi üzerine onları arıyorum get_post_meta. 10 meta alanı anlamına gelir 10 kez kullanıyorum.

Doğru yapıyor muyum? Yani, yukarıdaki yöntemle ilgili herhangi bir performans sorunu var mı ve evet ise, arama sayısını nasıl azaltabilirsiniz.

Burada mevcut cevabın farkındayım: Özel Alanlar ve performans 'tek sorgu' kullanımını açıklar. Ama net değil ve kulağa o kadar açık değil ki, birisinin detaylı olarak paylaşıp paylaşmadığını tekrar sormak.

Yanıtlar:


25

Bunu cevaplamak için gittim ve bu konuda bazı testler yaptım ve sonuçlar aslında akıl almazdı.

İşte benim testim

Bunu kendiniz için bir test sayfası oluşturun. Sadece page.php dosyasını kopyalayın, yeniden adlandırın ve döngüyü silin. Şimdi arka uçta yeni bir sayfa oluşturun. Başlamadan önce, herhangi bir veri içermeyen sorgu miktarını almak için zamanlayıcınızı boş bilgilerle test edin

Bir test gönderisi için toplamda 5 meta alan oluşturdum,

  • enclosure,
  • First name,
  • Last name,
  • packages ve
  • post_views_count

Test yayınımın bir kimliği vardı 530. Bir gönderinin içinde yalnızca gönderi kimliğini ayarlamak için $post->IDveya tuşunu kullanabilirsiniz.get_the_ID()

İlk testim şöyle oldu:

<?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>

bu da bana aşağıdaki sonuçları verdi

0.00195 saniyede 1 sorgu.

İkinci testim şöyleydi:

<?php               
       timer_start();       

       $a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

bu da şaşırtıcı bir şekilde aynı sonucu verdi

0.00195 saniyede 1 sorgu.

Eğer bakarsak kaynak kodu için get_post_meta(), bunu göreceksiniz get_post_meta()için basitçe sadece bir sarıcı get_metadata(). Bakmanız gereken buydu. Kaynak kodu için get_metadata(), sen meta önbelleğe olduğunu göreceksiniz.

Yani hangisini kullanacağınız ve performans hakkında sorunuz üzerine, cevap size kalmış. Sonuçlarda kanıtı gördünüz

Kişisel görüşüme göre, 10 meta veri alanını (veya benim durumumda 5) almanız gerekiyorsa, cevabımda ikinci yaklaşımı kullanın.

$a = get_post_meta(530);

Sadece yazmak daha hızlı değil, aynı zamanda kodu tekrarlamamalısınız. Burada dikkat edilmesi gereken bir diğer nokta, ikinci yaklaşım, bir dizideki çok kolay erişilebilen ve alınabilen tüm meta alanları tutar

Örnek olarak, işte $abirvar_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"
  }
}

Artık yayınınızdaki döndürülen meta verilere şu şekilde erişebilirsiniz:

echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>";

Hangisi gösterilecek

Tom Storm


4
Buna 'Walk the Talk' denir. Harika cevap.
Akhilesh

1
Memnuniyetle, senin için çalıştı sevindim. Keyfini çıkarın :-)
Pieter Goosen

1
Bu çok güzel. Bunun yerine özel kullanıcı metalarına odaklanan benzer bir test görmek isterim.
Christine Cooper

1
Kesinlikle yapmaya değer ;-). Önümüzdeki birkaç gün içinde neler yapabileceğimi görecek, birkaç gün önce telaşlı bir zaman geçireceğim @ChristineCooper
Pieter Goosen

1
Güzel! Lütfen bu iş parçacığında beni bir bağlantı ile etiketleyin, sonunda bunu yapın!
Christine Cooper

0

get_post_metaTüm meta alan değerlerini bir kerede almak için kullanabilirsiniz .

$meta = get_post_meta( get_the_ID() );

Bu, verilen yayının tüm meta değerlerini getirir. Tek tek getirmek yerine bu diziyi kullanın.


0

Pieter Goosen'in belirttiği gibi, ilk kez herhangi bir meta veri talep ettiğinizde bir gönderinin tüm meta verileri önbelleğe alınır.

Bu, yapılan tüm çağrılar için de geçerlidir WP_Query. Aradığınızda WP_Query, WordPress alınan tüm gönderilerin meta verilerini tek bir sorguda getirir.

En kötü senaryo, get_post_metadaha önce WordPress tarafından alınmamış münferit posta kimliklerini çağırmanızdır . Bu durumda, yapılacak her çağrı get_post_metatek bir sorgu ile sonuçlanır.

Bir sorgudan a'nın wp_postmetaiçine doğru bir örnek izleme 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)

Gördüğünüz gibi, arama içeriden kaynaklanır get_postsve orijinalin sonucu olan 2 gönderi için meta verileri alır WP_Query.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.