Admin: page d'édition très lente causée par une méta requête principale

10

Nous avons remarqué des temps de chargement très longs lorsque vous modifiez un message ou une page. À l'aide du moniteur de requêtes, nous avons constaté que cette requête principale de WP prend de 15 à 20 secondes.

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

Nous utilisons beaucoup de postmeta car l’un de nos types de publication utilise environ 20 champs personnalisés. Je dirais que nous comptons peut-être trop sur le postmeta, mais cela semble être une requête très inutile, puisqu’elle ne sélectionne même pas l’ID du message.

Est-ce un problème courant? Existe-t-il un moyen de désactiver cette fonction via un filtre? Merci pour votre contribution.

    
posée psorensen 07.05.2015 - 18:13

4 réponses

5

Si vous souhaitez tester votre code SQL personnalisé pour voir comment il affecte le temps de chargement, vous pouvez essayer cette permutation de requête:

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

Nous utilisons ici le add_meta_boxes_{$post_type} hook, où $post_type = 'post' .

Ici, nous échangeons la requête entière, mais nous aurions aussi pu l’ajuster pour prendre en charge la limite dynamique.

J'espère que vous pourrez adapter cela à vos besoins.

Mise à jour:

Cette requête principale SQL potentiellement lente, a maintenant été ajustée dans WP version 4.3 de

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;

Consultez le ticket principal # 24498 pour plus d'informations.

    
réponse donnée birgire 08.05.2015 - 11:51
2

Si vous parcourez le code source de la fonction, vous trouverez ceci:

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

En utilisant le crochet postmeta_form_keys , vous pouvez spécifier manuellement les clés pour éviter d'appeler complètement cette requête inefficace:

add_filter('postmeta_form_keys', function(){
    return ['your_meta_key'];
});
    
réponse donnée Dan K 13.07.2016 - 21:29
1

Pouvez-vous essayer ceci. Ce n'est pas une solution, mais une solution temporaire.

// 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 );
    
réponse donnée prosti 27.09.2016 - 23:30
-1

La suppression des métaboxes empêche également la requête lente.

function remove_metaboxes() {
     remove_meta_box( 'postcustom', 'page', 'normal' );
}
add_action('admin_menu', 'remove_metaboxes');
    
réponse donnée psorensen 07.05.2015 - 18:32

Lire d'autres questions sur les étiquettes