/home/arranoyd/energyclinic.com.hr/wp-content/plugins/docket-cache/includes/src/MenuCache.php
<?php
/**
* Docket Cache.
*
* @author Nawawi Jamili
* @license MIT
*
* @see https://github.com/nawawi/docket-cache
*/
namespace Nawawi\DocketCache;
\defined('ABSPATH') || exit;
final class MenuCache
{
public function register()
{
if ($this->is_front_end()) {
add_action(
'init',
function () {
add_filter('pre_wp_nav_menu', [$this, 'pre_wp_nav_menu'], \PHP_INT_MAX, 2);
add_filter('wp_nav_menu', [$this, 'wp_nav_menu'], \PHP_INT_MAX, 2);
},
\PHP_INT_MAX
);
}
add_action(
'admin_init',
function () {
add_action('wp_update_nav_menu', [$this, 'wp_update_nav_menu'], \PHP_INT_MAX);
add_action('wp_delete_nav_menu', [$this, 'wp_update_nav_menu'], \PHP_INT_MAX);
add_filter('pre_set_theme_mod_nav_menu_locations', [$this, 'pre_set_theme_mod_nav_menu_locations'], \PHP_INT_MAX, 2);
},
\PHP_INT_MAX
);
}
private function is_front_end()
{
if (!is_admin()
&& (!\defined('WP_CLI') || !WP_CLI)
&& (!\defined('DOING_AJAX') || !DOING_AJAX)) {
return true;
}
if (!empty($_SERVER['REQUEST_URI']) && \function_exists('rest_get_url_prefix')) {
$rest_prefix = rest_get_url_prefix();
return substr($_SERVER['REQUEST_URI'], 1, \strlen($rest_prefix)) === $rest_prefix;
}
return false;
}
private function normalize_menu_object(&$args)
{
$menu = wp_get_nav_menu_object($args->menu);
$locations = get_nav_menu_locations();
if (!$menu && $args->theme_location && $locations && isset($locations[$args->theme_location])) {
$menu = wp_get_nav_menu_object($locations[$args->theme_location]);
}
if (!$menu && !$args->theme_location) {
$menus = wp_get_nav_menus();
foreach ($menus as $menu_maybe) {
$menu_items = wp_get_nav_menu_items($menu_maybe->term_id, ['update_post_term_cache' => false]);
if ($menu_items) {
$menu = $menu_maybe;
break;
}
}
}
if (empty($args->menu) || is_numeric($args->menu)) {
$args->menu = $menu;
}
}
private function set_key($args)
{
return md5(wp_json_encode($args));
}
private function get_key($menu_key)
{
return 'docketcache-menu-'.$menu_key;
}
private function get_cache($menu_key)
{
return wp_cache_get($this->get_key($menu_key), 'docketcache-menu');
}
private function navmenu_flush_cache()
{
if (\function_exists('wp_cache_flush_group')) {
wp_cache_flush_group('docketcache-menu');
}
}
public function pre_wp_nav_menu($output, $args)
{
$this->normalize_menu_object($args);
if (isset($args->menu->term_id)) {
$menu_key = $this->set_key($args);
if ($cached_output = $this->get_cache($menu_key)) {
if (nwdcx_construe('SIGNATURE')) {
$cached_output .= '<!-- This menu is cached by Docket Cache -->'.\PHP_EOL;
}
return $cached_output;
}
}
return $output;
}
public function wp_nav_menu($nav_menu, $args)
{
if (false !== strpos($nav_menu, 'no-cache')) {
return $nav_menu;
}
if (isset($args->menu->term_id)) {
$menu_key = $this->set_key($args);
$cache_ttl = nwdcx_constval('MENUCACHE_TTL');
if (empty($cache_ttl) || !\is_int($cache_ttl)) {
$cache_ttl = 1209600; // 14 days
}
wp_cache_set($this->get_key($menu_key), $nav_menu, 'docketcache-menu', $cache_ttl);
}
return $nav_menu;
}
public function wp_update_nav_menu($menu_id)
{
$this->navmenu_flush_cache();
}
public function pre_set_theme_mod_nav_menu_locations($new, $old)
{
$this->navmenu_flush_cache();
return $new;
}
}