Admin: página de edición muy lenta causada por una meta consulta del núcleo

10

Hemos estado notando tiempos de carga muy largos al editar una publicación o página. Usando el Monitor de consultas, encontramos que esta consulta central de WP está tomando entre 15 y 20 segundos.

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

Usamos una gran cantidad de postmeta, ya que uno de nuestros tipos de publicación usa aproximadamente 20 campos personalizados. Diría que tal vez confiamos demasiado en postmeta, pero esto parece una consulta muy deficiente, ya que no se selecciona el ID de la publicación.

¿Es este un problema común? ¿Hay una manera de deshabilitar esta función a través de un filtro? Gracias por cualquier entrada.

    
pregunta psorensen 07.05.2015 - 18:13

4 respuestas

5

Si desea probar su SQL personalizado para ver cómo afecta el tiempo de carga, puede intentar este intercambio de consultas:

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

Aquí usamos el gancho add_meta_boxes_{$post_type} , donde $post_type = 'post' .

Aquí intercambiamos toda la consulta, pero también podríamos haberla ajustado para admitir el límite dinámico.

Espero que puedas ajustar esto a tus necesidades.

Actualización:

Esta consulta central de SQL potencialmente lenta, ahora se ha ajustado en WP versión 4.3 desde

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

a:

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;

Consulte el ticket principal # 24498 para obtener más información.

    
respondido por el birgire 08.05.2015 - 11:51
2

Si navegas por el código fuente de la función, encontrarás esto:

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

Usando el enlace postmeta_form_keys , puedes especificar manualmente las claves para evitar llamar a esta consulta ineficiente por completo:

add_filter('postmeta_form_keys', function(){
    return ['your_meta_key'];
});
    
respondido por el Dan K 13.07.2016 - 21:29
1

¿Puedes probar esto? Esto no es una solución, sino una solución temporal.

// 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 );
    
respondido por el prosti 27.09.2016 - 23:30
-1

Eliminar los metaboxes también evita la consulta lenta.

function remove_metaboxes() {
     remove_meta_box( 'postcustom', 'page', 'normal' );
}
add_action('admin_menu', 'remove_metaboxes');
    
respondido por el psorensen 07.05.2015 - 18:32

Lea otras preguntas en las etiquetas