1. WP_Query çalıştırılmadan önce sorguyu ayarlayın
Bu, sorguları değiştirmek için tek fırsat elbette SQL veritabanında çalıştırılmadan önce olduğundan, veritabanı sorgularını minimumda tutmaya çalışırken akılda tutulması gereken en önemli şey gibi görünüyor.
Normal Sorgular
WordPress, normal bir sorgu için, wp()
sırasıyla çağrıları çağırır $wp->main( $query_vars )
. Koşullu etiketlerden "is_ değişkenleri", bunları geçirmeden önce ayarlanır WP_Query->get_posts()
; bu, onu MySQL veritabanı sorgusuna dönüştürür ve son olarak bunları $ wp_query nesnesinde saklar. SQL veritabanında çalıştırılmadan önce sorguyu filtrelemek mümkündür .
pre_get_posts
Eylem o geçmeden önce sorguyu değiştirmek için izin, bu sürecin içine takar WP_Query->get_posts()
.
Örneğin, "öne çıkan" kategorisindeki gönderiler için sorguyu filtrelemek istiyorsanız add_action( 'pre_get_posts', 'your_function_name' );
, in_category
koşullu etiketi kullanacak ve içine dahil edeceksiniz your_function_name
.
function your_function_name( $query ) {
if ( $query->in_category( 'featured' ) && $query->is_main_query() ) {
// Replace 123 with the category ID of the featured category.
$query->set( 'cat', '123' );
}
}
add_action( 'pre_get_posts', 'your_function_name' );
Eklenti API'sı / İşlem Başvurusu / ön gönderiler konusuna bakın «WordPress Codex
Sayfa İstekleri
"Öne çıkan" kategorisinin arşiv sayfası gibi sayfa şablonlarında olduğu gibi koşullu etiketler pre_get_posts
filtreden çalışmaz . Örneğin, is_category
WP_Query çalışmadığından arşiv sayfasını denetlemek için kullanamazsınız .
Bunun yerine, new WP_Query
gibi bir şeye benzeyen sayfa istekleri için ana sorguyu değiştirmeniz gerekir $query = new WP_Query( 'cat=123' );
. Bu, sorguyu başlangıçtan itibaren uygun argümanla çalıştırır.
Bkz. Sınıf Referansı / WP Sorgusu «WordPress Codex
2. Veritabanına kaydetme
Filtreyi wp_insert_post_data
, yalnızca özel gönderi türünüzle alakalı $ verilerinin döndürülmesini sağlayarak kullanabilirsiniz wp_insert_post
. Özel yayın türünüzü kontrol etmek için bir koşullu ifade eklediğinizden emin olun.
Eklenti API / Filtre Referansı / wp yazılan veri ekleme «WordPress Codex
Bu kanca, özel yazı türünüzü güncellediğinizde, genellikle bir taslak kaydederek veya yayını yayınlayarak wp_update_postwp_insert_post
tarafından çağrılan işlev tarafından çağrılır .
Kişisel olarak veritabanında güncellenen verilerin azaltılmasının optimizasyon önemi hakkında konuşamadığım için bunu kendiniz karşılaştırmalısınız.
3. Özel gönderi türleri performansı etkiler mi?
Deneyimlerime göre, özel gönderi türleri içeriği yönetmek için güçlü bir araçtır. Yayınları daha az kaynak kullanacak şekilde izin verdiği tüm yollarla yönetmenin başka bir yolunu bilmiyorum. Kişisel olarak mümkün olan yerlerde yapılan sorgu sayısını azaltmanın yollarını bulmaya odaklanacağım.
Kalıcı bağlantı yapısı ile ilgili bir performans sorunu vardı, bir sayı yerine metinle başladığında isabet almasına neden oldu. 3 Bu, özellikle çok sayıda sayfa barındıran siteler için zahmetliydi, ancak WordPress sürüm 3.3'ten beri çözüldü.
Burada sadece kalıcı bağlantılar getiriyorum çünkü slug genellikle permalink yapısının sürüm 3.3'ten önceki performansı etkilemiş veya etkilememiş olabilir. Bunun yanı sıra, özel gönderi türlerinin kullanımından kaynaklanan performans sorunlarının farkında değilim.
Diğer Performans Seçenekleri
Geçişler
Bu, kodunuzda sorguları minimumda tutmak için bir yedek değildir, ancak yeni sorguların gerekmemesi için sorguları bir süre saklamak için set_transient'i kullanabilirsiniz . İşte Dave Clements'in gönderisinde kullanılan örnek . Ayrıca, save_post
belirli bir gönderi türü güncellendiğinde geçici olanı silmek için bir eylem eklemeyi önerdiğini unutmayın .
<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( 'its_query' ) ) ) {
$pttimestamp = time() + get_option('gmt_offset') * 60*60;
$its_query = new WP_Query( array(
'post_type' => 'spotlight',
'posts_per_page' => 1,
'post__not_in' => $do_not_duplicate,
'meta_query' => array(
array(
'key' => '_hpc_spotlight_end_time',
'value' => $pttimestamp,
'compare' => '>'
)
)
) );
set_transient( 'its_query', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
// LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>
Daha fazla sorgu optimizasyonu
Thomas Griffin'in WordPress Sorgularını Optimize Etme eğitiminde birkaç iyi ipucu var . İşte önerilerinin kısa bir listesi:
'cache_results' => false
Sunucunuz Memcached gibi kalıcı önbellekleme kullanmıyorsa, tek seferlik sorgularda ayarlayın . Bir kerelik sorgular "küçük miktarlarda veri göstermek için kullanılan sorgular olarak tanımlanır. Yalnızca geçerli gönderiyle ilgili bağlantılı gönderi başlıklarını görüntülemek isteyebilir veya seçim yapmak için gönderilerin açılır listesini görüntülemek isteyebilirsiniz belirli bir seçenek ayarı. "
Onun örneği: $query = get_posts( array( 'posts_per_page' => 1,
'cache_results' => false ) );
'no_found_rows' => true
Sayfalandırmanın gerekli olmadığı yeri ayarlayın . Bu "sayfalandırmaya ihtiyacımız olup olmadığını görmek için sonuçları sayarak MySQL'i atlar."
Onun örneği: $query = new WP_Query( array( 'posts_per_page' => 1,
'no_found_rows' => true ) );
Posta kimlikleri için yalnızca ihtiyacınız 'fields' => 'ids'
olan tek şey bu olduğunda sorgulayın get_posts
. Bu, Veritabanı Açıklama'ya bakarsanız her gönderi için çok fazla olan döndürülen veri miktarını önemli ölçüde azaltmalıdır.
«WordPress Codex
Onun örneği: $query = get_posts( array( 'posts_per_page' => 1,
'fields' => 'ids' ) );
Bu son ipucuna ek olarak, get_post_field kullanarak yalnızca bir veya birkaç gönderi alanına ihtiyacınız olduğunda aynı mantık uygulanabilir .
Sorgunun nasıl çalıştığına dair sağlam bir anlayışa sahip olmak çok önemlidir. Sorgularınızla ne kadar spesifik olursanız, SQL veritabanınızdan daha az çalışma talep edersiniz. Bu, veritabanı sorgularını yönetmek için çok sayıda olasılık olduğu anlamına gelir. Çalıştırdıkları yere kadar özel sorgulara dikkat edin (bir yönetici sayfası mıdır?), Doğrudan sorgularda uygun sanitizasyon kullanın ve aynı performansı elde etmenizi sağlayan yerel WordPress işlevlerini kullanmaya çalışın.