$name, 'available' => $available, ); if (!tinv_get_option('integrations', $slug)) { return; } if (!$available) { return; } if (!function_exists('tinvwl_rocket_cache_dynamic_cookies')) { /** * Use dynamic cache with WP Rocket * * @param array $cookies Cookies. * * @return array */ function tinvwl_rocket_cache_dynamic_cookies($cookies = array()) { $cookies[] = 'tinv_wishlistkey'; return $cookies; } } if (!function_exists('tinvwl_rocket_flush')) { /** * Use dynamic cache with WP Rocket * * @param array $cookies Cookies. * * @return array */ function tinvwl_rocket_flush() { if (!function_exists('flush_rocket_htaccess') || !function_exists('rocket_generate_config_file')) { return false; } // Update WP Rocket .htaccess rules. flush_rocket_htaccess(); // Regenerate WP Rocket config file. rocket_generate_config_file(); } } /** * Update WP Rocket config. * */ function tivnwl_wp_rocket() { add_filter('rocket_cache_dynamic_cookies', 'tinvwl_rocket_cache_dynamic_cookies'); add_filter('rocket_htaccess_mod_rewrite', '__return_false'); tinvwl_rocket_flush(); } add_action('tinvwl_flush_rewrite_rules', 'tivnwl_wp_rocket'); add_action('after_rocket_clean_domain', 'tivnwl_wp_rocket'); if (defined('WP_ROCKET_VERSION')) { add_action('tinvwl_product_added', 'tinvwl_rocket_clean_dynamic_cache'); add_action('tinvwl_product_updated', 'tinvwl_rocket_clean_dynamic_cache'); add_action('tinvwl_product_removed', 'tinvwl_rocket_clean_dynamic_cache'); /** * Clean dynamic cache on wishlist events. * */ function tinvwl_rocket_clean_dynamic_cache() { $key = filter_input(INPUT_COOKIE, 'tinv_wishlistkey', FILTER_VALIDATE_REGEXP, array( 'options' => array( 'regexp' => '/^[A-Fa-f0-9]{6}$/', ), )); if (!$key) { return; } $urls = get_rocket_i18n_uri(); if (!$urls) { return; } foreach ($urls as $url) { $directories = glob(WP_ROCKET_CACHE_PATH . rocket_remove_url_protocol($url), GLOB_NOSORT); if ($directories) { foreach ($directories as $dir) { tinvwl_rocket_remove_dir($dir, $key); } } } } /** * Clean only dynamic key cache files. * */ function tinvwl_rocket_remove_dir($dir, $key) { $dirs = glob($dir . '/*', GLOB_NOSORT); if ($dirs) { foreach ($dirs as $dir) { if (rocket_direct_filesystem()->is_dir($dir)) { tinvwl_rocket_remove_dir($dir, $key); } elseif (strpos($dir, $key) !== false) { rocket_direct_filesystem()->delete($dir); } } } } add_action('init', 'tinvwl_rocket_empty_cart'); /** * Prevent cache WooCommerce cart fragments. * */ function tinvwl_rocket_empty_cart() { if ((empty($_COOKIE['woocommerce_cart_hash']) || empty($_COOKIE['woocommerce_items_in_cart'])) && apply_filters('tinvwl_rocket_disable_fragmetns_cache', true)) { $lang = function_exists('rocket_get_current_language') ? rocket_get_current_language() : false; if ($lang) { delete_transient('rocket_get_refreshed_fragments_cache_' . $lang); } delete_transient('rocket_get_refreshed_fragments_cache'); } } add_filter('nonce_user_logged_out', 'tinvwl_revert_uid_for_nonce_actions', 100, 2); /** * Set $user_id to 0 for certain nonce actions. * * WooCommerce core changes how nonces are used for non-logged customers. * When a user is logged out, but has items in their cart, WC core sets the $uid as a random string customer id. * This is going to mess out nonce validation with WP Rocket and third party plugins which do not bypass WC nonce changes. * WP Rocket caches the page so the nonce $uid will be always different than the session customer $uid. * This function will check the nonce against a UID of 0 because this is how WP Rocket generated the cached page. * * * @param string|int $user_id ID of the nonce-owning user. * @param string|int $action The nonce action. * * @return int $uid ID of the nonce-owning user. * */ function tinvwl_revert_uid_for_nonce_actions($user_id, $action) { // User ID is invalid. if (empty($user_id) || 0 === $user_id) { return $user_id; } if (!$action || 'wp_rest' !== $action) { return $user_id; } return 0; } }