Skip to content

Instantly share code, notes, and snippets.

@marcinzaremba
Last active May 27, 2018 04:14
Show Gist options
  • Save marcinzaremba/5673994 to your computer and use it in GitHub Desktop.
Save marcinzaremba/5673994 to your computer and use it in GitHub Desktop.
Primitve cached version of wp_nav_menu
/**
* cached_nav_menu
*
* primitive cache of wp_nav_menu using
* WP Transient APIs
*
* @author Marcin Zaremba
* @param $args arguments passed originally to wp_nav_menu
*/
function cached_nav_menu($args) {
global $wp_query;
// calculating object id and items cached before
$cached_items = unserialize(get_transient('cached_nav_menu'));
$object_id = empty($wp_query->queried_object_id) ? 0 : (int) $wp_query->queried_object_id;
// if its single or main give the same key
if(is_single() || $object_id == 0) {
$object_key = md5(serialize($args) . '- single');
}
else {
$object_key = md5(serialize($args) . '-' . $object_id);
}
// if it's first time cached
if(!$cached_items)
$cached_items = array();
$res = '';
if(isset($cached_items[$object_key])) {
$res = $cached_items[$object_key];
}
else {
// saving to cache
$args['echo'] = false;
$res = wp_nav_menu($args);
$cached_items[$object_key] = $res;
delete_transient('cached_nav_menu');
set_transient('cached_nav_menu', serialize($cached_items));
}
echo $res;
}
/**
* Delete from cache when menu update met
*/
function cached_nav_menu_update() {
delete_transient('cached_nav_menu');
}
add_action('wp_update_nav_menu', 'cached_nav_menu_update');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment