Yönetici: temel meta sorgusunun neden olduğu çok yavaş düzenleme sayfası


11

Bir yayını veya sayfayı düzenlerken çok uzun yükleme sürelerini fark ettik. Sorgu İzleyicisi'ni kullanarak, bu WP çekirdek sorgusunun 15-20 saniyeye kadar yükseldiğini tespit ettik.

SELECT meta_key 
FROM wp_postmeta 
GROUP BY meta_key 
HAVING meta_key NOT LIKE '\\_%' 
ORDER BY meta_key 
LIMIT 30

caller: 
meta_form()
post_custom_meta_box()
do_meta_boxes()

Yazı tiplerimizden biri yaklaşık 20 kadar özel alan kullandığından çok postmeta kullanıyoruz. Belki de postmeta'ya çok güveniyoruz diyebilirim, ama bu mesajın kimliğini bile seçmediğini görerek çok yetersiz bir sorgu gibi görünüyor.

Bu yaygın bir sorun mu? Bu işlevi bir filtre aracılığıyla devre dışı bırakmanın bir yolu var mı? Herhangi bir giriş için teşekkürler.


Bu herhangi bir eklenti ve varsayılan tema olmadan gerçekleşir mi?
birgire

Evet öyle. Yukarıda belirtildiği gibi, yavaş sorguyu WP çekirdeğine ait olarak tanımladım. Verdiğim yanıttaki işlevle, sorgunun çalışmasını engelleyen özel alanlar meta kutusu devre dışı bırakılır.
psorensen

2
Ben biliyorum biliyorum, ben sadece meta_form()işlevi teslim ve bu gerçekten bu çekirdek işlev üretilen SQL sorgusu. Koddaki değişikliklerle kendi özel meta kutunuzu eklemeyi deneyebilir meta_form()ve orada önerilen SQL sorgunuzu kullanabilirsiniz. 8561 numaralı kapalı trac biletini buldum . Belki başka bir bilet oluşturabilir veya yeniden açmayı deneyebilirsiniz? Not: Metabox'ı seçen üst sayfanın da sorunlu olduğuna dikkat edin. 1 milyon sayfanız varsa, hepsi belirli seçenekler olarak görünecektir!
birgire


İlginç bir çözüm var, ancak tüm meta_form()fonksiyonun yerini alıyor gibi görünüyor . Cevabı güncelledim - çekirdek SQL sorgusu WP sürüm 4.3'te ayarlandı. Ek post_idkısıtlamamızla karşılaştırıldığında bu yeni SQL sorgusunda herhangi bir performans kazancı görüyor musunuz ?
birgire

Yanıtlar:


5

Özel SQL'inizin yükleme süresini nasıl etkilediğini test etmek istiyorsanız, bu sorguyu değiştirmeyi deneyebilirsiniz:

/**
 * Restrict the potential slow query in the meta_form() to the current post ID.
 *
 * @see http://wordpress.stackexchange.com/a/187712/26350
 */

add_action( 'add_meta_boxes_post', function( $post )
{
    add_filter( 'query', function( $sql ) use ( $post )
    {
        global $wpdb;
        $find = "SELECT meta_key
                 FROM $wpdb->postmeta
                 GROUP BY meta_key 
                 HAVING meta_key NOT LIKE '\\\_%'
                 ORDER BY meta_key 
                 LIMIT 30";
        if(    preg_replace( '/\s+/', ' ', $sql ) === preg_replace( '/\s+/', ' ', $find )
            && $post instanceof WP_Post  
        ) {
            $post_id = (int) $post->ID;
            $sql  = "SELECT meta_key
                     FROM $wpdb->postmeta
                     WHERE post_id = {$post_id}
                     GROUP BY meta_key
                     HAVING meta_key NOT LIKE '\\\_%'
                     ORDER BY meta_key
                     LIMIT 30";
        }
        return $sql;
    } );                                                            
} );

Burada add_meta_boxes_{$post_type}kancayı kullanıyoruz, nerede $post_type = 'post'.

Burada tüm sorguyu değiştirdik, ancak bunu dinamik sınırı destekleyecek şekilde de ayarlayabilirdik.

Umarım bunu ihtiyaçlarınıza göre ayarlayabilirsiniz.

Güncelleme:

Bu potansiyel olarak yavaş SQL çekirdek sorgusu, şimdi WP sürüm 4.3'te

SELECT meta_key 
FROM wp_postmeta 
GROUP BY meta_key 
HAVING meta_key NOT LIKE '\\_%' 
ORDER BY meta_key 
LIMIT 30

için:

SELECT DISTINCT meta_key
FROM wp_postmeta
WHERE meta_key NOT BETWEEN '_' AND '_z'
HAVING meta_key NOT LIKE '\_%'
ORDER BY meta_key
LIMIT 30;

Daha fazla bilgi için # 24498 numaralı çekirdek bilete göz atın .


2

Fonksiyonun kaynak koduna göz atarsanız, bunu bulacaksınız:

$keys = apply_filters( 'postmeta_form_keys', null, $post );
if ( null === $keys ) {
    ...      
}

postmeta_form_keysKancayı kullanarak, bu verimsiz sorguyu tamamen çağırmamak için tuşları manuel olarak belirleyebilirsiniz:

add_filter('postmeta_form_keys', function(){
    return ['your_meta_key'];
});

İlginç. Bu kaynak kodun neresinde var?
psorensen

wp-admin / include / template.php: 4.4'ten itibaren 595
markdwhite

2

Bunu deneyebilir misin? Bu bir çözüm değil, geçici bir çözümdür.

// disable big slowdown http://wordpress.stackexchange.com/questions/187612/admin-very-slow-edit-page-caused-by-core-meta-query
function dj_limit_postmeta( $string, $post ) {
    return array(null);
}
add_filter( 'postmeta_form_keys', 'dj_limit_postmeta', 10, 3 );

-1

Meta kutuları kaldırmak yavaş sorguyu da engeller.

function remove_metaboxes() {
     remove_meta_box( 'postcustom', 'page', 'normal' );
}
add_action('admin_menu', 'remove_metaboxes');
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.