Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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.

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

share|improve this question
    
is this still unsolved? –  birgire Jun 10 '13 at 9:32
    
Yes, this is still unresolved. –  Krunal Jun 10 '13 at 10:23
add comment

1 Answer

Here is the mfunc part in the 0.9.2.9 version of the W3TC plugin:

http://plugins.trac.wordpress.org/browser/w3-total-cache/tags/0.9.2.9/lib/W3/PgCache.php#L1386

where the regular expression is:

$buffer = preg_replace_callback('~<!--\s*mfunc\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->(.*)<!--\s*/mfunc\s*' . 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

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

define('W3TC_DYNAMIC_SECURITY', 'E7C5F12EBCDA5F83A41BF33D778ED' ); 

would look like this (untested) :

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

or

<!-- mfunc E7C5F12EBCDA5F83A41BF33D778ED-->
    echo "From code2: Here is a random number " . rand(0,1000);
<!--/mfunc E7C5F12EBCDA5F83A41BF33D778ED -->
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.