Speed up WordPress CMS Menu Loading


We can customize the WordPress navigation menus with writing few lines of codes.

wp_nav_menu is the WordPress menu function to display custom menus created in domain.com/wp-admin>Appearance>Menus panel . It is a must use function but it’s not perfect for all website or projects. Default menu function OK for small websites but if your site is large and have more traffic with several menus then It may create website speed and performance issues.

What should i do for performance upgrade for wp_nav_menu?

Majority site menu are not updated frequently so its a good idea to cache your menus for long expired period.

How to cache your menu?

If your WordPress version is 3.9+ you can use Transients API and pre_wp_nav_menu. I am not going to write long story here. for your convenience i added my code below.

Please copy this code and past it to you Theme function.php file

* Cache wp_nav_menu to speed up your wordpress blog menus. you can customize this code as your need.

add_filter( 'pre_wp_nav_menu', 'ct_get_nav_menu_cache', 10, 2 );
function ct_get_nav_menu_cache( $nav_menu, $args ) {
    $cache_key      = ct_get_nav_menu_cache_key($args);
    $cached_menu    = get_transient( $cache_key );
    if ( ! empty( $cached_menu ) )
        return $cached_menu;
    return $nav_menu;
add_filter( 'wp_nav_menu', 'ct_set_nav_menu_cache', 10, 2 );
function ct_set_nav_menu_cache( $nav_menu, $args ) {
    $cache_key      = ct_get_nav_menu_cache_key($args);
    set_transient( $cache_key, $nav_menu, 86400 );
    return $nav_menu;
function ct_get_nav_menu_cache_key($args){
    $timestamp = get_transient('nav-menu-cache-timestamp');
    if($time === false){
        $timestamp = time();
        set_transient( 'nav-menu-cache-timestamp', $time, 86400 );
    return apply_filters( 'nav_menu_cache_key' , 'nav-menu-' . md5( serialize( $args ) ) . $timestamp );
// delete the cache when update the menu
add_action( 'wp_update_nav_menu', 'ct_delete_nav_menu_cache' );
function ct_delete_nav_menu_cache( $menu_id, $menu_data){
    set_transient( 'nav-menu-cache-timestamp', time(), 86400 );