Кэширование меню (wp_nav_menu) в кэш объектов
Код ниже показывает как можно кэшировать весь код меню в объектный кэш. Кэш будет сбрасываться при обновлении меню. Кэширование будет работать для всех меню.
GitHub<?php Pj_Cached_Nav_Menus::load(); /** * Caches calls to wp_nav_menu(). */ class Pj_Cached_Nav_Menus { public static $ttl = 3600; // use 0 to cache forever (until nav menu update) public static $cache_menus = array(); public static function load() { add_filter( 'pre_wp_nav_menu', array( __CLASS__, 'pre_wp_nav_menu' ), 10, 2 ); add_filter( 'wp_nav_menu', array( __CLASS__, 'maybe_cache_nav_menu' ), 10, 2 ); add_action( 'wp_update_nav_menu', array( __CLASS__, 'clear_caches' ) ); } private static function _cache_key( $args ) { $_args = (array) $args; unset( $_args['menu'] ); return 'pj-cached-nav-menu:' . md5( json_encode( $_args ) ); } private static function _timestamp() { static $timestamp; if ( ! isset( $timestamp ) ) $timestamp = get_option( 'pj-cached-nav-menus-timestamp', 0 ); return $timestamp; } public static function pre_wp_nav_menu( $output, $args ) { if ( ! empty( $args->menu ) ) return $output; $cache_key = self::_cache_key( $args ); self::$cache_menus[] = $cache_key; $cache = get_transient( $cache_key ); if ( is_array( $cache ) && $cache['timestamp'] >= self::_timestamp() ) { $output = $cache['html'] . '<!-- pj-cached-nav-menu -->'; } return $output; } public static function maybe_cache_nav_menu( $html, $args ) { $cache_key = self::_cache_key( $args ); if ( ! in_array( $cache_key, self::$cache_menus ) ) return $html; $cache = array( 'html' => $html, 'timestamp' => time(), ); set_transient( $cache_key, $cache, self::$ttl ); return $html; } public static function clear_caches() { update_option( 'pj-cached-nav-menus-timestamp', time() ); } }
Оригинальный код: https://github.com/pressjitsu/cached-nav-menus
Композер пакет: https://github.com/inpsyde/menu-cache Статья по нему: https://www.kobzarev.com/wordpress/cache-nav-menus/
Другой аналогичный пример: https://www.bjornjohansen.com/wordpress-menu-cache
—
Эта заметка встроена в: wp_nav_menu()