WordPress как на ладони
wordpress jino

WordPress и meta_form() на странице редактирования записи

Здравствуйте!

У меня на сайте больше 10.000 записей и ~100.000 доп. полей, в результате при заходе в меню редактирования записи WordPress выводит все кастомные поля поста (meta_form())

В результате вылезает такая картина:

# Query_time: 0.746003  Lock_time: 0.000072 Rows_sent: 22  Rows_examined: 96794
SET timestamp=1456433729;
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;

т.е. запрос обрабатывается 0.7 сек.

Погуглив я нашел такую функцию:

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

Но она к сожалению не работает. Т.е. не идет почему-то замена sql запроса. Сам 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

Если подставить вместо $post_id ID поста - запрос занимает 0.0018 сек.

Вопрос: Почему функция не работает, может кто-то может исправить в ней ошибку / недоработку или предложить альтернативный вариант?

Пока что я тупо удалил этот метабокс через:

 remove_meta_box( 'postcustom', 'post', 'normal' );
Preci 1.6 года назад

Да, функцию нашел тут:

http://wordpress.stackexchange.com/questions/187612/admin-very-slow-edit-page-caused-by-core-meta-query

Там автор написал:

Update:
This potentially slow SQL core query, has now been adjusted in WP version 4.3 from

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

to:

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;

Но я хз как там они в wordpress работают и тестируют, их обновление sql в версии 4.3 картины не изменило (у меня последний wordpress если что)

0
Preci2 1.6 года назад

Нет ответов на этот вопрос.

На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.