<?php | |
/* | |
Usage: | |
$frag = new CWS_Fragment_Cache( 'unique-key', 3600 ); // Second param is TTL | |
if ( !$frag->output() ) { // NOTE, testing for a return of false | |
functions_that_do_stuff_live(); | |
these_should_echo(); | |
// IMPORTANT | |
$frag->store(); | |
// YOU CANNOT FORGET THIS. If you do, the site will break. | |
} | |
*/ | |
class CWS_Fragment_Cache { | |
const GROUP = 'cws-fragments'; | |
var $key; | |
var $ttl; | |
public function __construct( $key, $ttl ) { | |
$this->key = $key; | |
$this->ttl = $ttl; | |
} | |
public function output() { | |
$output = wp_cache_get( $this->key, self::GROUP ); | |
if ( !empty( $output ) ) { | |
// It was in the cache | |
echo $output; | |
return true; | |
} else { | |
ob_start(); | |
return false; | |
} | |
} | |
public function store() { | |
$output = ob_get_flush(); // Flushes the buffers | |
wp_cache_add( $this->key, $output, self::GROUP, $this->ttl ); | |
} | |
} |
This comment has been minimized.
This comment has been minimized.
I considered that, but there are two problems:
#2 is the big one. I wanted something that I could wrap around existing template code with zero changes to the code inside. If the code inside is using global variables, that will cease working when wrapped in a closure. |
This comment has been minimized.
This comment has been minimized.
What are the pros & cons of using WP object cache vs transients? http://codex.wordpress.org/Transients_API |
This comment has been minimized.
This comment has been minimized.
@astrotim transients will fall back to database caching on installs without a persistent object caching backend. You might want this (caching a feed) or you might not (caching 2000 query results). |
This comment has been minimized.
This comment has been minimized.
@markjaquith Can we use this as a wrapper to an ajax callback? For example, I have an ajax call that does expensive db queries and it returns the results as json for creating a graph via javascript. Could this class be extended or modified to take into account also output that isn't echo'ed but returned? |
This comment has been minimized.
This comment has been minimized.
Have you tested this on WP Multisite? Didn't see any references to multisite in the WP object cache API documentation. |
This comment has been minimized.
This comment has been minimized.
@markjaquith should I wrap add_action() on my genesis theme with this? e.g.
|
This comment has been minimized.
This comment has been minimized.
I used this today and updated it to use transients API. Works like a charm. Thanks. |
This comment has been minimized.
This comment has been minimized.
How to clean individual fragments on, let's say, custom post type save/update? |
This comment has been minimized.
This comment has been minimized.
Hello, i was try but don't know why it not work. |
This comment has been minimized.
@markjaquith It seems there could be a simpler API to do the same thing by using a wrapper function for a closure:
See fork: https://gist.github.com/westonruter/5475349