WP REST Cache

Description

Are you facing speed issues, using the WordPress REST API? This plugin will allow WordPress to cache the responses of the REST API, making it much faster.

This plugin offers:

  • Caching of all default WordPress REST API GET-endpoints.
  • Caching of (custom) post type endpoints.
  • Caching of (custom) taxonomy endpoints.
  • Automated flushing of caches if (some of) its contents are edited.
  • Manual flushing of all caches.
  • Manual flushing of specific caches.
  • A counter how many times a cache has been retrieved.
  • Specifying after what time the cache should be timed out.
  • Registering custom endpoints for caching.
  • Automatic cache regeneration.

Installation from within WordPress

  1. Visit ‘Plugins > Add New’ (or ‘My Sites > Network Admin > Plugins > Add New’ if you are on a multisite installation).
  2. Search for ‘WP REST Cache’.
  3. Activate the WP REST Cache plugin through the ‘Plugins’ menu in WordPress.
  4. Go to “after activation” below.

Installation manually

  1. Upload the wp-rest-cache folder to the /wp-content/plugins/ directory.
  2. Activate the WP REST Cache plugin through the ‘Plugins’ menu in WordPress.
  3. Go to “after activation” below.

After activation

  1. Visit ‘Plugins > Must-Use’ (or ‘My Sites > Network Admin > Plugins > Must-Use’ if you are on a multisite installation).
  2. Check if the ‘WP REST Cache – Must-Use Plugin’ is there, if not copy the file wp-rest-cache.php from the /sources folder of the WP REST Cache Plugin to the folder /wp-content/mu-plugins/.

Optionally:
The default timeout for caches generated by the WP REST Cache plugin is set to 1 year. If you want to change this:

  1. Visit ‘Settings > WP REST Cache’.
  2. Change the Cache timeout.

Screenshots

  • Settings for the WP REST Cache plugin.
  • An overview of cached endpoint calls.
  • An overview of cached single items.
  • Cache details page - Cache info.
  • Cache details page - Cache data.

FAQ

I have edited a page/post, do I need to clear the cache?

No, the plugin will automatically flush all cache related to the page/post you just edited.

I have created a custom post type, will the plugin cache the custom post type endpoint?

Yes, the plugin will automatically cache the endpoint of custom post types. Unless you have created a custom WP_REST_Controller for it, then it will not automatically cache the endpoint.

I have created a custom taxonomy, will the plugin cache the taxonomy endpoint?

Yes, the plugin will automatically cache the endpoint of custom taxonomies. Unless you have created a custom WP_REST_Controller for it, then it will not automatically cache the endpoint.

I have created a custom WP REST endpoint, will the plugin cache this endpoint?

No, the plugin will not cache your custom endpoint unless you tell it to cache it using the hook wp_rest_cache/allowed_endpoints (See ‘Can I register my own endpoint for caching?’). Please keep in mind that once you do so the plugin will not automatically flush the cache of that endpoint if something is edited (it has no way of knowing when to flush the cache). It will however try to determine the relations and for the determined relations it will flush the cache automatically once the relation is edited.

Can I register my own endpoint for caching?

Yes you can! Use the hook wp_rest_cache/allowed_endpoints like this:

/**
 * Register the /wp-json/acf/v3/posts endpoint so it will be cached.
 */
function wprc_add_acf_posts_endpoint( $allowed_endpoints ) {
    if ( ! isset( $allowed_endpoints[ 'acf/v3' ] ) || ! in_array( 'posts', $allowed_endpoints[ 'acf/v3' ] ) ) {
        $allowed_endpoints[ 'acf/v3' ][] = 'posts';
    }
    return $allowed_endpoints;
}
add_filter( 'wp_rest_cache/allowed_endpoints', 'wprc_add_acf_posts_endpoint', 10, 1);

Please note: the WP REST Cache plugin will try to detect relations in the cached data to automatically flush the cache when related items are edited, but this detection is not flawless so your caches might not be flushed automatically.

