Admin: Sehr langsame Bearbeitungsseite, verursacht durch core-Meta-Abfrage

Wir haben sehr lange Ladezeiten beim Bearbeiten eines Posts oder einer Seite bemerkt. Mit dem Abfrage-Monitor haben wir festgestellt, dass diese WP-coreabfrage nach oben auf 15-20 Sekunden steigt.

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

Wir verwenden eine Menge postmeta, da einer unserer Beitragstypen etwa 20 benutzerdefinierte Felder verwendet. Ich würde sagen, dass wir uns vielleicht zu sehr auf Postmeta verlassen, aber das scheint eine sehr innecient Abfrage zu sein, da es nicht einmal die ID des Posts auswählt.

Ist das ein häufiges Problem? Gibt es eine Möglichkeit, diese function durch einen Filter zu deaktivieren? Danke für jede Eingabe.

Solutions Collecting From Web of "Admin: Sehr langsame Bearbeitungsseite, verursacht durch core-Meta-Abfrage"

Wenn Sie Ihr benutzerdefiniertes SQL testen möchten, um zu sehen, wie es die Ladezeit beeinflusst, können Sie dieses Abfrage-Swapping ausprobieren:

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

Hier verwenden wir den add_meta_boxes_{$post_type} , wobei $post_type = 'post' .

Hier tauschen wir die gesamte Abfrage aus, aber wir hätten sie auch anpassen können, um das dynamische Limit zu unterstützen.

Hoffentlich können Sie dies Ihren Bedürfnissen anpassen.

Aktualisieren:

Diese möglicherweise langsame SQL-Core-Abfrage wurde nun in WP Version 4.3 von angepasst

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

zu:

 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; 

Weitere Informationen finden Sie im Ticket # 24498 .

Wenn Sie den Quellcode der function durchsuchen, finden Sie Folgendes:

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

Mit dem postmeta_form_keys -Haken können Sie die Schlüssel manuell angeben, um zu vermeiden, dass diese ineffiziente Abfrage vollständig aufgerufen wird:

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

Können Sie das ausprobieren? Dies ist keine Lösung, sondern eine temporäre Problemumgehung.

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

Das Entfernen der Metaboxen verhindert auch die langsame Abfrage.

 function remove_metaboxes() { remove_meta_box( 'postcustom', 'page', 'normal' ); } add_action('admin_menu', 'remove_metaboxes');