bool wp_cache_add ( int|string $key, mixed $data [, string $flag [, int $expire ]] )
This function is part of the WP Cache system. Its function is to add data to the cache, if the cache key doesn't already exist.
For examples of how to use this function, see the Examples section below.
This function uses PHP function style parameters.
The function returns true on success and false if the cache ID and group already exists.
Placeholder section that would be used with functions that return WP Error objects.
| Version | Description |
|---|---|
| 2.5 | $data filtering is removed. |
| 2.1.1 | $data is filtered through first serialize() and then unserialize(). |
| 2.0.0 | Added to WordPress core. |
There are many examples throughout WordPress' core that use this function. Below are a couple of code selections.
The Function Reference/Category API shows a very good example of using wp_cache_add() in combination with wp_cache_get() to ensure that the expensive queries and data processing to gather all the category IDs only occur once.
Note: The following code was taken from wp-includes/category.php version 2.7.
<code style="color: #000000"><span style="color: #0000BB"><?php
</span><span style="color: #007700">function </span><span style="color: #0000BB">get_all_category_ids</span><span style="color: #007700">() {
if ( ! </span><span style="color: #0000BB">$cat_ids </span><span style="color: #007700">= </span><span style="color: #0000BB">wp_cache_get</span><span style="color: #007700">( </span><span style="color: #DD0000">'all_category_ids'</span><span style="color: #007700">, </span><span style="color: #DD0000">'category' </span><span style="color: #007700">) ) {
</span><span style="color: #0000BB">$cat_ids </span><span style="color: #007700">= </span><span style="color: #0000BB">get_terms</span><span style="color: #007700">( </span><span style="color: #DD0000">'category'</span><span style="color: #007700">, </span><span style="color: #DD0000">'fields=ids&get=all' </span><span style="color: #007700">);
</span><span style="color: #0000BB">wp_cache_add</span><span style="color: #007700">( </span><span style="color: #DD0000">'all_category_ids'</span><span style="color: #007700">, </span><span style="color: #0000BB">$cat_ids</span><span style="color: #007700">, </span><span style="color: #DD0000">'category' </span><span style="color: #007700">);
}
return </span><span style="color: #0000BB">$cat_ids</span><span style="color: #007700">;
}
</span><span style="color: #0000BB">?></span></code>
The code that displays the Recent Entries widget provides a good example of how much code can be skipped by using caching.
Note: The following code was taken from wp-includes/widgets.php version 2.7.
<code style="color: #000000"><span style="color: #0000BB"><?php
</span><span style="color: #007700">function </span><span style="color: #0000BB">wp_widget_recent_entries</span><span style="color: #007700">(</span><span style="color: #0000BB">$args</span><span style="color: #007700">) {
if ( </span><span style="color: #DD0000">'%BEG_OF_TITLE%' </span><span style="color: #007700">!= </span><span style="color: #0000BB">$args</span><span style="color: #007700">[</span><span style="color: #DD0000">'before_title'</span><span style="color: #007700">] ) {
if ( </span><span style="color: #0000BB">$output </span><span style="color: #007700">= </span><span style="color: #0000BB">wp_cache_get</span><span style="color: #007700">(</span><span style="color: #DD0000">'widget_recent_entries'</span><span style="color: #007700">, </span><span style="color: #DD0000">'widget'</span><span style="color: #007700">) )
return print(</span><span style="color: #0000BB">$output</span><span style="color: #007700">);
</span><span style="color: #0000BB">ob_start</span><span style="color: #007700">();
}
</span><span style="color: #0000BB">extract</span><span style="color: #007700">(</span><span style="color: #0000BB">$args</span><span style="color: #007700">);
</span><span style="color: #0000BB">$options </span><span style="color: #007700">= </span><span style="color: #0000BB">get_option</span><span style="color: #007700">(</span><span style="color: #DD0000">'widget_recent_entries'</span><span style="color: #007700">);
</span><span style="color: #0000BB">$title </span><span style="color: #007700">= empty(</span><span style="color: #0000BB">$options</span><span style="color: #007700">[</span><span style="color: #DD0000">'title'</span><span style="color: #007700">]) ? </span><span style="color: #0000BB">__</span><span style="color: #007700">(</span><span style="color: #DD0000">'Recent Posts'</span><span style="color: #007700">) :
</span><span style="color: #0000BB">apply_filters</span><span style="color: #007700">(</span><span style="color: #DD0000">'widget_title'</span><span style="color: #007700">, </span><span style="color: #0000BB">$options</span><span style="color: #007700">[</span><span style="color: #DD0000">'title'</span><span style="color: #007700">]);
if ( !</span><span style="color: #0000BB">$number </span><span style="color: #007700">= (int) </span><span style="color: #0000BB">$options</span><span style="color: #007700">[</span><span style="color: #DD0000">'number'</span><span style="color: #007700">] )
</span><span style="color: #0000BB">$number </span><span style="color: #007700">= </span><span style="color: #0000BB">10</span><span style="color: #007700">;
else if ( </span><span style="color: #0000BB">$number </span><span style="color: #007700">< </span><span style="color: #0000BB">1 </span><span style="color: #007700">)
</span><span style="color: #0000BB">$number </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;
else if ( </span><span style="color: #0000BB">$number </span><span style="color: #007700">> </span><span style="color: #0000BB">15 </span><span style="color: #007700">)
</span><span style="color: #0000BB">$number </span><span style="color: #007700">= </span><span style="color: #0000BB">15</span><span style="color: #007700">;
</span><span style="color: #0000BB">$r </span><span style="color: #007700">= new </span><span style="color: #0000BB">WP_Query</span><span style="color: #007700">(array(</span><span style="color: #DD0000">'showposts' </span><span style="color: #007700">=> </span><span style="color: #0000BB">$number</span><span style="color: #007700">, </span><span style="color: #DD0000">'what_to_show' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'posts'</span><span style="color: #007700">,
</span><span style="color: #DD0000">'nopaging' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #DD0000">'post_status' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'publish'</span><span style="color: #007700">, </span><span style="color: #DD0000">'caller_get_posts' </span><span style="color: #007700">=> </span><span style="color: #0000BB">1</span><span style="color: #007700">));
if (</span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">have_posts</span><span style="color: #007700">()) :
</span><span style="color: #0000BB">?>
</span> <span style="color: #0000BB"><?php </span><span style="color: #007700">echo </span><span style="color: #0000BB">$before_widget</span><span style="color: #007700">; </span><span style="color: #0000BB">?>
</span> <span style="color: #0000BB"><?php </span><span style="color: #007700">if ( !empty( </span><span style="color: #0000BB">$title </span><span style="color: #007700">) ) { echo </span><span style="color: #0000BB">$before_title </span><span style="color: #007700">. </span><span style="color: #0000BB">$title </span><span style="color: #007700">. </span><span style="color: #0000BB">$after_title</span><span style="color: #007700">; } </span><span style="color: #0000BB">?>
</span> <ul>
<span style="color: #0000BB"><?php </span><span style="color: #007700">while (</span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">have_posts</span><span style="color: #007700">()) : </span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">the_post</span><span style="color: #007700">(); </span><span style="color: #0000BB">?>
</span> <li><a href="<span style="color: #0000BB"><?php the_permalink</span><span style="color: #007700">() </span><span style="color: #0000BB">?></span>">
<span style="color: #0000BB"><?php </span><span style="color: #007700">if ( </span><span style="color: #0000BB">get_the_title</span><span style="color: #007700">() ) </span><span style="color: #0000BB">the_title</span><span style="color: #007700">(); else </span><span style="color: #0000BB">the_ID</span><span style="color: #007700">(); </span><span style="color: #0000BB">?>
</span> </a></li>
<span style="color: #0000BB"><?php </span><span style="color: #007700">endwhile; </span><span style="color: #0000BB">?>
</span> </ul>
<span style="color: #0000BB"><?php </span><span style="color: #007700">echo </span><span style="color: #0000BB">$after_widget</span><span style="color: #007700">; </span><span style="color: #0000BB">?>
<?php
wp_reset_query</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Restore global post data stomped by the_post().
</span><span style="color: #007700">endif;
if ( </span><span style="color: #DD0000">'%BEG_OF_TITLE%' </span><span style="color: #007700">!= </span><span style="color: #0000BB">$args</span><span style="color: #007700">[</span><span style="color: #DD0000">'before_title'</span><span style="color: #007700">] )
</span><span style="color: #0000BB">wp_cache_add</span><span style="color: #007700">(</span><span style="color: #DD0000">'widget_recent_entries'</span><span style="color: #007700">, </span><span style="color: #0000BB">ob_get_flush</span><span style="color: #007700">(), </span><span style="color: #DD0000">'widget'</span><span style="color: #007700">);
}
</span><span style="color: #0000BB">?></span></code>