Оптимизация WordPress при помощи кэширования меню

На сайтах с большим количеством пунктов в меню создаётся множество ненужных запросов в базу данных, которых можно избежать, если закэшировать всё меню в транзитный кэш.

Решения

Для кэширования меню меню существуют два популярных решения: плагин cache-nav-menus от самих Automattic и плагин Menu Cache от Inpsyde.

Рассмотрим более подробно каждый из них.

Cache Nav Menus

Описание

Этот плагин повышает производительность меню навигации в WordPress двумя способами.

Во-первых, он перехватывает все запросы на генерацию меню и включает внутренний механизм кэширования WP_Query.

Во-вторых, он предоставляет новую функцию wpcom_vip_cached_nav_menu() на замену стандартной wp_nav_menu(), которая оборачивает основную функцию, эффективно кэшируя выходные данные, чтобы уменьшить количество запросов, выполняемых на сайте.

Использование

Для использования всей мощи данного решения устоновите плагин из архива и замените в шаблоне сайте все вызовы wp_nav_menu() на wpcom_vip_cached_nav_menu().

Описание

Функция wp_nav_menu() вызывает функцию _wp_menu_item_classes_by_context(), которая снова и снова, в зависимости от контекста, вызывает функцию wp_get_object_terms(), которая не кэшируется и так происходит несколько раз.

С большим количеством таксономий, терминов в пунктах меню пропорционально растет количество запросов к базе данных.

Этот плагин позволяет вам кэшировать меню (при условии, что они не имеют динамических компонентов) для повторного использования.

Установка

Данный плагин можно установить через Composer, главное, чтобы на сайте был РНР 5.4 и выше:

composer require inpsyde/menu-cache

Использование

После активации плагин автоматически начинает кэшировать все меню по умолчанию на пять минут.

Фильтры

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

Для изменения времени кэширования меню используйте фильтр InpsydeMenuCacheMenuCache::FILTER_EXPIRATION (задаётся в секундах):

add_filter(
    InpsydeMenuCacheMenuCache::FILTER_EXPIRATION,
    function () {
        return 600;
    }
);

Для изменения названия ключа в базе данных используйте фильтр InpsydeMenuCacheMenuCache::FILTER_KEY (можно отдельно для кажлого меню):

add_filter(
    InpsydeMenuCacheMenuCache::FILTER_KEY,
    function ( $key, $args ) {
        return "cached_menu_{$args->theme_location}";
    },
    10,
    2
);

Фильтр InpsydeMenuCacheMenuCache::FILTER_KEY_ARGUMENT позволяет настроить имя аргумента меню, которое используется для хранения ключа меню:

add_filter(
    InpsydeMenuCacheMenuCache::FILTER_KEY_ARGUMENT,
    function () {
        return '_menu_key';
    }
);

Фильтр InpsydeMenuCacheMenuCache::FILTER_SHOULD_CACHE_MENU позволяет настраивать кэширование для каждого меню:

add_filter(
    InpsydeMenuCacheMenuCache::FILTER_SHOULD_CACHE_MENU,
    function ( $should_cache_menu, $args ) {
        // Cache all menus for a bunch of dynamically created theme locations.
        return 0 === strpos( $args->theme_location, 'some_prefix_here_' );
    },
    10,
    2
);

Фильтр InpsydeMenuCacheMenuCache::FILTER_THEME_LOCATIONS позволяет определять местоположения тем, к которым следует применить кэширование:

add_filter(
    InpsydeMenuCacheMenuCache::FILTER_THEME_LOCATIONS,
    function () {
        return 'primary';
    }
);

Cache Nav WordPress Производительность

Источник: https://www.kobzarev.com/wordpress/cache-nav-menus/

Михаил Кобзарёв

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: