Quản trị viên: trang chỉnh sửa rất chậm gây ra bởi truy vấn meta lõi


11

Chúng tôi đã nhận thấy thời gian tải thực sự dài khi đi chỉnh sửa một bài viết hoặc trang. Sử dụng Trình theo dõi truy vấn, chúng tôi thấy rằng truy vấn lõi WP này mất tới 15-20 giây.

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

Chúng tôi sử dụng rất nhiều postmeta vì một trong những loại bài đăng của chúng tôi sử dụng khoảng 20 trường tùy chỉnh. Tôi có thể nói rằng có lẽ chúng ta phụ thuộc quá nhiều vào postmeta, nhưng đây có vẻ như là một truy vấn rất thiếu sót, vì thấy rằng nó thậm chí không chọn ID của bài đăng.

Đây có phải là một vấn đề phổ biến? Có cách nào để tắt chức năng này thông qua bộ lọc không? Cảm ơn cho bất kỳ đầu vào.


Điều này xảy ra mà không có bất kỳ plugin và chủ đề mặc định?
bạch dương

Có nó làm. Như đã đề cập ở trên, tôi đã xác định truy vấn chậm là thuộc về lõi WP. Với chức năng trong câu trả lời tôi đã cung cấp, hộp meta trường tùy chỉnh bị tắt, điều này ngăn truy vấn chạy.
psorensen

2
Tôi thấy nó biết, tôi vừa kiểm tra meta_form()hàm và đây thực sự là truy vấn SQL được tạo từ hàm lõi đó. Bạn có thể thử thêm metabox tùy chỉnh của riêng bạn với các sửa đổi cho mã meta_form()và sử dụng truy vấn SQL được đề xuất của bạn. Tôi tìm thấy vé 85ac đóng kín này. Bạn có thể có thể tạo một vé khác hoặc cố gắng mở lại cái này? PS: Lưu ý rằng trang mẹ chọn metabox cũng có vấn đề. Nếu bạn có 1 triệu trang, thì tất cả chúng sẽ hiển thị dưới dạng tùy chọn chọn!
bạch dương

2
Một giải pháp được đề xuất trên CSS-Tricks: css-tricks.com/ từ
psorensen

Giải pháp thú vị ở đó, nhưng có vẻ như nó thay thế toàn bộ meta_form()chức năng. Tôi đã cập nhật câu trả lời - truy vấn SQL cốt lõi đã được điều chỉnh trong phiên bản WP 4.3 .. Bạn có thấy bất kỳ hiệu suất nào đạt được với truy vấn SQL mới này so với post_idhạn chế bổ sung của chúng tôi không?
bạch dương

Câu trả lời:


5

Nếu bạn muốn kiểm tra SQL tùy chỉnh của mình để xem nó ảnh hưởng đến thời gian tải như thế nào, bạn có thể thử hoán đổi truy vấn này:

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

Ở đây chúng tôi sử dụng add_meta_boxes_{$post_type}móc, ở đâu $post_type = 'post'.

Ở đây chúng tôi trao đổi toàn bộ truy vấn, nhưng chúng tôi cũng có thể điều chỉnh nó để hỗ trợ giới hạn động.

Hy vọng bạn có thể điều chỉnh điều này theo nhu cầu của bạn.

Cập nhật:

Truy vấn lõi SQL có khả năng chậm này, hiện đã được điều chỉnh trong phiên bản WP 4.3 từ

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

đến:

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;

Kiểm tra vé lõi # 24498 để biết thêm.


2

Nếu bạn duyệt qua mã nguồn của chức năng, bạn sẽ tìm thấy điều này:

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

Sử dụng postmeta_form_keyshook bạn có thể chỉ định thủ công các phím để tránh gọi hoàn toàn truy vấn không hiệu quả này:

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

Hấp dẫn. Trường hợp này trong mã nguồn tồn tại?
vẩy nến

wp-admin / gồm / template.php: 595 kể từ 4.4
markdwhite

2

Bạn có thể thử cái này không Đây không phải là một giải pháp, mà là một cách giải quyết tạm thời.

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

Loại bỏ các metaboxes cũng ngăn chặn truy vấn chậm.

function remove_metaboxes() {
     remove_meta_box( 'postcustom', 'page', 'normal' );
}
add_action('admin_menu', 'remove_metaboxes');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.