WordPress REST API Object Cache
, (*1)
Enable object caching for WordPress' REST API. Aids in increased response times of your applications endpoints., (*2)
Package Installation (via Composer)
To install this package, edit your composer.json
file:, (*3)
{
"require": {
"dwnload/wp-rest-api-object-cache": "^1.3.0"
}
}
Now run:, (*4)
$ composer install dwnload/wp-rest-api-object-cache
, (*5)
Actions
Action |
Argument(s) |
Dwnload\WpRestApi\RestApi\RestDispatch::ACTION_CACHE_SKIPPED |
mixed $result WP_REST_Server $server WP_REST_Request $request
|
Dwnload\WpRestApi\WpAdmin\Admin::ACTION_REQUEST_FLUSH_CACHE |
string $message string $type WP_User $user
|
How to use actions
use Dwnload\WpRestApi\RestApi\RestDispatch;
add_action( RestDispatch::ACTION_CACHE_SKIPPED, function( $result, \WP_REST_Server $server, \WP_REST_Request $request ) {
// Do something here, like create a log entry using Wonolog.
}, 10, 3 );
use Dwnload\WpRestApi\WpAdmin\Admin;
add_action( Admin::ACTION_REQUEST_FLUSH_CACHE, function( $message, $type, WP_User $user ) {
// Do something here, like create a log entry using Wonolog.
}, 10, 3 );
Filters
Filter |
Argument(s) |
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_CACHE_HEADERS |
array $headers string $request_uri WP_REST_Server $server WP_REST_Request $request WP_REST_Response $response (rest_pre_dispatch only)
|
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_CACHE_SKIP |
boolean $skip ( default: WP_DEBUG ) string $request_uri WP_REST_Server $server WP_REST_Request $request
|
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_API_KEY |
string $request_uri WP_REST_Server $server WP_REST_Request $request
|
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_API_GROUP |
string $cache_group
|
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_CACHE_EXPIRE |
int $expires
|
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_CACHE_UPDATE_OPTIONS |
array $options
|
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_CACHE_OPTIONS |
array $options
|
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_SHOW_ADMIN |
boolean $show
|
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_SHOW_ADMIN_MENU |
boolean $show
|
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_SHOW_ADMIN_BAR_MENU |
boolean $show
|
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_ALLOWED_CACHE_STATUS |
array $status HTTP Header statuses (defaults to array( 200 )
|
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_CACHE_VALIDATE_AUTH |
boolean $authenticated WP_REST_Request $request |
How to use filters
Sending headers., (*6)
use Dwnload\WpRestApi\RestApi\RestDispatch;
add_filter( RestDispatch::FILTER_CACHE_HEADERS, function( array $headers ) : array {
$headers['Cache-Control'] = 'public, max-age=3600';
return $headers;
} );
Changing the cache expire time., (*7)
use Dwnload\WpRestApi\RestApi\RestDispatch;
add_filter( RestDispatch::FILTER_CACHE_EXPIRE, function() : int {
// https://codex.wordpress.org/Transients_API#Using_Time_Constants
return ( HOUR_IN_SECONDS * 5 );
} );
use Dwnload\WpRestApi\WpAdmin\Admin;
add_filter( Admin::FILTER_CACHE_OPTIONS, function( array $options ) : array {
if ( ! isset( $options['timeout'] ) ) {
$options['timeout'] = array();
}
// https://codex.wordpress.org/Transients_API#Using_Time_Constants
$options['timeout']['length'] = 15;
$options['timeout']['period'] = DAY_IN_SECONDS;
return $options;
} );
Validating user auth when ?context=edit
, (*8)
use Dwnload\WpRestApi\RestApi\RestDispatch;
add_filter( RestDispatch::FILTER_CACHE_VALIDATE_AUTH, function( bool $auth, WP_REST_Request $request ) : bool {
// If you are running the Basic Auth plugin.
if ( $GLOBALS['wp_json_basic_auth_error'] === true ) {
$authorized = true;
}
// Otherwise, maybe do some additional logic on the request for current user...
return $authorized;
}, 10, 2 );
Skipping cache, (*9)
use Dwnload\WpRestApi\RestApi\RestDispatch;
add_filter( RestDispatch::FILTER_CACHE_SKIP, function( bool $skip, string $request_uri ) : bool {
if ( ! $skip && stripos( 'wp-json/dwnload/v2', $request_uri ) !== false ) {
return true;
}
return $skip;
}, 10, 2 );
Deleting cache, (*10)
Soft delete:
Append RestDispatch::QUERY_CACHE_DELETE
to your query param: add_query_arg( [ RestDispatch::QUERY_CACHE_DELETE, '1' ], '<url>' )
.
soft delete will delete the cache after the current request completes (on WordPress shutdown)., (*11)
Hard delete: Append RestDispatch::QUERY_CACHE_DELETE
&& RestDispatch::QUERY_CACHE_FORCE_DELETE
to your query param:
add_query_arg( [ RestDispatch::QUERY_CACHE_DELETE, '1', RestDispatch::QUERY_CACHE_FORCE_DELETE, '1' ], '<url>' )
.
hard delete will delete the cache before the request, forcing it to repopulate., (*12)
empty ALL cache on post-save this is not ideal, (*13)
You can use the WordPress filter save_post
if you would like to empty ALL cache on post save., (*14)
use Dwnload\WpRestApi\RestApi\RestDispatch;
add_action( 'save_post', function( $post_id ) {
if ( class_exists( RestDispatch::class ) ) {
call_user_func( [ ( WpRestApiCache::getRestDispatch(), 'wpCacheFlush' ] );
}
} );
Maybe better to use transition_post_status
, (*15)
add_action( 'transition_post_status', function( string $new_status, string $old_status, \WP_Post $post ) {
if ( 'publish' === $new_status || 'publish' === $old_status ) {
\wp_cache_flush();
}
}, 99, 3 );