Exclude certain block from caching using Fragment Caching – doesn’t work

I have a one form, and I’m inserting it on page footer from a function file. I need to display a random form to each visitors and thus have a function developed to support this. However, with caching enabled the randomness doesn’t work.

I’m using W3 Total Cache Plugin for caching.

Read More

So here, I need to exclude certain section of code from caching.

I tried to put the function inside Fragment Caching which should do the trick, but it doesn’t.

We need to pass a random integer from a given array and based on that it loads random form in the footer.

Here is a code snippet for you to review:

<!--MFUNC {E7C5F12EBCDA5F83A41BF33D778ED} -->
   <?php
        //echo rand();
        $surveyforms=array("10","11");
        $ra=$surveyforms[array_rand($surveyforms)];
        echo($ra);
    ?>
<!--/mfunc {E7C5F12EBCDA5F83A41BF33D778ED} -->

Just
This should print a random number from an array collection given every time a page is refreshed, however due to cache the result. If we disable caching then it works fine, however as you know caching is very important for performance so we can not disable it.

The same code also moved to the footer.php but doesn’t work there as well.

Any idea, how to use fragment caching on function file? I am fine with any other idea that works.

Looking forward to your response.

Thanks

Related posts

1 comment

  1. From the source:

    Here (source) is the mfunc part in the 0.9.2.9 version of the W3TC plugin where the regular expression is:

    $buffer = preg_replace_callback('~<!--s*mfuncs*' . W3TC_DYNAMIC_SECURITY . '(.*)-->(.*)<!--s*/mfuncs*' . W3TC_DYNAMIC_SECURITY . 's*-->~Uis', array(
                    &$this,
                    '_parse_dynamic_mfunc'
                ), $buffer);
    

    From this it looks like the setup should be

    <!-- mfunc W3TC_DYNAMIC_SECURITY code1-->
    code2
    <!-- /mfunc W3TC_DYNAMIC_SECURITY -->
    

    The mfunc callback is

    function _parse_dynamic_mfunc($matches) {
        $code1 = trim($matches[1]);
        $code2 = trim($matches[2]);
        $code = ($code1 ? $code1 : $code2);
    
        if ($code) {
            $code = trim($code, ';') . ';';
    
            ob_start();
            $result = eval($code);
            $output = ob_get_contents();
            ob_end_clean();
    
            // ... cut ...
    

    so we can see that it uses eval() on the code2 part if the code1 part isn’t set. Checking the PHP manual for this function:

    http://php.net/manual/en/function.eval.php

    it says:

    The code mustn’t be wrapped in opening and closing PHP tags

    Examples:

    So I would think that a working example, where you have

    define('W3TC_DYNAMIC_SECURITY', 'E7C5F12EBCDA5F83A41BF33D778ED' ); 
    

    would look like this (untested) :

    The code1 case:

    <!-- mfunc E7C5F12EBCDA5F83A41BF33D778ED         
        echo "From code1: Here is a random number " . rand(0,1000);
    -->
    <!--/mfunc E7C5F12EBCDA5F83A41BF33D778ED -->
    

    or the code2 case:

    <!-- mfunc E7C5F12EBCDA5F83A41BF33D778ED -->
        echo "From code2: Here is a random number " . rand(0,1000);
    <!--/mfunc E7C5F12EBCDA5F83A41BF33D778ED -->
    

Comments are closed.