Can I unregister an endpoint so it is no longer cached?

Yes you can! Use the hook wp_rest_cache/allowed_endpoints like this:

/**
 * Unregister the /wp-json/wp/v2/comments endpoint so it will not be cached.
 */
function wprc_unregister_wp_comments_endpoint( $allowed_endpoints ) {
    if ( isset( $allowed_endpoints[ 'wp/v2' ] ) && ( $key = array_search( 'comments', $allowed_endpoints[ 'wp/v2' ] ) ) !== false ) {
        unset( $allowed_endpoints[ 'wp/v2' ][ $key ] );
    }
    return $allowed_endpoints;
}
add_filter( 'wp_rest_cache/allowed_endpoints', 'wprc_unregister_wp_comments_endpoint', 100, 1);

Can I force a call to the REST API to not use caching?

Yes you can! Add the GET-parameter skip_cache=1 to your call and no caching will be used.

On the cache overview page I see the object type is ‘unknown’. Can I help the WP REST Cache plugin to detect the object type correctly?

Yes you can! Use the hook wp_rest_cache/determine_object_type like this:

function wprc_determine_object_type( $object_type, $cache_key, $data, $uri ) {
    if ( $object_type !== 'unknown' || strpos( $uri, $this->namespace . '/' . $this->rest_base ) === false ) {
        return $object_type;
    }
    // Do your magic here
    $object_type = 'website';
    // Do your magic here
    return $object_type;
}
add_filter( 'wp_rest_cache/determine_object_type', 'wprc_determine_object_type', 10, 4 );

Can expired caches be automatically regenerated?

Yes they can! Go to Settings > WP REST Cache, on the Settings tab you can check Enable cache regeneration, this will activate a cron job which will check if there are any expired (or flushed) caches and regenerate them. Using the Regeneration interval you can determine how often this regeneration process should run. The Max number regenerate caches limits the number of regenerated caches per regeneration process, this is so your server doesn’t get flooded with the regeneration calls.

Can I hide the ‘Clear REST cache’ in the wp-admin bar?

Yes you can! Use the hook wp_rest_cache/display_clear_cache_button like this:

function wprc_hide_clear_cache_button( $show ) {
    return true;
}
add_filter('wp_rest_cache/display_clear_cache_button', 'wprc_hide_clear_cache_button', 10, 1);

Can I differentiate between caches based upon request headers?

Yes you can! There are two options for this:
1. Go to Settings > WP REST Cache and add Global cacheable request headers. This is a comma seperated list. These headers will be used for ALL endpoints.
2. Use the hook wp_rest_cache/cacheable_request_headers to specify per endpoint which request headers should be used. Like this:

function wprc_add_cacheable_request_headers( $cacheable_headers ) {
    $cacheable_headers['wp/v2/posts'] = 'LANG';
    return $cacheable_headers;
}
add_filter('wp_rest_cache/cacheable_request_headers', 'wprc_add_cacheable_request_headers', 10, 1);

Can I change which users can change the settings and flush caches?

Yes you can! Use the hook wp_rest_cache/settings_capability like this:

function wprc_change_settings_capability( $capability ) {
    // Change the capability to users who can edit posts.
    return 'edit_posts';
}
add_filter('wp_rest_cache/settings_capability', 'wprc_change_settings_capability', 10, 1);

Reviews

October 22, 2020
I have been using this plugin on a few projects and it has been extremely useful, but recently I came across a few more complicated scenarios I needed to cater for and the plugin author has been extremely helpful in discussing the extra config that I needed. Definitely recommend.
September 22, 2020
Nobody wants a slow application. What better place to start than the REST API. Because if that is slow imagine what happens when javascript loads are added on top. I did some performance test with small jsons and custom endpoints. It cuts loading time about in half. Thanks acato.
September 7, 2020
This plugin is really awesome! We use REST-API for our Android and iOS apps to get posts, etc., without caching this costs a lot of CPU. With this plugin it takes NO CPU and it's really fast! Thanks guys!
February 23, 2020
Well made plugin, working great for all kinds of custom rest api endpoints, solid filters. Bets I have tried by far for this task!
Read all 22 reviews

