I tried this link link
Not working for me.
Any other way to achieve the hole punching.
Finally, I found the solution for this.
Magetno 2 + Varnish = dynamic content
We can achieve hole punch without using
Ajax
In getVaryString method from Magento\Framework\App\Http\Context.
public function getVaryString()
{
$data = $this->getData();
if (!empty($data)) {
if (!empty($this->cookieManager->getCookie('type_po')) && $this->cookieManager->getCookie('type_po') == 1) {
array_push($data, "type", 'access_po');
}
ksort($data);
return sha1(serialize($data));
}
return null;
}
Method return vary string to be used as a part of page cache identifier.
If The Page Cache Identifier already exists, the page render from varnish cache otherwise page rendering newly.
I feel, the answer whatever you have posted is not relevant to your question. Mainly Hole punching is used to make some specific block to show non-cached information which is part of cached page.
Please be clear on your question & answer.
And you can check "sections on magento 2" for achieving hole-punching functionalities.
After going crazy to find a solution for it, finally I got a working solution for Magento 2.3.2 + Varnish + GeoIP. To accomplish it you can use the Cache Context
and Page Variations
which are very simple to implement.
First create a Plugin into your module for Magento\Framework\App\Http\Context
.
File: app/code/Vendor/YourModule/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\App\Http\Context">
<plugin name="atwix_country_cache_context_plugin"
type="Vendor\YourModule\Plugin\CustomerCountryCacheContextPlugin" />
</type>
</config>
Then the Plugin implementation
File: Vendor/YourModule/Plugin/CustomerCountryCacheContextPlugin.php
/**
* Plugin on \Magento\Framework\App\Http\Context
*/
class CustomerCountryCacheContextPlugin
{
public function __construct(
\Magento\Customer\Model\Session $customerSession
) {
$this->customerSession = $customerSession;
}
/**
* \Magento\Framework\App\Http\Context::getVaryString is used by Magento to retrieve unique identifier for selected context,
* so this is a best place to declare custom context variables
*/
function beforeGetVaryString(\Magento\Framework\App\Http\Context $subject)
{
$country = $this->yourWayToGetTheCountry();
$defaultCountryContext = 'Brazil';
$subject->setValue('CONTEXT_AGE', $country, $defaultCountryContext);
}
}
And the last step is to add the X-Magento-Vary
cookie to transfer context on the HTTP layer in your Varnish.
sub vcl_hash {
if (req.http.cookie ~ "X-Magento-Vary=") {
hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
}
... more ...
}
For more info visit:
https://www.atwix.com/magento-2/cache-context-and-page-variations-in-magento-2/