व्यवस्थापक: कोर मेटा क्वेरी के कारण बहुत धीमी गति से संपादित पृष्ठ


11

जब हम किसी पोस्ट या पेज को एडिट करने जा रहे होते हैं तो हम वास्तव में लंबे समय के लोडिंग समय को देख रहे होते हैं। क्वेरी मॉनिटर का उपयोग करते हुए, हमने पाया कि यह WP कोर क्वेरी 15-20s तक ले जा रही है।

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()

हम बहुत सारे पोस्टमैट का उपयोग करते हैं क्योंकि हमारे पोस्ट प्रकारों में से एक लगभग 20 या तो कस्टम फ़ील्ड का उपयोग करता है। मैं कहूंगा कि शायद हम पोस्टमैटा पर बहुत अधिक भरोसा करते हैं, लेकिन यह बहुत ही अपर्याप्त प्रश्न लगता है, यह देखते हुए कि यह पोस्ट की आईडी का चयन भी नहीं कर रहा है।

क्या यह एक सामान्य मुद्दा है? क्या फ़िल्टर के माध्यम से इस फ़ंक्शन को अक्षम करने का कोई तरीका है? किसी इनपुट के लिए धन्यवाद।


क्या यह किसी भी प्लगइन्स और डिफ़ॉल्ट थीम के बिना होता है?
बीरगिरे

हाँ यह करता है। जैसा कि ऊपर उल्लेख किया गया है, मैंने WP कोर से संबंधित धीमी क्वेरी की पहचान की है। मेरे द्वारा प्रदान किए गए उत्तर में फ़ंक्शन के साथ, कस्टम फ़ील्ड मेटा बॉक्स अक्षम है, जो क्वेरी को चलने से रोकता है।
Psorensen

2
मुझे पता है कि मुझे पता है, मैंने अभी meta_form()फ़ंक्शन की जाँच की है और यह वास्तव में उस मुख्य फ़ंक्शन से उत्पन्न SQL क्वेरी है। आप कोड में संशोधनों के साथ अपने स्वयं के कस्टम मेटाबोक्स को जोड़ने meta_form()और अपने सुझाए गए SQL क्वेरी का उपयोग करने का प्रयास कर सकते हैं। मुझे यह # 8561 बंद ट्रेक टिकट मिला। आप शायद एक और टिकट बना सकते हैं या इसे फिर से खोलने की कोशिश कर सकते हैं? पुनश्च: ध्यान दें कि मेटाबॉक्स का चयन करने वाला मूल पृष्ठ भी समस्याग्रस्त है। यदि आपको 1 मिलियन पृष्ठ मिले हैं, तो वे सभी कुछ चुनिंदा विकल्पों के रूप में दिखाई देंगे!
बिरगीयर

2
: एक समाधान सीएसएस-ट्रिक्स पर प्रस्तावित css-tricks.com/...
psorensen

दिलचस्प समाधान वहाँ है, लेकिन ऐसा लगता है कि यह पूरे meta_form()समारोह की जगह ले रहा है। मैंने उत्तर को अपडेट किया - कोर SQL क्वेरी को WP संस्करण 4.3 में समायोजित किया गया है .. क्या आपको हमारे अतिरिक्त post_idप्रतिबंध की तुलना में इस नई SQL क्वेरी के साथ कोई प्रदर्शन लाभ दिखाई देता है ?
18

जवाबों:


5

यदि आप अपने कस्टम एसक्यूएल का परीक्षण करना चाहते हैं, तो यह देखने के लिए कि यह लोडिंग समय को कैसे प्रभावित करता है, आप इस क्वेरी को स्वैप करने का प्रयास कर सकते हैं:

/**
 * 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;
    } );                                                            
} );

यहां हम add_meta_boxes_{$post_type}हुक का उपयोग करते हैं, जहां $post_type = 'post'

यहाँ हम पूरी क्वेरी स्वैप करते हैं, लेकिन हम इसे डायनामिक लिमिट का समर्थन करने के लिए समायोजित भी कर सकते हैं।

उम्मीद है कि आप इसे अपनी आवश्यकताओं के लिए समायोजित कर सकते हैं।

अपडेट करें:

यह संभावित धीमा SQL कोर क्वेरी, अब WP संस्करण 4.3 से समायोजित किया गया है

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

सेवा:

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;

अधिक जानकारी के लिए कोर टिकट # 24498 देखें


2

यदि आप फ़ंक्शन के स्रोत कोड के माध्यम से ब्राउज़ करते हैं, तो आपको यह मिल जाएगा:

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

postmeta_form_keysहुक का उपयोग करके आप इस अक्षम क्वेरी को पूरी तरह से कॉल करने से बचने के लिए मैन्युअल रूप से कुंजी निर्दिष्ट कर सकते हैं:

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

दिलचस्प। स्रोत कोड में यह कहाँ मौजूद है?
Psorensen

wp-admin / में शामिल हैं / template.php: 595 4.4 के रूप में
3

2

क्या आप इसे आज़मा सकते हैं यह एक समाधान नहीं है, बल्कि एक अस्थायी समाधान है।

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

मेटाबोक्स को हटाने से धीमी क्वेरी को भी रोकता है।

function remove_metaboxes() {
     remove_meta_box( 'postcustom', 'page', 'normal' );
}
add_action('admin_menu', 'remove_metaboxes');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.