Contributors & Developers

“WP REST Cache” is open source software. The following people have contributed to this plugin.

Contributors

Translate “WP REST Cache” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

2020.3.1

Release Date: October 19th, 2020

Bugfix: Not all caches were flushed correctly after last update.

2020.3.0

Release Date: October 12th, 2020

Improvement: Cleanup of legacy code.
Feature: Added the option to filter the cache timeout per cache.

2020.2.2

Release Date: September 7th, 2020

Bugfix: Conflict when caching two calls with same url but different request method.
Bugfix: Bulk actions were broken.

2020.2.1

Release Date: July 14th, 2020

Bugfix: WordPress bug caused screen options to not work correctly anymore.

2020.2.0

Release Date: July 2nd, 2020

Improvement: Speed up cache clearing.
Feature: Added filter for programmatically skip caching.
Feature: Added filter to disable cache hit recording.
Feature: Added option to delete all caches (vs flush all caches).
Bugfix: Do not cache API calls with a nonce.
Bugfix: Fix for not caching when there are double slashes in the request path.
Bugfix: Fix persisting the search when searching through caches.

2020.1.1

Release Date: March 12th, 2020

Bugfix: Allow usage of rest_route parameter.
Bugfix: WordPress database error: specified key was too long.

2020.1.0

Release Date: January 16th, 2020

Feature: Added a filter to ignore specific query string parameters.
Feature: Make allowed request methods filterable.
Bugfix: Make options not autoload.

2019.4.5

Release Date: November 22nd, 2019

Bugfix: Do not update database table on each load.
Bugfix: WordPress database error: specified key was too long.

2019.4.4

Release Date: November 14th, 2019

Hotfix: Fixing WordPress database error.

2019.4.3

Release Date: November 12th, 2019

Feature: Added filter for Settings page capability.
Bugfix: Problem with non-existing tables after multisite duplication.

2019.4.2

Release Date: October 15th, 2019

Bugfix: Prevent fatal error after WordPress security update.

2019.4.1

Release Date: September 5th, 2019

Feature: Flush caches with progressbar and through ajax call to prevent timeout.
Bugfix: Expiration date was displayed incorrectly.
Bugfix: Do not cache empty result set.
Bugfix: Do not use filter_input with INPUT_SERVER, it will break when fastcgi is used (see https://stackoverflow.com/questions/25232975/php-filter-inputinput-server-request-method-returns-null/36205923).

2019.4.0

Release Date: July 12th, 2019

Feature: Added option to differentiate between caches based upon certain request headers.
Feature: Added option to hide the ‘Clear cache’ button in the wp-admin bar.
Bugfix: Fix for when WordPress is installed in a subdirectory.
Bugfix: Remove Item Caching, it was causing more problems and complexity than it was improving performance.

2019.3.0

Release Date: June 18th, 2019

Improvement: Meet WordPress Coding Standards.
Feature: Added expired caches regeneration cron.
Bugfix: Added fallback check for Memcache(d). Memcache(d) treats a transient timeout > 30 days as a timestamp.

2019.2.1

Release Date: April 15th, 2019

Feature: Added option to skip cache using a parameter.

2019.2.0

Release Date: April 2nd, 2019

Feature: Added function to programatically flush cache records by endpoint path.
Bugfix: Fix correct filtering of allowed endpoints.
Bugfix: Fix fatal error with object in stead of array in cache.

2019.1.6

Release Date: March 25th, 2019

Feature: Added filters for response header manipulation.

2019.1.4

Release Date: March 21st, 2019

Bugfix: bug in saving relations for comments endpoint prevented the cache for comments to be flushed automatically.

2019.1.3

Release Date: February 13th, 2019

Feature: Added support for correctly flushing caches of scheduled posts.

2019.1.2

Release Date: January 31st, 2019

First public version.