Оптимизируем запросы в WordPress

По умолчанию вордпресс стремиться быть настолько универсальным, насколько это требуется для неподготовленного пользователя. Все должно работать предсказуемо и прямо из коробки, без настроек. Однако, для использования движка вордпресса для чего-то большего, чем просто личный блог, требуется его серьезно оптимизировать.

Делаем выборку только нужных полей

Каждый запрос постов в вордпрессе вытягивает всю возможную информацию, включая его заголовок, содержание, аннотацию, время создания и изменения, количество комментариев… как правило, большая часть этой информации просто ненужна!

Например, на одном из сайтов на главной странице отображались 18 последних публикаций в виде миниатюр с заголовками и ссылками на страницы с контентом, всю остальную информацию я исключил из запроса, добавив следующий код в functions.php:

[php]add_filter( ‘posts_clauses’, ‘theme_posts_clauses’, 10, 2 );
function theme_posts_clauses( $clauses, $query ) {
global $wpdb;

// Не используем в админке
if ( is_admin() )
return;

// Если мы на главной – указываем нужные поля
if ( $query->is_home() ) {
$clauses[‘fields’] = "$wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.post_name, $wpdb->posts.post_type";
}

return $clauses;
}[/php]

В данном случае я забираю из базы ID поста, его заголовок, короткое имя и тип записи. Далее, в шаблоне index.php запускается стандартный цикл. Благодаря тому, что из базы мы вытащили $wpdb->posts.post_title, $wpdb->posts.post_name и $wpdb->posts.post_type, появилась возможность использовать функцию the_permalink() для получения ссылки на пост.

Список всех полей в таблице постов можно найти в Кодексе.

Отключаем постраничную навигацию

В каждом запросе вордпресс указывает опцию SQL_CALC_FOUND_ROWS для того, чтобы знать сколько всего подходящих под условие записей есть в базе данных, даже если запрос ограничен лимитом. Это удобно для построения постраничной навигации, которая не всегда нужна на странице, особенно если это полноценный сайт, а не маленький блог.

Дело в том, что SQL_CALC_FOUND_ROWS значительно замедляет выполнение запроса, а значит его стоит убрать там, где постраничная навигация не нужна, например на главной странице.

Вордпресс предусмотрел отключение данной опциив классе WP_Query (который используется для выполнения любой выборки из БД), достаточно установить аргумент no_found_rows в true, например, добавив следующий код в functions.php:

[php]add_action( ‘pre_get_posts’, ‘theme_pre_get_posts’ );
function theme_pre_get_posts( $query ) {

// Не используем в админке
if ( is_admin() )
return;

// Отключаем SQL_CALC_FOUND_ROWS на главной
if ( $query->is_home() ) {
$query->set( ‘no_found_rows’, true );
}

}[/php]

Отключаем кеширование произвольных полей и термов

Вордпресс стремиться закешировать произвольные поля и термы (категории, теги и произвольные таксономии) и работать с ними из кеша. Если нигде в цикле вывода записей вы не используете термы и произвольные поля, то их кеширование следует отключить, что немного ускорит выполнение скрипта. Добавьте в functions.php следующий код:

[php]add_action( ‘pre_get_posts’, ‘theme_pre_get_posts’ );
function theme_pre_get_posts( $query ) {

// Не используем в админке
if ( is_admin() )
return;

// Отключаем кеширование термов и произвольных полей на главной
if ( $query->is_home() ) {
$query->set( ‘update_post_meta_cache’, false );
$query->set( ‘update_post_term_cache’, false );
}

}[/php]